@webiny/mcp 6.0.0-rc.7 → 6.1.0-beta.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 (101) hide show
  1. package/agents/claude.d.ts +2 -2
  2. package/agents/claude.js.map +1 -1
  3. package/agents/cline.d.ts +2 -2
  4. package/agents/cline.js.map +1 -1
  5. package/agents/copilot.d.ts +2 -2
  6. package/agents/copilot.js +1 -1
  7. package/agents/copilot.js.map +1 -1
  8. package/agents/cursor.d.ts +2 -2
  9. package/agents/cursor.js.map +1 -1
  10. package/agents/instructions.js +1 -1
  11. package/agents/instructions.js.map +1 -1
  12. package/agents/kiro.d.ts +15 -0
  13. package/agents/kiro.js +33 -0
  14. package/agents/kiro.js.map +1 -0
  15. package/agents/opencode.d.ts +22 -0
  16. package/agents/opencode.js +76 -0
  17. package/agents/opencode.js.map +1 -0
  18. package/agents/shared.d.ts +5 -5
  19. package/agents/shared.js +3 -3
  20. package/agents/shared.js.map +1 -1
  21. package/agents/windsurf.d.ts +2 -2
  22. package/agents/windsurf.js.map +1 -1
  23. package/bin.d.ts +2 -0
  24. package/bin.js +4 -0
  25. package/bin.js.map +1 -0
  26. package/cli/ConfigureMcp.d.ts +7 -14
  27. package/cli/ConfigureMcp.js +24 -52
  28. package/cli/ConfigureMcp.js.map +1 -1
  29. package/cli/McpServer.d.ts +3 -10
  30. package/cli/McpServer.js +83 -109
  31. package/cli/McpServer.js.map +1 -1
  32. package/cli.d.ts +1 -0
  33. package/cli.js +60 -0
  34. package/cli.js.map +1 -0
  35. package/index.d.ts +6 -1
  36. package/index.js +7 -1
  37. package/index.js.map +1 -1
  38. package/package.json +11 -23
  39. package/skills/admin/admin-architect/SKILL.md +389 -0
  40. package/skills/admin/ui-extensions/SKILL.md +268 -0
  41. package/skills/api/api-architect/SKILL.md +189 -0
  42. package/skills/api/custom-field-type/SKILL.md +263 -0
  43. package/skills/api/event-handler-pattern/SKILL.md +131 -0
  44. package/skills/{custom-graphql-api → api/graphql-api}/SKILL.md +3 -3
  45. package/skills/api/use-case-pattern/SKILL.md +102 -0
  46. package/skills/cli-extensions/SKILL.md +45 -47
  47. package/skills/configure-auth0/SKILL.md +4 -4
  48. package/skills/configure-okta/SKILL.md +3 -3
  49. package/skills/content-models/SKILL.md +197 -196
  50. package/skills/dependency-injection/SKILL.md +9 -219
  51. package/skills/full-stack-architect/SKILL.md +195 -0
  52. package/skills/generated/admin/SKILL.md +119 -0
  53. package/skills/generated/admin/aco/SKILL.md +28 -0
  54. package/skills/generated/admin/build-params/SKILL.md +33 -0
  55. package/skills/generated/admin/cms/SKILL.md +342 -0
  56. package/skills/generated/admin/configs/SKILL.md +23 -0
  57. package/skills/generated/admin/env-config/SKILL.md +30 -0
  58. package/skills/generated/admin/form/SKILL.md +88 -0
  59. package/skills/generated/admin/graphql-client/SKILL.md +23 -0
  60. package/skills/generated/admin/lexical/SKILL.md +105 -0
  61. package/skills/generated/admin/local-storage/SKILL.md +42 -0
  62. package/skills/generated/admin/router/SKILL.md +48 -0
  63. package/skills/generated/admin/security/SKILL.md +63 -0
  64. package/skills/generated/admin/tenancy/SKILL.md +64 -0
  65. package/skills/generated/admin/ui/SKILL.md +468 -0
  66. package/skills/generated/admin/website-builder/SKILL.md +318 -0
  67. package/skills/generated/api/SKILL.md +40 -0
  68. package/skills/generated/api/aco/SKILL.md +202 -0
  69. package/skills/generated/api/build-params/SKILL.md +31 -0
  70. package/skills/generated/api/cms/SKILL.md +646 -0
  71. package/skills/generated/api/event-publisher/SKILL.md +31 -0
  72. package/skills/generated/api/file-manager/SKILL.md +189 -0
  73. package/skills/generated/api/graphql/SKILL.md +61 -0
  74. package/skills/generated/api/key-value-store/SKILL.md +31 -0
  75. package/skills/generated/api/logger/SKILL.md +25 -0
  76. package/skills/generated/api/opensearch/SKILL.md +39 -0
  77. package/skills/generated/api/scheduler/SKILL.md +112 -0
  78. package/skills/generated/api/security/SKILL.md +317 -0
  79. package/skills/generated/api/system/SKILL.md +34 -0
  80. package/skills/generated/api/tasks/SKILL.md +31 -0
  81. package/skills/generated/api/tenancy/SKILL.md +124 -0
  82. package/skills/generated/api/tenant-manager/SKILL.md +34 -0
  83. package/skills/generated/api/website-builder/SKILL.md +356 -0
  84. package/skills/generated/cli/SKILL.md +28 -0
  85. package/skills/generated/cli/command/SKILL.md +24 -0
  86. package/skills/generated/extensions/SKILL.md +43 -0
  87. package/skills/generated/infra/SKILL.md +190 -0
  88. package/skills/infrastructure-extensions/SKILL.md +3 -2
  89. package/skills/local-development/SKILL.md +2 -28
  90. package/skills/project-structure/SKILL.md +78 -56
  91. package/skills/webiny-sdk/SKILL.md +77 -76
  92. package/skills/website-builder/SKILL.md +143 -149
  93. package/ui.d.ts +24 -0
  94. package/ui.js +31 -0
  95. package/ui.js.map +1 -0
  96. package/Extension.d.ts +0 -2
  97. package/Extension.js +0 -11
  98. package/Extension.js.map +0 -1
  99. package/skills/admin-ui-extensions/SKILL.md +0 -267
  100. package/skills/api-custom-feature/SKILL.md +0 -195
  101. package/skills/lifecycle-events/SKILL.md +0 -348
@@ -1,348 +0,0 @@
1
- ---
2
- name: webiny-lifecycle-events
3
- context: webiny-extensions
4
- description: >
5
- CMS entry lifecycle hooks and security event handlers.
6
- Use this skill when the developer wants to intercept content entry operations
7
- (create, update, delete, publish, unpublish), validate data before save, auto-calculate
8
- fields, send notifications after operations, enforce security policies, sync with external
9
- systems, or hook into API key updates. Covers before/after hooks, event filtering by modelId,
10
- payload mutation, and the Logger/BuildParams DI services.
11
- ---
12
-
13
- # Lifecycle Events
14
-
15
- ## TL;DR
16
-
17
- Webiny fires lifecycle events before and after CMS entry operations (create, update, delete, publish, unpublish) and security operations (API key updates). You hook into these by implementing the corresponding `EventHandler.Interface`, filtering by `modelId`, and optionally mutating `payload.values` before data is saved. Register as `<Api.Extension>`.
18
-
19
- ## CMS Entry Lifecycle Events
20
-
21
- ### Available Hooks
22
-
23
- | Hook | Import From | Fires When |
24
- |---|---|---|
25
- | `EntryBeforeCreateEventHandler` | `"webiny/api/cms/entry"` | Before a new entry is saved |
26
- | `EntryAfterCreateEventHandler` | `"webiny/api/cms/entry"` | After a new entry is saved |
27
- | `EntryBeforeUpdateEventHandler` | `"webiny/api/cms/entry"` | Before an existing entry is updated |
28
- | `EntryAfterUpdateEventHandler` | `"webiny/api/cms/entry"` | After an existing entry is updated |
29
- | `EntryBeforeDeleteEventHandler` | `"webiny/api/cms/entry"` | Before an entry is deleted |
30
- | `EntryAfterDeleteEventHandler` | `"webiny/api/cms/entry"` | After an entry is deleted |
31
- | `EntryBeforePublishEventHandler` | `"webiny/api/cms/entry"` | Before an entry is published |
32
- | `EntryAfterPublishEventHandler` | `"webiny/api/cms/entry"` | After an entry is published |
33
-
34
- ### The Event Object
35
-
36
- Every handler receives an `event` with:
37
-
38
- - `event.modelId` -- The model ID string (e.g., `"contactSubmission"`)
39
- - `event.payload` -- The entry data object
40
- - `event.payload.values` -- The field values (can be mutated in `before` hooks)
41
-
42
- ### Pattern
43
-
44
- ```typescript
45
- import { EntryBeforeCreateEventHandler as Handler } from "webiny/api/cms/entry";
46
-
47
- class MyHookImpl implements Handler.Interface {
48
- async handle(event: Handler.Event): Promise<void> {
49
- const { payload, modelId } = event;
50
-
51
- // 1. Filter by model -- handlers fire for ALL models
52
- if (modelId !== "myTargetModel") {
53
- return;
54
- }
55
-
56
- // 2. Read values
57
- const someField = payload.values?.someField as string;
58
-
59
- // 3. Mutate values (before hooks only)
60
- if (!payload.values) {
61
- payload.values = {};
62
- }
63
- payload.values.computedField = "computed value";
64
- }
65
- }
66
-
67
- export default Handler.createImplementation({
68
- implementation: MyHookImpl,
69
- dependencies: []
70
- });
71
- ```
72
-
73
- Register in `webiny.config.tsx`:
74
-
75
- ```tsx
76
- <Api.Extension src={"/extensions/MyHook.ts"} />
77
- ```
78
-
79
- ### When to Use Before vs After
80
-
81
- | Use Case | Hook Type | Why |
82
- |---|---|---|
83
- | Validate data | `Before` | Reject or modify before persistence |
84
- | Auto-calculate fields | `Before` | Set computed values before save |
85
- | Send email notification | `After` | Ensure data is persisted first |
86
- | Sync with external CRM | `After` | Side effect after successful save |
87
- | Enforce security policies | `Before` | Block operations before they happen |
88
-
89
- ## Full Example: Email Classification Hook
90
-
91
- This hook intercepts contact form submissions, checks the email domain, and automatically classifies it as "work" or "personal":
92
-
93
- ```typescript
94
- // extensions/contactSubmission/ContactSubmissionHook.ts
95
- import { EntryBeforeCreateEventHandler as Handler } from "webiny/api/cms/entry";
96
- import { Logger } from "webiny/api/logger";
97
-
98
- const PERSONAL_EMAIL_DOMAINS = [
99
- "gmail.com",
100
- "yahoo.com",
101
- "hotmail.com",
102
- "outlook.com",
103
- "aol.com",
104
- "icloud.com",
105
- "protonmail.com"
106
- ];
107
-
108
- class ContactSubmissionHookImpl implements Handler.Interface {
109
- public constructor(private logger: Logger.Interface) {}
110
-
111
- public async handle(event: Handler.Event): Promise<void> {
112
- const { payload, modelId } = event;
113
-
114
- // Only run for Contact Submission entries
115
- if (modelId !== "contactSubmission") {
116
- return;
117
- }
118
-
119
- this.logger.info(`Processing contact submission for model: ${modelId}`);
120
-
121
- const email = payload.values?.email as string;
122
- if (!email) {
123
- this.logger.warn("No email found in contact submission");
124
- return;
125
- }
126
-
127
- // Classify the email
128
- const domain = email.split("@")[1]?.toLowerCase();
129
- let type = "work";
130
- if (domain && PERSONAL_EMAIL_DOMAINS.includes(domain)) {
131
- type = "personal";
132
- }
133
-
134
- this.logger.info(`Classified email ${email} as ${type}`);
135
-
136
- // Set the emailType field before the entry is saved
137
- if (!payload.values) {
138
- payload.values = {};
139
- }
140
- payload.values.emailType = type;
141
- }
142
- }
143
-
144
- export default Handler.createImplementation({
145
- implementation: ContactSubmissionHookImpl,
146
- dependencies: [Logger]
147
- });
148
- ```
149
-
150
- ## Security Lifecycle Events
151
-
152
- ### API Key After Update
153
-
154
- ```typescript
155
- // extensions/MyApiKeyAfterUpdate.ts
156
- import { ApiKeyAfterUpdateEventHandler } from "webiny/api/security/api-key";
157
- import { Logger } from "webiny/api/logger";
158
- import { BuildParams } from "webiny/api/build-params";
159
-
160
- class MyApiKeyAfterUpdateImpl implements ApiKeyAfterUpdateEventHandler.Interface {
161
- constructor(
162
- private logger: Logger.Interface,
163
- private buildParams: BuildParams.Interface
164
- ) {}
165
-
166
- async handle() {
167
- this.logger.warn("An API key was updated!");
168
-
169
- const param1 = this.buildParams.get<string>("MY_CUSTOM_BUILD_PARAM");
170
- console.log(`Build param 1: ${param1}`);
171
- }
172
- }
173
-
174
- const MyApiKeyAfterUpdate = ApiKeyAfterUpdateEventHandler.createImplementation({
175
- implementation: MyApiKeyAfterUpdateImpl,
176
- dependencies: [Logger, BuildParams]
177
- });
178
-
179
- export default MyApiKeyAfterUpdate;
180
- ```
181
-
182
- Register with a dedicated JSX element:
183
-
184
- ```tsx
185
- <Security.ApiKey.AfterUpdate src={"/extensions/MyApiKeyAfterUpdate.ts"} />
186
- ```
187
-
188
- ## All Available Event Handlers
189
-
190
- ### `webiny/api/cms/entry`
191
-
192
- | Handler | Fires When |
193
- | --- | --- |
194
- | `EntryBeforeCreateEventHandler` | Before a new entry is saved |
195
- | `EntryAfterCreateEventHandler` | After a new entry is saved |
196
- | `EntryRevisionBeforeCreateEventHandler` | Before a revision is created |
197
- | `EntryRevisionAfterCreateEventHandler` | After a revision is created |
198
- | `EntryBeforeUpdateEventHandler` | Before an entry is updated |
199
- | `EntryAfterUpdateEventHandler` | After an entry is updated |
200
- | `EntryBeforeDeleteEventHandler` | Before an entry is deleted |
201
- | `EntryAfterDeleteEventHandler` | After an entry is deleted |
202
- | `EntryRevisionBeforeDeleteEventHandler` | Before a revision is deleted |
203
- | `EntryRevisionAfterDeleteEventHandler` | After a revision is deleted |
204
- | `EntryBeforeDeleteMultipleEventHandler` | Before multiple entries are deleted |
205
- | `EntryAfterDeleteMultipleEventHandler` | After multiple entries are deleted |
206
- | `EntryBeforeMoveEventHandler` | Before an entry is moved |
207
- | `EntryAfterMoveEventHandler` | After an entry is moved |
208
- | `EntryBeforePublishEventHandler` | Before an entry is published |
209
- | `EntryAfterPublishEventHandler` | After an entry is published |
210
- | `EntryBeforeRepublishEventHandler` | Before an entry is republished |
211
- | `EntryAfterRepublishEventHandler` | After an entry is republished |
212
- | `EntryBeforeRestoreFromBinEventHandler` | Before an entry is restored from bin |
213
- | `EntryAfterRestoreFromBinEventHandler` | After an entry is restored from bin |
214
- | `EntryBeforeUnpublishEventHandler` | Before an entry is unpublished |
215
- | `EntryAfterUnpublishEventHandler` | After an entry is unpublished |
216
-
217
- ### `webiny/api/cms/model`
218
-
219
- | Handler | Fires When |
220
- | --- | --- |
221
- | `ModelBeforeCreateEventHandler` | Before a model is created |
222
- | `ModelAfterCreateEventHandler` | After a model is created |
223
- | `ModelBeforeCreateFromEventHandler` | Before a model is cloned |
224
- | `ModelAfterCreateFromEventHandler` | After a model is cloned |
225
- | `ModelBeforeUpdateEventHandler` | Before a model is updated |
226
- | `ModelAfterUpdateEventHandler` | After a model is updated |
227
- | `ModelBeforeDeleteEventHandler` | Before a model is deleted |
228
- | `ModelAfterDeleteEventHandler` | After a model is deleted |
229
-
230
- ### `webiny/api/cms/group`
231
-
232
- | Handler | Fires When |
233
- | --- | --- |
234
- | `GroupBeforeCreateEventHandler` | Before a group is created |
235
- | `GroupAfterCreateEventHandler` | After a group is created |
236
- | `GroupBeforeUpdateEventHandler` | Before a group is updated |
237
- | `GroupAfterUpdateEventHandler` | After a group is updated |
238
- | `GroupBeforeDeleteEventHandler` | Before a group is deleted |
239
- | `GroupAfterDeleteEventHandler` | After a group is deleted |
240
-
241
- ### `webiny/api/security/authentication`
242
-
243
- | Handler | Fires When |
244
- | --- | --- |
245
- | `BeforeAuthenticationEventHandler` | Before authentication |
246
- | `AfterAuthenticationEventHandler` | After authentication |
247
-
248
- ### `webiny/api/security/api-key`
249
-
250
- | Handler | Fires When |
251
- | --- | --- |
252
- | `ApiKeyBeforeCreateEventHandler` | Before an API key is created |
253
- | `ApiKeyAfterCreateEventHandler` | After an API key is created |
254
- | `ApiKeyBeforeDeleteEventHandler` | Before an API key is deleted |
255
- | `ApiKeyAfterDeleteEventHandler` | After an API key is deleted |
256
- | `ApiKeyBeforeUpdateEventHandler` | Before an API key is updated |
257
- | `ApiKeyAfterUpdateEventHandler` | After an API key is updated |
258
-
259
- ### `webiny/api/security/role`
260
-
261
- | Handler | Fires When |
262
- | --- | --- |
263
- | `RoleBeforeCreateEventHandler` | Before a role is created |
264
- | `RoleAfterCreateEventHandler` | After a role is created |
265
- | `RoleBeforeDeleteEventHandler` | Before a role is deleted |
266
- | `RoleAfterDeleteEventHandler` | After a role is deleted |
267
- | `RoleBeforeUpdateEventHandler` | Before a role is updated |
268
- | `RoleAfterUpdateEventHandler` | After a role is updated |
269
-
270
- ### `webiny/api/security/user`
271
-
272
- | Handler | Fires When |
273
- | --- | --- |
274
- | `UserBeforeCreateEventHandler` | Before a user is created |
275
- | `UserAfterCreateEventHandler` | After a user is created |
276
- | `UserBeforeDeleteEventHandler` | Before a user is deleted |
277
- | `UserAfterDeleteEventHandler` | After a user is deleted |
278
- | `UserBeforeUpdateEventHandler` | Before a user is updated |
279
- | `UserAfterUpdateEventHandler` | After a user is updated |
280
-
281
- ### `webiny/api/tenancy`
282
-
283
- | Handler | Fires When |
284
- | --- | --- |
285
- | `TenantBeforeCreateEventHandler` | Before a tenant is created |
286
- | `TenantAfterCreateEventHandler` | After a tenant is created |
287
- | `TenantBeforeUpdateEventHandler` | Before a tenant is updated |
288
- | `TenantAfterUpdateEventHandler` | After a tenant is updated |
289
- | `TenantBeforeDeleteEventHandler` | Before a tenant is deleted |
290
- | `TenantAfterDeleteEventHandler` | After a tenant is deleted |
291
- | `TenantInstalledEventHandler` | After a tenant is installed |
292
-
293
- ### `webiny/api/system`
294
-
295
- | Handler | Fires When |
296
- | --- | --- |
297
- | `SystemInstalledEventHandler` | After the system is installed |
298
-
299
- ### `webiny/api/website-builder/page`
300
-
301
- | Handler | Fires When |
302
- | --- | --- |
303
- | `PageBeforeCreateEventHandler` | Before a page is created |
304
- | `PageAfterCreateEventHandler` | After a page is created |
305
- | `PageBeforeCreateRevisionFromEventHandler` | Before a page revision is created |
306
- | `PageAfterCreateRevisionFromEventHandler` | After a page revision is created |
307
- | `PageBeforeDeleteEventHandler` | Before a page is deleted |
308
- | `PageAfterDeleteEventHandler` | After a page is deleted |
309
- | `PageBeforeDuplicateEventHandler` | Before a page is duplicated |
310
- | `PageAfterDuplicateEventHandler` | After a page is duplicated |
311
- | `PageBeforeMoveEventHandler` | Before a page is moved |
312
- | `PageAfterMoveEventHandler` | After a page is moved |
313
- | `PageBeforePublishEventHandler` | Before a page is published |
314
- | `PageAfterPublishEventHandler` | After a page is published |
315
- | `PageBeforeUnpublishEventHandler` | Before a page is unpublished |
316
- | `PageAfterUnpublishEventHandler` | After a page is unpublished |
317
- | `PageBeforeUpdateEventHandler` | Before a page is updated |
318
- | `PageAfterUpdateEventHandler` | After a page is updated |
319
-
320
- ### `webiny/api/website-builder/redirect`
321
-
322
- | Handler | Fires When |
323
- | --- | --- |
324
- | `RedirectBeforeCreateEventHandler` | Before a redirect is created |
325
- | `RedirectAfterCreateEventHandler` | After a redirect is created |
326
- | `RedirectBeforeDeleteEventHandler` | Before a redirect is deleted |
327
- | `RedirectAfterDeleteEventHandler` | After a redirect is deleted |
328
- | `RedirectBeforeMoveEventHandler` | Before a redirect is moved |
329
- | `RedirectAfterMoveEventHandler` | After a redirect is moved |
330
- | `RedirectBeforeUpdateEventHandler` | Before a redirect is updated |
331
- | `RedirectAfterUpdateEventHandler` | After a redirect is updated |
332
-
333
- ## Quick Reference
334
-
335
- ```
336
- CMS hooks import: import { EntryBeforeCreateEventHandler } from "webiny/api/cms/entry";
337
- Security import: import { ApiKeyAfterUpdateEventHandler } from "webiny/api/security/api-key";
338
- Event shape: event.modelId (string), event.payload (object), event.payload.values (object)
339
- Export: Handler.createImplementation({ implementation, dependencies })
340
- Register CMS: <Api.Extension src={"/extensions/MyHook.ts"} />
341
- Register Security: <Security.ApiKey.AfterUpdate src={"/extensions/MyHook.ts"} />
342
- Deploy: yarn webiny deploy api
343
- ```
344
-
345
- ## Related Skills
346
-
347
- - `content-models` -- Define the models your hooks target
348
- - `dependency-injection` -- Inject Logger, BuildParams, and other services into event handlers