@helyx/cli 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/self-host/catalogue.d.ts +10 -4
- package/dist/self-host/catalogue.js +23 -2
- package/dist/self-host/manifest.js +5 -2
- package/package.json +3 -3
- package/self-host-catalogue.json +67 -39
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Add explicit Planned, Testing, Beta and Live module lifecycle metadata.
|
|
8
|
+
|
|
9
|
+
Propagate lifecycle status through the hosted control contract and permit only
|
|
10
|
+
Live modules in hosted distributions and generated self-host projects.
|
|
11
|
+
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @helyx/bot@0.2.1
|
|
14
|
+
|
|
15
|
+
## 0.2.1
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Generate self-hosted projects with the published Cloud Connect-capable Bot and refreshed official module versions.
|
|
20
|
+
|
|
3
21
|
## 0.2.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const selfHostCategories: readonly ["Community", "Safety", "Support", "Automation", "Engagement", "Insights", "Integrations"];
|
|
3
|
+
export declare const selfHostReleaseStatusSchema: z.ZodEnum<{
|
|
4
|
+
planned: "planned";
|
|
5
|
+
testing: "testing";
|
|
6
|
+
beta: "beta";
|
|
7
|
+
live: "live";
|
|
8
|
+
}>;
|
|
3
9
|
export declare const selfHostModuleSchema: z.ZodObject<{
|
|
4
10
|
id: z.ZodString;
|
|
5
11
|
package: z.ZodString;
|
|
@@ -20,12 +26,12 @@ export declare const selfHostModuleSchema: z.ZodObject<{
|
|
|
20
26
|
unpublished: "unpublished";
|
|
21
27
|
published: "published";
|
|
22
28
|
}>;
|
|
23
|
-
releaseStatus: z.
|
|
29
|
+
releaseStatus: z.ZodEnum<{
|
|
24
30
|
planned: "planned";
|
|
25
31
|
testing: "testing";
|
|
26
32
|
beta: "beta";
|
|
27
33
|
live: "live";
|
|
28
|
-
}
|
|
34
|
+
}>;
|
|
29
35
|
tier: z.ZodOptional<z.ZodEnum<{
|
|
30
36
|
free: "free";
|
|
31
37
|
premium: "premium";
|
|
@@ -71,12 +77,12 @@ export declare const selfHostCatalogueSchema: z.ZodObject<{
|
|
|
71
77
|
unpublished: "unpublished";
|
|
72
78
|
published: "published";
|
|
73
79
|
}>;
|
|
74
|
-
releaseStatus: z.
|
|
80
|
+
releaseStatus: z.ZodEnum<{
|
|
75
81
|
planned: "planned";
|
|
76
82
|
testing: "testing";
|
|
77
83
|
beta: "beta";
|
|
78
84
|
live: "live";
|
|
79
|
-
}
|
|
85
|
+
}>;
|
|
80
86
|
tier: z.ZodOptional<z.ZodEnum<{
|
|
81
87
|
free: "free";
|
|
82
88
|
premium: "premium";
|
|
@@ -23,7 +23,12 @@ const moduleId = z
|
|
|
23
23
|
.string()
|
|
24
24
|
.regex(/^helyx\.[a-z0-9][a-z0-9-]*$/u, "must be a Helyx module ID");
|
|
25
25
|
const availability = z.enum(["planned", "unpublished", "published"]);
|
|
26
|
-
const
|
|
26
|
+
export const selfHostReleaseStatusSchema = z.enum([
|
|
27
|
+
"planned",
|
|
28
|
+
"testing",
|
|
29
|
+
"beta",
|
|
30
|
+
"live",
|
|
31
|
+
]);
|
|
27
32
|
const moduleTier = z.enum(["free", "premium"]);
|
|
28
33
|
const componentSchema = z
|
|
29
34
|
.object({
|
|
@@ -49,7 +54,7 @@ export const selfHostModuleSchema = z
|
|
|
49
54
|
description: z.string().trim().min(1).max(300),
|
|
50
55
|
category: z.enum(selfHostCategories),
|
|
51
56
|
availability,
|
|
52
|
-
releaseStatus:
|
|
57
|
+
releaseStatus: selfHostReleaseStatusSchema,
|
|
53
58
|
tier: moduleTier.optional(),
|
|
54
59
|
})
|
|
55
60
|
.strict()
|
|
@@ -68,6 +73,22 @@ export const selfHostModuleSchema = z
|
|
|
68
73
|
message: "must be exact semver for an implemented module",
|
|
69
74
|
});
|
|
70
75
|
}
|
|
76
|
+
if (module.releaseStatus === "live" &&
|
|
77
|
+
(module.availability !== "published" || module.version === null)) {
|
|
78
|
+
context.addIssue({
|
|
79
|
+
code: "custom",
|
|
80
|
+
path: ["releaseStatus"],
|
|
81
|
+
message: "live modules must have an exact published version",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (module.releaseStatus === "planned" &&
|
|
85
|
+
module.availability !== "planned") {
|
|
86
|
+
context.addIssue({
|
|
87
|
+
code: "custom",
|
|
88
|
+
path: ["releaseStatus"],
|
|
89
|
+
message: "planned modules cannot be published",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
71
92
|
});
|
|
72
93
|
export const selfHostCatalogueSchema = z
|
|
73
94
|
.object({
|
|
@@ -62,8 +62,10 @@ export function createSelfHostBuildManifest(catalogue, selectedModuleIds) {
|
|
|
62
62
|
const module = byId.get(id);
|
|
63
63
|
if (!module)
|
|
64
64
|
throw new Error(`Unknown self-host module: ${id}`);
|
|
65
|
-
if (module.availability !== "published" ||
|
|
66
|
-
|
|
65
|
+
if (module.availability !== "published" ||
|
|
66
|
+
module.releaseStatus !== "live" ||
|
|
67
|
+
module.version === null) {
|
|
68
|
+
throw new Error(`Self-host module is not live: ${id}`);
|
|
67
69
|
}
|
|
68
70
|
return {
|
|
69
71
|
id: module.id,
|
|
@@ -99,6 +101,7 @@ export function parseSelfHostBuildManifest(input, catalogue) {
|
|
|
99
101
|
const module = byId.get(selected.id);
|
|
100
102
|
if (!module ||
|
|
101
103
|
module.availability !== "published" ||
|
|
104
|
+
module.releaseStatus !== "live" ||
|
|
102
105
|
module.version === null ||
|
|
103
106
|
module.package !== selected.package ||
|
|
104
107
|
module.version !== selected.version) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helyx/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Command-line tools for running and generating self-hosted Helyx deployments.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"helyx",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"build": "tsc -b"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@helyx/bot": "0.2.
|
|
56
|
-
"@helyx/config": "0.2.
|
|
55
|
+
"@helyx/bot": "0.2.1",
|
|
56
|
+
"@helyx/config": "0.2.1",
|
|
57
57
|
"@helyx/database": "0.2.0",
|
|
58
58
|
"semver": "7.8.5",
|
|
59
59
|
"zod": "4.4.3"
|
package/self-host-catalogue.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"catalogueVersion":
|
|
3
|
+
"catalogueVersion": 10,
|
|
4
4
|
"core": {
|
|
5
5
|
"package": "@helyx/bot",
|
|
6
|
-
"version": "0.1
|
|
6
|
+
"version": "0.2.1",
|
|
7
7
|
"availability": "published"
|
|
8
8
|
},
|
|
9
9
|
"generator": {
|
|
10
10
|
"package": "@helyx/cli",
|
|
11
|
-
"version": "0.
|
|
11
|
+
"version": "0.2.2",
|
|
12
12
|
"command": "helyx",
|
|
13
13
|
"availability": "published"
|
|
14
14
|
},
|
|
@@ -16,29 +16,32 @@
|
|
|
16
16
|
{
|
|
17
17
|
"id": "helyx.feedback",
|
|
18
18
|
"package": "@helyx/module-feedback",
|
|
19
|
-
"version": "1.0.
|
|
19
|
+
"version": "1.0.5",
|
|
20
20
|
"name": "Feedback",
|
|
21
|
-
"description": "
|
|
21
|
+
"description": "Collects simple feedback from Discord server members.",
|
|
22
22
|
"category": "Community",
|
|
23
|
-
"availability": "published"
|
|
23
|
+
"availability": "published",
|
|
24
|
+
"releaseStatus": "live"
|
|
24
25
|
},
|
|
25
26
|
{
|
|
26
27
|
"id": "helyx.welcome",
|
|
27
28
|
"package": "@helyx/module-welcome",
|
|
28
|
-
"version": "1.0.
|
|
29
|
+
"version": "1.0.5",
|
|
29
30
|
"name": "Welcome",
|
|
30
|
-
"description": "
|
|
31
|
+
"description": "Greets new members and can give them a starting role.",
|
|
31
32
|
"category": "Community",
|
|
32
|
-
"availability": "published"
|
|
33
|
+
"availability": "published",
|
|
34
|
+
"releaseStatus": "live"
|
|
33
35
|
},
|
|
34
36
|
{
|
|
35
37
|
"id": "helyx.suggestions",
|
|
36
38
|
"package": "@helyx/module-suggestions",
|
|
37
|
-
"version": "1.0.
|
|
39
|
+
"version": "1.0.5",
|
|
38
40
|
"name": "Suggestions",
|
|
39
|
-
"description": "
|
|
41
|
+
"description": "Collects community ideas with configurable reaction or button voting.",
|
|
40
42
|
"category": "Community",
|
|
41
|
-
"availability": "published"
|
|
43
|
+
"availability": "published",
|
|
44
|
+
"releaseStatus": "live"
|
|
42
45
|
},
|
|
43
46
|
{
|
|
44
47
|
"id": "helyx.polls",
|
|
@@ -47,7 +50,8 @@
|
|
|
47
50
|
"name": "Polls",
|
|
48
51
|
"description": "Run clear single or multiple-choice polls.",
|
|
49
52
|
"category": "Community",
|
|
50
|
-
"availability": "planned"
|
|
53
|
+
"availability": "planned",
|
|
54
|
+
"releaseStatus": "planned"
|
|
51
55
|
},
|
|
52
56
|
{
|
|
53
57
|
"id": "helyx.starboard",
|
|
@@ -56,7 +60,8 @@
|
|
|
56
60
|
"name": "Starboard",
|
|
57
61
|
"description": "Highlight messages your community values.",
|
|
58
62
|
"category": "Community",
|
|
59
|
-
"availability": "planned"
|
|
63
|
+
"availability": "planned",
|
|
64
|
+
"releaseStatus": "planned"
|
|
60
65
|
},
|
|
61
66
|
{
|
|
62
67
|
"id": "helyx.levels",
|
|
@@ -65,7 +70,8 @@
|
|
|
65
70
|
"name": "Levels",
|
|
66
71
|
"description": "Optional participation levels and rewards.",
|
|
67
72
|
"category": "Community",
|
|
68
|
-
"availability": "planned"
|
|
73
|
+
"availability": "planned",
|
|
74
|
+
"releaseStatus": "planned"
|
|
69
75
|
},
|
|
70
76
|
{
|
|
71
77
|
"id": "helyx.moderation",
|
|
@@ -74,7 +80,8 @@
|
|
|
74
80
|
"name": "Moderation",
|
|
75
81
|
"description": "Warnings, timeouts, kicks and bans with audit context.",
|
|
76
82
|
"category": "Safety",
|
|
77
|
-
"availability": "planned"
|
|
83
|
+
"availability": "planned",
|
|
84
|
+
"releaseStatus": "planned"
|
|
78
85
|
},
|
|
79
86
|
{
|
|
80
87
|
"id": "helyx.automod",
|
|
@@ -83,7 +90,8 @@
|
|
|
83
90
|
"name": "Auto moderation",
|
|
84
91
|
"description": "Apply transparent rules to spam and unsafe content.",
|
|
85
92
|
"category": "Safety",
|
|
86
|
-
"availability": "planned"
|
|
93
|
+
"availability": "planned",
|
|
94
|
+
"releaseStatus": "planned"
|
|
87
95
|
},
|
|
88
96
|
{
|
|
89
97
|
"id": "helyx.verification",
|
|
@@ -103,7 +111,8 @@
|
|
|
103
111
|
"name": "Raid protection",
|
|
104
112
|
"description": "Detect and slow unusual join activity.",
|
|
105
113
|
"category": "Safety",
|
|
106
|
-
"availability": "planned"
|
|
114
|
+
"availability": "planned",
|
|
115
|
+
"releaseStatus": "planned"
|
|
107
116
|
},
|
|
108
117
|
{
|
|
109
118
|
"id": "helyx.tickets",
|
|
@@ -112,7 +121,8 @@
|
|
|
112
121
|
"name": "Tickets",
|
|
113
122
|
"description": "Private support requests with ownership and transcripts.",
|
|
114
123
|
"category": "Support",
|
|
115
|
-
"availability": "planned"
|
|
124
|
+
"availability": "planned",
|
|
125
|
+
"releaseStatus": "planned"
|
|
116
126
|
},
|
|
117
127
|
{
|
|
118
128
|
"id": "helyx.forms",
|
|
@@ -121,7 +131,8 @@
|
|
|
121
131
|
"name": "Forms",
|
|
122
132
|
"description": "Collect structured requests through Discord modals.",
|
|
123
133
|
"category": "Support",
|
|
124
|
-
"availability": "planned"
|
|
134
|
+
"availability": "planned",
|
|
135
|
+
"releaseStatus": "planned"
|
|
125
136
|
},
|
|
126
137
|
{
|
|
127
138
|
"id": "helyx.faq",
|
|
@@ -130,7 +141,8 @@
|
|
|
130
141
|
"name": "Knowledge base",
|
|
131
142
|
"description": "Answer common questions with maintained server guidance.",
|
|
132
143
|
"category": "Support",
|
|
133
|
-
"availability": "planned"
|
|
144
|
+
"availability": "planned",
|
|
145
|
+
"releaseStatus": "planned"
|
|
134
146
|
},
|
|
135
147
|
{
|
|
136
148
|
"id": "helyx.autoroles",
|
|
@@ -139,7 +151,8 @@
|
|
|
139
151
|
"name": "Auto roles",
|
|
140
152
|
"description": "Assign appropriate roles when members join.",
|
|
141
153
|
"category": "Automation",
|
|
142
|
-
"availability": "planned"
|
|
154
|
+
"availability": "planned",
|
|
155
|
+
"releaseStatus": "planned"
|
|
143
156
|
},
|
|
144
157
|
{
|
|
145
158
|
"id": "helyx.reactionroles",
|
|
@@ -148,7 +161,8 @@
|
|
|
148
161
|
"name": "Self roles",
|
|
149
162
|
"description": "Let members select approved roles themselves.",
|
|
150
163
|
"category": "Automation",
|
|
151
|
-
"availability": "planned"
|
|
164
|
+
"availability": "planned",
|
|
165
|
+
"releaseStatus": "planned"
|
|
152
166
|
},
|
|
153
167
|
{
|
|
154
168
|
"id": "helyx.reminders",
|
|
@@ -157,7 +171,8 @@
|
|
|
157
171
|
"name": "Reminders",
|
|
158
172
|
"description": "Schedule personal and server reminders.",
|
|
159
173
|
"category": "Automation",
|
|
160
|
-
"availability": "planned"
|
|
174
|
+
"availability": "planned",
|
|
175
|
+
"releaseStatus": "planned"
|
|
161
176
|
},
|
|
162
177
|
{
|
|
163
178
|
"id": "helyx.tempvoice",
|
|
@@ -166,7 +181,8 @@
|
|
|
166
181
|
"name": "Temporary voice",
|
|
167
182
|
"description": "Create voice rooms that clean themselves up.",
|
|
168
183
|
"category": "Automation",
|
|
169
|
-
"availability": "planned"
|
|
184
|
+
"availability": "planned",
|
|
185
|
+
"releaseStatus": "planned"
|
|
170
186
|
},
|
|
171
187
|
{
|
|
172
188
|
"id": "helyx.scheduler",
|
|
@@ -175,7 +191,8 @@
|
|
|
175
191
|
"name": "Scheduler",
|
|
176
192
|
"description": "Run approved messages and actions on a schedule.",
|
|
177
193
|
"category": "Automation",
|
|
178
|
-
"availability": "planned"
|
|
194
|
+
"availability": "planned",
|
|
195
|
+
"releaseStatus": "planned"
|
|
179
196
|
},
|
|
180
197
|
{
|
|
181
198
|
"id": "helyx.events",
|
|
@@ -184,7 +201,8 @@
|
|
|
184
201
|
"name": "Events",
|
|
185
202
|
"description": "Plan events and track attendance.",
|
|
186
203
|
"category": "Engagement",
|
|
187
|
-
"availability": "planned"
|
|
204
|
+
"availability": "planned",
|
|
205
|
+
"releaseStatus": "planned"
|
|
188
206
|
},
|
|
189
207
|
{
|
|
190
208
|
"id": "helyx.giveaways",
|
|
@@ -193,7 +211,8 @@
|
|
|
193
211
|
"name": "Giveaways",
|
|
194
212
|
"description": "Run auditable giveaways with eligibility rules.",
|
|
195
213
|
"category": "Engagement",
|
|
196
|
-
"availability": "planned"
|
|
214
|
+
"availability": "planned",
|
|
215
|
+
"releaseStatus": "planned"
|
|
197
216
|
},
|
|
198
217
|
{
|
|
199
218
|
"id": "helyx.birthdays",
|
|
@@ -202,7 +221,8 @@
|
|
|
202
221
|
"name": "Birthdays",
|
|
203
222
|
"description": "Celebrate opted-in member birthdays.",
|
|
204
223
|
"category": "Engagement",
|
|
205
|
-
"availability": "planned"
|
|
224
|
+
"availability": "planned",
|
|
225
|
+
"releaseStatus": "planned"
|
|
206
226
|
},
|
|
207
227
|
{
|
|
208
228
|
"id": "helyx.counting",
|
|
@@ -211,16 +231,18 @@
|
|
|
211
231
|
"name": "Counting",
|
|
212
232
|
"description": "Run a configurable community counting channel.",
|
|
213
233
|
"category": "Engagement",
|
|
214
|
-
"availability": "planned"
|
|
234
|
+
"availability": "planned",
|
|
235
|
+
"releaseStatus": "planned"
|
|
215
236
|
},
|
|
216
237
|
{
|
|
217
238
|
"id": "helyx.logging",
|
|
218
239
|
"package": "@helyx/module-logging",
|
|
219
|
-
"version": "1.0.
|
|
240
|
+
"version": "1.0.5",
|
|
220
241
|
"name": "Logging",
|
|
221
|
-
"description": "
|
|
242
|
+
"description": "Posts configurable activity records from enabled Helyx modules.",
|
|
222
243
|
"category": "Insights",
|
|
223
|
-
"availability": "published"
|
|
244
|
+
"availability": "published",
|
|
245
|
+
"releaseStatus": "live"
|
|
224
246
|
},
|
|
225
247
|
{
|
|
226
248
|
"id": "helyx.analytics",
|
|
@@ -229,7 +251,8 @@
|
|
|
229
251
|
"name": "Analytics",
|
|
230
252
|
"description": "Understand server activity with privacy-conscious summaries.",
|
|
231
253
|
"category": "Insights",
|
|
232
|
-
"availability": "planned"
|
|
254
|
+
"availability": "planned",
|
|
255
|
+
"releaseStatus": "planned"
|
|
233
256
|
},
|
|
234
257
|
{
|
|
235
258
|
"id": "helyx.health",
|
|
@@ -238,7 +261,8 @@
|
|
|
238
261
|
"name": "Server health",
|
|
239
262
|
"description": "Surface configuration problems and missing permissions.",
|
|
240
263
|
"category": "Insights",
|
|
241
|
-
"availability": "planned"
|
|
264
|
+
"availability": "planned",
|
|
265
|
+
"releaseStatus": "planned"
|
|
242
266
|
},
|
|
243
267
|
{
|
|
244
268
|
"id": "helyx.youtube",
|
|
@@ -247,7 +271,8 @@
|
|
|
247
271
|
"name": "YouTube alerts",
|
|
248
272
|
"description": "Post when selected channels publish or go live.",
|
|
249
273
|
"category": "Integrations",
|
|
250
|
-
"availability": "planned"
|
|
274
|
+
"availability": "planned",
|
|
275
|
+
"releaseStatus": "planned"
|
|
251
276
|
},
|
|
252
277
|
{
|
|
253
278
|
"id": "helyx.twitch",
|
|
@@ -256,7 +281,8 @@
|
|
|
256
281
|
"name": "Twitch alerts",
|
|
257
282
|
"description": "Announce selected live streams.",
|
|
258
283
|
"category": "Integrations",
|
|
259
|
-
"availability": "planned"
|
|
284
|
+
"availability": "planned",
|
|
285
|
+
"releaseStatus": "planned"
|
|
260
286
|
},
|
|
261
287
|
{
|
|
262
288
|
"id": "helyx.rss",
|
|
@@ -265,7 +291,8 @@
|
|
|
265
291
|
"name": "RSS feeds",
|
|
266
292
|
"description": "Publish updates from selected feeds.",
|
|
267
293
|
"category": "Integrations",
|
|
268
|
-
"availability": "planned"
|
|
294
|
+
"availability": "planned",
|
|
295
|
+
"releaseStatus": "planned"
|
|
269
296
|
},
|
|
270
297
|
{
|
|
271
298
|
"id": "helyx.github",
|
|
@@ -274,7 +301,8 @@
|
|
|
274
301
|
"name": "GitHub updates",
|
|
275
302
|
"description": "Follow releases and repository activity.",
|
|
276
303
|
"category": "Integrations",
|
|
277
|
-
"availability": "planned"
|
|
304
|
+
"availability": "planned",
|
|
305
|
+
"releaseStatus": "planned"
|
|
278
306
|
}
|
|
279
307
|
]
|
|
280
308
|
}
|