@polymorphism-tech/morph-spec 4.10.9 → 4.10.10
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/CLAUDE.md +3 -3
- package/LICENSE +71 -71
- package/README.md +2 -2
- package/bin/morph-spec.js +22 -0
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/shared/phase-utils.js +139 -139
- package/framework/rules/csharp-standards.md +13 -13
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +16 -16
- package/framework/rules/testing-standards.md +14 -14
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +2338 -2041
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- package/framework/standards/infrastructure/supabase/supabase-custom-jwt.md +206 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/README.md +814 -814
- package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
- package/framework/templates/code/dotnet/contracts/README.md +74 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
- package/framework/templates/code/dotnet/frontend/component.razor +239 -239
- package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
- package/framework/templates/code/dotnet/jobs/job.cs +171 -171
- package/framework/templates/code/dotnet/test.cs +239 -239
- package/framework/templates/code/sql/rls-policy.sql +57 -57
- package/framework/templates/code/sql/supabase-migration.sql +100 -100
- package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
- package/framework/templates/code/typescript/contracts.ts +168 -168
- package/framework/templates/context/CONTEXT.md +181 -181
- package/framework/templates/docs/proposal.md +182 -182
- package/framework/templates/docs/user-stories.md +34 -34
- package/framework/templates/examples/design-system-examples.md +357 -357
- package/framework/templates/examples/spec-examples.md +90 -90
- package/framework/templates/feature/decisions.md +187 -187
- package/framework/templates/feature/recap.md +146 -146
- package/framework/templates/feature/tasks.md +199 -199
- package/framework/templates/infrastructure/azure/README.md +286 -286
- package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
- package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
- package/package.json +1 -1
- package/src/commands/agents/dispatch-agents.js +17 -0
- package/src/commands/agents/index.js +13 -13
- package/src/commands/agents/project-metrics.js +74 -0
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/standards/context-budget.js +89 -0
- package/src/commands/tasks/index.js +4 -4
- package/src/commands/templates/index.js +5 -5
- package/src/commands/utils/index.js +3 -3
- package/src/commands/validation/index.js +4 -4
- package/src/core/state/phase-state-machine.js +217 -217
- package/src/lib/agents/metrics-aggregator.js +56 -0
- package/src/lib/generators/design-system-generator.js +298 -298
- package/src/lib/generators/index.js +10 -10
- package/src/lib/generators/metadata-extractor.js +387 -387
- package/src/lib/stack-filter.js +65 -65
- package/src/lib/standards/digest-builder.js +57 -3
- package/src/lib/standards/index.js +7 -7
- package/src/lib/standards/standards-context-injector.js +302 -302
- package/src/lib/validators/architecture/architecture-validator.js +387 -387
- package/src/lib/validators/architecture/index.js +7 -7
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
- package/src/lib/validators/blazor/blazor-validator.js +369 -369
- package/src/lib/validators/blazor/index.js +9 -9
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/content/index.js +7 -7
- package/src/lib/validators/contracts/index.js +7 -7
- package/src/lib/validators/css/css-validator.js +352 -352
- package/src/lib/validators/css/index.js +7 -7
- package/src/lib/validators/design-system/design-system-validator.js +231 -231
- package/src/lib/validators/design-system/index.js +7 -7
- package/src/lib/validators/nextjs/index.js +6 -6
- package/src/lib/validators/nextjs/next-component-validator.js +183 -183
- package/src/lib/validators/packages/index.js +7 -7
- package/src/lib/validators/packages/package-validator.js +360 -360
- package/src/lib/validators/shared/index.js +12 -12
- package/src/lib/validators/shared/issue-counter.js +18 -18
- package/src/lib/validators/shared/result-formatter.js +124 -124
- package/src/lib/validators/ui/index.js +7 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
- package/src/scripts/global-install.js +58 -58
- package/src/scripts/install-plugin.js +126 -126
- package/src/utils/claude-md-injector.js +90 -90
- package/src/utils/file-copier.js +200 -200
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/version-checker.js +175 -175
|
@@ -1,2041 +1,2338 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "1.0.0",
|
|
3
|
-
"standards": [
|
|
4
|
-
{
|
|
5
|
-
"id": "ai-agents-blazor-ui",
|
|
6
|
-
"name": "blazor ui",
|
|
7
|
-
"path": "ai-agents/blazor-ui.md",
|
|
8
|
-
"category": "ai-agents",
|
|
9
|
-
"subcategory": null,
|
|
10
|
-
"tags": [
|
|
11
|
-
"ai-agents"
|
|
12
|
-
],
|
|
13
|
-
"aliases": [
|
|
14
|
-
"Blazor AI",
|
|
15
|
-
"AI chat UI",
|
|
16
|
-
"streaming Blazor",
|
|
17
|
-
"agent UI",
|
|
18
|
-
"chat component"
|
|
19
|
-
],
|
|
20
|
-
"anchors": {
|
|
21
|
-
"streaming": "#streaming-responses",
|
|
22
|
-
"state": "#ui-state-management",
|
|
23
|
-
"dbcontext": "#dbcontext-in-blazor"
|
|
24
|
-
},
|
|
25
|
-
"digest": "Never inject DbContext directly into Blazor components — use a scoped service factory. Stream AI responses via IAsyncEnumerable. Debounce user input. Handle cancellation with CancellationTokenSource per component lifecycle."
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
"
|
|
114
|
-
|
|
115
|
-
"
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
"
|
|
123
|
-
|
|
124
|
-
"
|
|
125
|
-
"
|
|
126
|
-
|
|
127
|
-
"
|
|
128
|
-
|
|
129
|
-
"
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
"
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
"
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
"
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
"
|
|
156
|
-
]
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
"
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
"
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
"
|
|
172
|
-
"
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
"
|
|
177
|
-
"
|
|
178
|
-
"
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
"
|
|
182
|
-
"
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
"
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
"
|
|
196
|
-
"
|
|
197
|
-
"
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
"
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
"
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
|
|
220
|
-
"
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
"
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
"
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
"
|
|
245
|
-
|
|
246
|
-
"
|
|
247
|
-
"
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
"
|
|
253
|
-
"
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
"
|
|
260
|
-
"
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
"
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
"
|
|
272
|
-
"
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
"
|
|
277
|
-
"
|
|
278
|
-
"
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
"
|
|
287
|
-
"
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
"
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
"
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
"
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
"
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
"
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
"
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
"
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
"
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
"
|
|
359
|
-
"
|
|
360
|
-
],
|
|
361
|
-
"
|
|
362
|
-
"
|
|
363
|
-
"
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
"
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
"
|
|
376
|
-
"
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
"
|
|
381
|
-
"
|
|
382
|
-
"
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
"
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
"
|
|
389
|
-
"
|
|
390
|
-
|
|
391
|
-
"
|
|
392
|
-
|
|
393
|
-
"
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
"
|
|
400
|
-
"
|
|
401
|
-
"
|
|
402
|
-
"
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
"
|
|
410
|
-
"
|
|
411
|
-
"
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
"
|
|
424
|
-
"
|
|
425
|
-
"
|
|
426
|
-
"
|
|
427
|
-
"
|
|
428
|
-
|
|
429
|
-
"
|
|
430
|
-
"
|
|
431
|
-
],
|
|
432
|
-
"aliases": [
|
|
433
|
-
"
|
|
434
|
-
"
|
|
435
|
-
"
|
|
436
|
-
"
|
|
437
|
-
"
|
|
438
|
-
],
|
|
439
|
-
"anchors": {
|
|
440
|
-
"
|
|
441
|
-
"
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
"
|
|
451
|
-
"
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
"
|
|
456
|
-
"
|
|
457
|
-
"
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
"
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
"
|
|
464
|
-
"
|
|
465
|
-
|
|
466
|
-
"
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
"
|
|
471
|
-
"
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
"
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
"
|
|
483
|
-
"
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
"
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
"
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
"
|
|
498
|
-
|
|
499
|
-
"dotnet"
|
|
500
|
-
]
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
"
|
|
509
|
-
"
|
|
510
|
-
"
|
|
511
|
-
|
|
512
|
-
"
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
"
|
|
520
|
-
|
|
521
|
-
"
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
"
|
|
525
|
-
"
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
"
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
"
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
"
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
"
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
"
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
"
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
"
|
|
569
|
-
"
|
|
570
|
-
],
|
|
571
|
-
"
|
|
572
|
-
"
|
|
573
|
-
"
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
"
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
"
|
|
586
|
-
"
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
"
|
|
591
|
-
"
|
|
592
|
-
"
|
|
593
|
-
"
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
"
|
|
599
|
-
"
|
|
600
|
-
"
|
|
601
|
-
|
|
602
|
-
"
|
|
603
|
-
|
|
604
|
-
"
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
"
|
|
610
|
-
"
|
|
611
|
-
"
|
|
612
|
-
"
|
|
613
|
-
"
|
|
614
|
-
|
|
615
|
-
"
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
"
|
|
621
|
-
"
|
|
622
|
-
"
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
"
|
|
635
|
-
"
|
|
636
|
-
"
|
|
637
|
-
"
|
|
638
|
-
"
|
|
639
|
-
|
|
640
|
-
"
|
|
641
|
-
"
|
|
642
|
-
],
|
|
643
|
-
"aliases": [
|
|
644
|
-
"
|
|
645
|
-
"
|
|
646
|
-
"
|
|
647
|
-
"
|
|
648
|
-
"
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
"
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
"
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
"
|
|
661
|
-
"
|
|
662
|
-
"
|
|
663
|
-
"
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
"
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
"
|
|
672
|
-
"
|
|
673
|
-
"
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
"
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
"
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
"
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
"
|
|
694
|
-
"
|
|
695
|
-
"
|
|
696
|
-
],
|
|
697
|
-
"
|
|
698
|
-
"
|
|
699
|
-
"
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
"
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
"
|
|
709
|
-
"
|
|
710
|
-
"
|
|
711
|
-
]
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
"
|
|
719
|
-
|
|
720
|
-
"
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
"
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
"
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
"
|
|
747
|
-
"
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
"
|
|
756
|
-
"
|
|
757
|
-
"
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
"
|
|
770
|
-
"
|
|
771
|
-
"
|
|
772
|
-
"
|
|
773
|
-
"
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
"
|
|
779
|
-
"
|
|
780
|
-
"
|
|
781
|
-
"
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
"
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
"
|
|
795
|
-
"
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
"
|
|
799
|
-
|
|
800
|
-
"
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
"
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
"
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
"
|
|
813
|
-
"
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
"
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
"
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
"
|
|
829
|
-
"
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
"
|
|
837
|
-
"
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
"
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
"
|
|
849
|
-
],
|
|
850
|
-
"
|
|
851
|
-
"
|
|
852
|
-
"
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
"
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
"
|
|
862
|
-
"
|
|
863
|
-
"
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
"
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
"
|
|
889
|
-
]
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
"
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
"
|
|
922
|
-
|
|
923
|
-
"
|
|
924
|
-
|
|
925
|
-
"
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
"
|
|
933
|
-
|
|
934
|
-
"
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
"
|
|
938
|
-
"
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
"
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
"
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
"
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
"
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
"
|
|
981
|
-
"
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
"
|
|
986
|
-
"
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
"
|
|
990
|
-
"
|
|
991
|
-
"
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
"
|
|
997
|
-
"
|
|
998
|
-
"
|
|
999
|
-
"
|
|
1000
|
-
"
|
|
1001
|
-
|
|
1002
|
-
"
|
|
1003
|
-
"
|
|
1004
|
-
],
|
|
1005
|
-
"aliases": [
|
|
1006
|
-
"
|
|
1007
|
-
"
|
|
1008
|
-
"
|
|
1009
|
-
"
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
"
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
"
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
"
|
|
1031
|
-
"
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
"
|
|
1036
|
-
"
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
"
|
|
1045
|
-
"
|
|
1046
|
-
|
|
1047
|
-
"
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
"
|
|
1057
|
-
"
|
|
1058
|
-
"
|
|
1059
|
-
|
|
1060
|
-
"
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
"
|
|
1068
|
-
|
|
1069
|
-
"
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
"
|
|
1073
|
-
"
|
|
1074
|
-
"
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
"
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
"
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
"
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
"
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
"
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
"
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
"
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
"
|
|
1110
|
-
"
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
"
|
|
1115
|
-
"
|
|
1116
|
-
"blazor"
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
"
|
|
1122
|
-
"
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
"
|
|
1126
|
-
"
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
"
|
|
1133
|
-
"
|
|
1134
|
-
"
|
|
1135
|
-
"
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
"
|
|
1143
|
-
"
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
"
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
},
|
|
1154
|
-
{
|
|
1155
|
-
"id": "frontend-
|
|
1156
|
-
"name": "
|
|
1157
|
-
"path": "frontend/
|
|
1158
|
-
"category": "frontend",
|
|
1159
|
-
"subcategory": "
|
|
1160
|
-
"tags": [
|
|
1161
|
-
"frontend",
|
|
1162
|
-
"
|
|
1163
|
-
],
|
|
1164
|
-
"aliases": [
|
|
1165
|
-
"
|
|
1166
|
-
"
|
|
1167
|
-
"
|
|
1168
|
-
"
|
|
1169
|
-
"
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
"
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
"
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
"
|
|
1182
|
-
"
|
|
1183
|
-
"
|
|
1184
|
-
"
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
"
|
|
1192
|
-
"
|
|
1193
|
-
"
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
"
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
"
|
|
1207
|
-
"
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
"
|
|
1212
|
-
"
|
|
1213
|
-
"
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
"
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
"
|
|
1220
|
-
"
|
|
1221
|
-
|
|
1222
|
-
"
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
"
|
|
1227
|
-
"
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
"
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
"
|
|
1239
|
-
"
|
|
1240
|
-
],
|
|
1241
|
-
"
|
|
1242
|
-
"
|
|
1243
|
-
"
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
"
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
"
|
|
1253
|
-
"
|
|
1254
|
-
"
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
"
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
"
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
"
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
"
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
"
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
"
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
"
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
"
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
"
|
|
1324
|
-
"
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
"
|
|
1329
|
-
"
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
"
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
"
|
|
1341
|
-
"
|
|
1342
|
-
"
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
"
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
"
|
|
1351
|
-
"
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
"
|
|
1364
|
-
"
|
|
1365
|
-
"
|
|
1366
|
-
"
|
|
1367
|
-
"
|
|
1368
|
-
|
|
1369
|
-
"
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
"
|
|
1374
|
-
"
|
|
1375
|
-
"
|
|
1376
|
-
"
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
"
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
"
|
|
1390
|
-
"
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
"
|
|
1395
|
-
"
|
|
1396
|
-
"
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
"
|
|
1400
|
-
"component
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
"
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
"
|
|
1410
|
-
"
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
"
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
"
|
|
1422
|
-
"
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
"
|
|
1427
|
-
"
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
"
|
|
1436
|
-
"
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
"
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
"
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
"
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
"
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
"
|
|
1462
|
-
|
|
1463
|
-
"
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
"
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
"
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
"
|
|
1499
|
-
"
|
|
1500
|
-
"
|
|
1501
|
-
|
|
1502
|
-
"
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
"
|
|
1510
|
-
|
|
1511
|
-
"
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
"
|
|
1524
|
-
|
|
1525
|
-
"
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
"
|
|
1535
|
-
|
|
1536
|
-
"
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
"
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
"
|
|
1562
|
-
"
|
|
1563
|
-
|
|
1564
|
-
"
|
|
1565
|
-
|
|
1566
|
-
"
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
"
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
"
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
"
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
"
|
|
1585
|
-
"
|
|
1586
|
-
],
|
|
1587
|
-
"
|
|
1588
|
-
"
|
|
1589
|
-
"
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
"
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
"
|
|
1602
|
-
"
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
"
|
|
1607
|
-
"
|
|
1608
|
-
"
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
"
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
"
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
},
|
|
1622
|
-
{
|
|
1623
|
-
"id": "infrastructure-
|
|
1624
|
-
"name": "
|
|
1625
|
-
"path": "infrastructure/
|
|
1626
|
-
"category": "infrastructure",
|
|
1627
|
-
"subcategory": "
|
|
1628
|
-
"tags": [
|
|
1629
|
-
"infrastructure",
|
|
1630
|
-
"
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
"
|
|
1635
|
-
"
|
|
1636
|
-
"
|
|
1637
|
-
"
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
"
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
"
|
|
1651
|
-
"
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
"
|
|
1656
|
-
"
|
|
1657
|
-
"
|
|
1658
|
-
"
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
"
|
|
1664
|
-
"
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
"
|
|
1672
|
-
"
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
"
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
"
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
"
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
"
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
"
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
"
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
"
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
"
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
"
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
"
|
|
1744
|
-
|
|
1745
|
-
"
|
|
1746
|
-
"
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
"
|
|
1752
|
-
"
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
"
|
|
1756
|
-
"
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
"
|
|
1763
|
-
"
|
|
1764
|
-
"
|
|
1765
|
-
"
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
"
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
"
|
|
1773
|
-
"
|
|
1774
|
-
"
|
|
1775
|
-
"
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
"
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
"
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
"
|
|
1788
|
-
"
|
|
1789
|
-
"
|
|
1790
|
-
"
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
"
|
|
1798
|
-
"
|
|
1799
|
-
"
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
"
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
"
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
"
|
|
1818
|
-
|
|
1819
|
-
"
|
|
1820
|
-
"
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
"
|
|
1826
|
-
"
|
|
1827
|
-
|
|
1828
|
-
"
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
"
|
|
1833
|
-
"
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
"
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
"
|
|
1845
|
-
"
|
|
1846
|
-
],
|
|
1847
|
-
"
|
|
1848
|
-
"
|
|
1849
|
-
"
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
"
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
"
|
|
1859
|
-
"
|
|
1860
|
-
"
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
"
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
"
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
"
|
|
1886
|
-
"
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
"
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
"
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
"
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
"
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
"
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
"
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
"
|
|
1934
|
-
"
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
"
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
"
|
|
1947
|
-
"
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
"
|
|
1956
|
-
"
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
"
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
"
|
|
1971
|
-
"
|
|
1972
|
-
"
|
|
1973
|
-
"
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
"
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
"
|
|
1981
|
-
"
|
|
1982
|
-
"
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
"
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
"
|
|
1992
|
-
"
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
"
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
"
|
|
2004
|
-
"
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
"
|
|
2009
|
-
"
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
"
|
|
2018
|
-
"
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
"
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
"
|
|
2030
|
-
"
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
"
|
|
2035
|
-
"
|
|
2036
|
-
"
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"standards": [
|
|
4
|
+
{
|
|
5
|
+
"id": "ai-agents-blazor-ui",
|
|
6
|
+
"name": "blazor ui",
|
|
7
|
+
"path": "ai-agents/blazor-ui.md",
|
|
8
|
+
"category": "ai-agents",
|
|
9
|
+
"subcategory": null,
|
|
10
|
+
"tags": [
|
|
11
|
+
"ai-agents"
|
|
12
|
+
],
|
|
13
|
+
"aliases": [
|
|
14
|
+
"Blazor AI",
|
|
15
|
+
"AI chat UI",
|
|
16
|
+
"streaming Blazor",
|
|
17
|
+
"agent UI",
|
|
18
|
+
"chat component"
|
|
19
|
+
],
|
|
20
|
+
"anchors": {
|
|
21
|
+
"streaming": "#streaming-responses",
|
|
22
|
+
"state": "#ui-state-management",
|
|
23
|
+
"dbcontext": "#dbcontext-in-blazor"
|
|
24
|
+
},
|
|
25
|
+
"digest": "Never inject DbContext directly into Blazor components — use a scoped service factory. Stream AI responses via IAsyncEnumerable. Debounce user input. Handle cancellation with CancellationTokenSource per component lifecycle.",
|
|
26
|
+
"stacks": [
|
|
27
|
+
"blazor"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "ai-agents-production",
|
|
32
|
+
"name": "production",
|
|
33
|
+
"path": "ai-agents/production.md",
|
|
34
|
+
"category": "ai-agents",
|
|
35
|
+
"subcategory": null,
|
|
36
|
+
"tags": [
|
|
37
|
+
"ai-agents"
|
|
38
|
+
],
|
|
39
|
+
"aliases": [
|
|
40
|
+
"AI production",
|
|
41
|
+
"agent reliability",
|
|
42
|
+
"production AI",
|
|
43
|
+
"agent safety",
|
|
44
|
+
"autonomous systems"
|
|
45
|
+
],
|
|
46
|
+
"anchors": {
|
|
47
|
+
"reliability": "#reliability-patterns",
|
|
48
|
+
"safety": "#safety-guardrails",
|
|
49
|
+
"monitoring": "#monitoring-and-logging"
|
|
50
|
+
},
|
|
51
|
+
"digest": "Add rate limiting and retry with exponential backoff. Log all agent decisions and tool calls. Implement circuit breakers for external calls. Validate agent output before acting. Never give agents unaudited write access to production systems.",
|
|
52
|
+
"stacks": [
|
|
53
|
+
"*"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "ai-agents-setup",
|
|
58
|
+
"name": "setup",
|
|
59
|
+
"path": "ai-agents/setup.md",
|
|
60
|
+
"category": "ai-agents",
|
|
61
|
+
"subcategory": null,
|
|
62
|
+
"tags": [
|
|
63
|
+
"ai-agents"
|
|
64
|
+
],
|
|
65
|
+
"aliases": [
|
|
66
|
+
"AI agent setup",
|
|
67
|
+
"MCP configuration",
|
|
68
|
+
"tool configuration",
|
|
69
|
+
"Claude setup",
|
|
70
|
+
"agent initialization"
|
|
71
|
+
],
|
|
72
|
+
"anchors": {
|
|
73
|
+
"mcp": "#mcp-configuration",
|
|
74
|
+
"tools": "#tool-definitions",
|
|
75
|
+
"spawn": "#spawn-configuration"
|
|
76
|
+
},
|
|
77
|
+
"digest": "Initialize agents with explicit tool lists — never allow unlimited tool access. Configure MCP servers before spawning subagents. Define system prompts with role + constraints + output format. Validate tool availability before dispatch.",
|
|
78
|
+
"stacks": [
|
|
79
|
+
"*"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "ai-agents-team-orchestration",
|
|
84
|
+
"name": "team orchestration",
|
|
85
|
+
"path": "ai-agents/team-orchestration.md",
|
|
86
|
+
"category": "ai-agents",
|
|
87
|
+
"subcategory": null,
|
|
88
|
+
"tags": [
|
|
89
|
+
"ai-agents"
|
|
90
|
+
],
|
|
91
|
+
"aliases": [
|
|
92
|
+
"team orchestration",
|
|
93
|
+
"agent team",
|
|
94
|
+
"multi-agent coordination",
|
|
95
|
+
"squad dispatch"
|
|
96
|
+
],
|
|
97
|
+
"anchors": {
|
|
98
|
+
"patterns": "#orchestration-patterns",
|
|
99
|
+
"communication": "#inter-agent-communication"
|
|
100
|
+
},
|
|
101
|
+
"digest": "Organize agents into squads with a designated leader. Leader decomposes the task and dispatches to specialists. Pass structured briefs between agents — not raw conversation. Each agent outputs a typed result. Leader aggregates into a unified output.",
|
|
102
|
+
"stacks": [
|
|
103
|
+
"*"
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "ai-agents-workflows",
|
|
108
|
+
"name": "workflows",
|
|
109
|
+
"path": "ai-agents/workflows.md",
|
|
110
|
+
"category": "ai-agents",
|
|
111
|
+
"subcategory": null,
|
|
112
|
+
"tags": [
|
|
113
|
+
"ai-agents"
|
|
114
|
+
],
|
|
115
|
+
"aliases": [
|
|
116
|
+
"agent workflow",
|
|
117
|
+
"multi-agent",
|
|
118
|
+
"orchestration pattern",
|
|
119
|
+
"agent chain",
|
|
120
|
+
"parallel agents"
|
|
121
|
+
],
|
|
122
|
+
"anchors": {
|
|
123
|
+
"orchestration": "#orchestration-patterns",
|
|
124
|
+
"parallel": "#parallel-execution",
|
|
125
|
+
"handoff": "#agent-handoff"
|
|
126
|
+
},
|
|
127
|
+
"digest": "Use orchestrator→specialist pattern for complex tasks. Parallelize independent subtasks. Pass structured context between agents, not raw conversation. Define explicit success criteria before spawning. Implement timeout and fallback strategies.",
|
|
128
|
+
"stacks": [
|
|
129
|
+
"*"
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "architecture-ddd-aggregates",
|
|
134
|
+
"name": "aggregates",
|
|
135
|
+
"path": "architecture/ddd/aggregates.md",
|
|
136
|
+
"category": "architecture",
|
|
137
|
+
"subcategory": "ddd",
|
|
138
|
+
"tags": [
|
|
139
|
+
"architecture",
|
|
140
|
+
"ddd"
|
|
141
|
+
],
|
|
142
|
+
"aliases": [
|
|
143
|
+
"aggregate root",
|
|
144
|
+
"DDD aggregate",
|
|
145
|
+
"domain aggregate",
|
|
146
|
+
"aggregate pattern"
|
|
147
|
+
],
|
|
148
|
+
"anchors": {
|
|
149
|
+
"root": "#aggregate-root-design",
|
|
150
|
+
"invariants": "#enforcing-invariants",
|
|
151
|
+
"events": "#domain-events"
|
|
152
|
+
},
|
|
153
|
+
"digest": "AggregateRoot owns its boundary — never reference internal entities from outside. Enforce invariants in aggregate methods, not services. Raise domain events from within the aggregate. Use ID references across aggregate boundaries.",
|
|
154
|
+
"stacks": [
|
|
155
|
+
"dotnet"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "architecture-ddd-bounded-contexts",
|
|
160
|
+
"name": "bounded contexts",
|
|
161
|
+
"path": "architecture/ddd/bounded-contexts.md",
|
|
162
|
+
"category": "architecture",
|
|
163
|
+
"subcategory": "ddd",
|
|
164
|
+
"tags": [
|
|
165
|
+
"architecture",
|
|
166
|
+
"ddd"
|
|
167
|
+
],
|
|
168
|
+
"aliases": [
|
|
169
|
+
"bounded context",
|
|
170
|
+
"BC",
|
|
171
|
+
"context map",
|
|
172
|
+
"integration events",
|
|
173
|
+
"domain boundary"
|
|
174
|
+
],
|
|
175
|
+
"anchors": {
|
|
176
|
+
"context-map": "#context-map",
|
|
177
|
+
"integration": "#integration-events",
|
|
178
|
+
"acl": "#anti-corruption-layer"
|
|
179
|
+
},
|
|
180
|
+
"digest": "Each bounded context has its own model, ubiquitous language, and database schema. Communicate between contexts via integration events or anti-corruption layers. Never share domain objects across context boundaries.",
|
|
181
|
+
"stacks": [
|
|
182
|
+
"dotnet"
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"id": "architecture-ddd-complexity-levels",
|
|
187
|
+
"name": "complexity levels",
|
|
188
|
+
"path": "architecture/ddd/complexity-levels.md",
|
|
189
|
+
"category": "architecture",
|
|
190
|
+
"subcategory": "ddd",
|
|
191
|
+
"tags": [
|
|
192
|
+
"architecture",
|
|
193
|
+
"ddd"
|
|
194
|
+
],
|
|
195
|
+
"aliases": [
|
|
196
|
+
"DDD level",
|
|
197
|
+
"domain complexity",
|
|
198
|
+
"CRUD vs DDD",
|
|
199
|
+
"complexity decision tree",
|
|
200
|
+
"domain model level"
|
|
201
|
+
],
|
|
202
|
+
"anchors": {
|
|
203
|
+
"decision-tree": "#decision-tree",
|
|
204
|
+
"level1": "#level-1-crud",
|
|
205
|
+
"level2": "#level-2-business-logic",
|
|
206
|
+
"level3": "#level-3-bounded-context"
|
|
207
|
+
},
|
|
208
|
+
"digest": "Level 1 CRUD: simple entity + service. Level 2 Business Logic: AggregateRoot, ValueObjects, DomainEvents, CQRS. Level 3 Bounded Context: explicit BC isolation, Integration Events. Use 5-question decision tree to determine level before designing.",
|
|
209
|
+
"stacks": [
|
|
210
|
+
"dotnet"
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "architecture-ddd-entities",
|
|
215
|
+
"name": "entities",
|
|
216
|
+
"path": "architecture/ddd/entities.md",
|
|
217
|
+
"category": "architecture",
|
|
218
|
+
"subcategory": "ddd",
|
|
219
|
+
"tags": [
|
|
220
|
+
"architecture",
|
|
221
|
+
"ddd"
|
|
222
|
+
],
|
|
223
|
+
"aliases": [
|
|
224
|
+
"DDD entity",
|
|
225
|
+
"domain entity",
|
|
226
|
+
"entity class",
|
|
227
|
+
"entity ID",
|
|
228
|
+
"entity lifecycle"
|
|
229
|
+
],
|
|
230
|
+
"anchors": {
|
|
231
|
+
"identity": "#entity-identity",
|
|
232
|
+
"lifecycle": "#entity-lifecycle"
|
|
233
|
+
},
|
|
234
|
+
"digest": "Entities have unique identity that persists through state changes. Identity is the only equality criterion. Mutable state belongs inside the entity, not the service. Avoid anemic entities — put domain logic where the data lives.",
|
|
235
|
+
"stacks": [
|
|
236
|
+
"dotnet"
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "architecture-ddd-ubiquitous-language",
|
|
241
|
+
"name": "ubiquitous language",
|
|
242
|
+
"path": "architecture/ddd/ubiquitous-language.md",
|
|
243
|
+
"category": "architecture",
|
|
244
|
+
"subcategory": "ddd",
|
|
245
|
+
"tags": [
|
|
246
|
+
"architecture",
|
|
247
|
+
"ddd"
|
|
248
|
+
],
|
|
249
|
+
"aliases": [
|
|
250
|
+
"ubiquitous language",
|
|
251
|
+
"domain language",
|
|
252
|
+
"shared vocabulary",
|
|
253
|
+
"domain glossary"
|
|
254
|
+
],
|
|
255
|
+
"anchors": {
|
|
256
|
+
"glossary": "#domain-glossary",
|
|
257
|
+
"naming": "#naming-from-domain"
|
|
258
|
+
},
|
|
259
|
+
"digest": "Use business domain terms directly in code — no translation layer between what the domain expert says and what the code says. If the business says 'Order', the code has Order not SalesTransaction. Maintain a living glossary. Inconsistent naming = inconsistent models.",
|
|
260
|
+
"stacks": [
|
|
261
|
+
"dotnet"
|
|
262
|
+
]
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"id": "architecture-ddd-value-objects",
|
|
266
|
+
"name": "value objects",
|
|
267
|
+
"path": "architecture/ddd/value-objects.md",
|
|
268
|
+
"category": "architecture",
|
|
269
|
+
"subcategory": "ddd",
|
|
270
|
+
"tags": [
|
|
271
|
+
"architecture",
|
|
272
|
+
"ddd"
|
|
273
|
+
],
|
|
274
|
+
"aliases": [
|
|
275
|
+
"value object",
|
|
276
|
+
"VO",
|
|
277
|
+
"immutable value",
|
|
278
|
+
"domain value type",
|
|
279
|
+
"strongly typed"
|
|
280
|
+
],
|
|
281
|
+
"anchors": {
|
|
282
|
+
"equality": "#equality-by-value",
|
|
283
|
+
"validation": "#value-object-validation",
|
|
284
|
+
"factory": "#static-factory-method"
|
|
285
|
+
},
|
|
286
|
+
"digest": "Value objects are immutable and identified by their properties, not ID. Override equality by value. Create via static factory method with validation. Use for Money, Email, Coordinates, DateRange — any domain concept with rules.",
|
|
287
|
+
"stacks": [
|
|
288
|
+
"dotnet"
|
|
289
|
+
]
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"id": "architecture-vertical-slice-vertical-slice",
|
|
293
|
+
"name": "vertical slice",
|
|
294
|
+
"path": "architecture/vertical-slice/vertical-slice.md",
|
|
295
|
+
"category": "architecture",
|
|
296
|
+
"subcategory": "vertical-slice",
|
|
297
|
+
"tags": [
|
|
298
|
+
"architecture",
|
|
299
|
+
"vertical-slice"
|
|
300
|
+
],
|
|
301
|
+
"aliases": [
|
|
302
|
+
"vertical slice",
|
|
303
|
+
"VSA",
|
|
304
|
+
"slice architecture",
|
|
305
|
+
"feature slice",
|
|
306
|
+
"CQRS slice"
|
|
307
|
+
],
|
|
308
|
+
"anchors": {
|
|
309
|
+
"structure": "#slice-structure",
|
|
310
|
+
"rules": "#slice-rules",
|
|
311
|
+
"cqrs": "#cqrs-in-slices"
|
|
312
|
+
},
|
|
313
|
+
"digest": "Organize by feature, not layer. Each slice contains Command/Query, Handler, Validator, Response. No cross-slice dependencies — shared code goes to a dedicated Shared project. Use MediatR for in-process CQRS dispatch.",
|
|
314
|
+
"stacks": [
|
|
315
|
+
"dotnet"
|
|
316
|
+
]
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"id": "backend-api-minimal-api",
|
|
320
|
+
"name": "minimal api",
|
|
321
|
+
"path": "backend/api/minimal-api.md",
|
|
322
|
+
"category": "backend",
|
|
323
|
+
"subcategory": "api",
|
|
324
|
+
"tags": [
|
|
325
|
+
"backend",
|
|
326
|
+
"api"
|
|
327
|
+
],
|
|
328
|
+
"aliases": [
|
|
329
|
+
"minimal api",
|
|
330
|
+
"minimal APIs",
|
|
331
|
+
".NET minimal API",
|
|
332
|
+
"route handler",
|
|
333
|
+
"MapGet"
|
|
334
|
+
],
|
|
335
|
+
"anchors": {
|
|
336
|
+
"endpoints": "#endpoint-registration",
|
|
337
|
+
"grouping": "#route-groups"
|
|
338
|
+
},
|
|
339
|
+
"digest": "Group endpoints by feature with MapGroup. Use typed results (TypedResults.Ok, TypedResults.NotFound) for Swagger accuracy. Register endpoint groups in extension methods, not Program.cs directly. Add [EndpointSummary] for OpenAPI docs. Prefer Minimal API over controllers for new code.",
|
|
340
|
+
"stacks": [
|
|
341
|
+
"dotnet"
|
|
342
|
+
]
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
"id": "backend-api-rest",
|
|
346
|
+
"name": "rest",
|
|
347
|
+
"path": "backend/api/rest.md",
|
|
348
|
+
"category": "backend",
|
|
349
|
+
"subcategory": "api",
|
|
350
|
+
"tags": [
|
|
351
|
+
"backend",
|
|
352
|
+
"api"
|
|
353
|
+
],
|
|
354
|
+
"aliases": [
|
|
355
|
+
"REST API",
|
|
356
|
+
"RESTful",
|
|
357
|
+
"HTTP API",
|
|
358
|
+
"resource API",
|
|
359
|
+
"HTTP methods"
|
|
360
|
+
],
|
|
361
|
+
"anchors": {
|
|
362
|
+
"resources": "#resource-design",
|
|
363
|
+
"errors": "#error-responses"
|
|
364
|
+
},
|
|
365
|
+
"digest": "Resources are nouns, HTTP verbs are actions. GET /users, POST /users, PUT /users/{id}, DELETE /users/{id}. 201+Location for creation, 204 for deletion. Use RFC 9457 ProblemDetails for all errors. Cursor-based pagination for large collections. API versioning via URL path (/v1/).",
|
|
366
|
+
"stacks": [
|
|
367
|
+
"dotnet"
|
|
368
|
+
]
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"id": "backend-api-validation",
|
|
372
|
+
"name": "validation",
|
|
373
|
+
"path": "backend/api/validation.md",
|
|
374
|
+
"category": "backend",
|
|
375
|
+
"subcategory": "api",
|
|
376
|
+
"tags": [
|
|
377
|
+
"backend",
|
|
378
|
+
"api"
|
|
379
|
+
],
|
|
380
|
+
"aliases": [
|
|
381
|
+
"FluentValidation",
|
|
382
|
+
"input validation",
|
|
383
|
+
"request validation",
|
|
384
|
+
"API validation",
|
|
385
|
+
"model validation"
|
|
386
|
+
],
|
|
387
|
+
"anchors": {
|
|
388
|
+
"fluent": "#fluentvalidation-setup",
|
|
389
|
+
"rules": "#validation-rules"
|
|
390
|
+
},
|
|
391
|
+
"digest": "Use FluentValidation for all request validation. Register validators as scoped services. Return 422 UnprocessableEntity with field-level error messages. Validate at API boundary — not inside domain logic. Never trust client-side validation alone.",
|
|
392
|
+
"stacks": [
|
|
393
|
+
"dotnet"
|
|
394
|
+
]
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"id": "backend-authentication-passkeys",
|
|
398
|
+
"name": "passkeys",
|
|
399
|
+
"path": "backend/authentication/passkeys.md",
|
|
400
|
+
"category": "backend",
|
|
401
|
+
"subcategory": "authentication",
|
|
402
|
+
"tags": [
|
|
403
|
+
"backend",
|
|
404
|
+
"authentication"
|
|
405
|
+
],
|
|
406
|
+
"aliases": [
|
|
407
|
+
"passkeys",
|
|
408
|
+
"WebAuthn",
|
|
409
|
+
"FIDO2",
|
|
410
|
+
"passwordless",
|
|
411
|
+
"biometric auth"
|
|
412
|
+
],
|
|
413
|
+
"anchors": {
|
|
414
|
+
"registration": "#passkey-registration",
|
|
415
|
+
"authentication": "#passkey-authentication"
|
|
416
|
+
},
|
|
417
|
+
"digest": "Implement WebAuthn/FIDO2 for passwordless authentication. Registration: generate challenge → verify attestation → store credential. Authentication: generate challenge → verify assertion → issue JWT. Use ASP.NET Core Identity with FIDO2 library. Always store relying party ID as domain, not localhost.",
|
|
418
|
+
"stacks": [
|
|
419
|
+
"dotnet"
|
|
420
|
+
]
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"id": "backend-database-ef-core",
|
|
424
|
+
"name": "ef core",
|
|
425
|
+
"path": "backend/database/ef-core.md",
|
|
426
|
+
"category": "backend",
|
|
427
|
+
"subcategory": "database",
|
|
428
|
+
"tags": [
|
|
429
|
+
"backend",
|
|
430
|
+
"database"
|
|
431
|
+
],
|
|
432
|
+
"aliases": [
|
|
433
|
+
"Entity Framework",
|
|
434
|
+
"EF Core",
|
|
435
|
+
"DbContext",
|
|
436
|
+
"LINQ queries",
|
|
437
|
+
"ORM"
|
|
438
|
+
],
|
|
439
|
+
"anchors": {
|
|
440
|
+
"dbcontext": "#dbcontext-patterns",
|
|
441
|
+
"queries": "#query-optimization",
|
|
442
|
+
"migrations": "#migration-strategy"
|
|
443
|
+
},
|
|
444
|
+
"digest": "Use Scoped DbContext per request. Never expose IQueryable outside repository. Use AsNoTracking for read-only queries. Batch writes with SaveChangesAsync. Avoid N+1 queries — use Include for eager loading. Never use lazy loading in production.",
|
|
445
|
+
"stacks": [
|
|
446
|
+
"dotnet"
|
|
447
|
+
]
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"id": "backend-database-migrations",
|
|
451
|
+
"name": "migrations",
|
|
452
|
+
"path": "backend/database/migrations.md",
|
|
453
|
+
"category": "backend",
|
|
454
|
+
"subcategory": "database",
|
|
455
|
+
"tags": [
|
|
456
|
+
"backend",
|
|
457
|
+
"database"
|
|
458
|
+
],
|
|
459
|
+
"aliases": [
|
|
460
|
+
"EF migrations",
|
|
461
|
+
"database migration",
|
|
462
|
+
"schema migration",
|
|
463
|
+
"dotnet ef",
|
|
464
|
+
"Add-Migration"
|
|
465
|
+
],
|
|
466
|
+
"anchors": {
|
|
467
|
+
"workflow": "#migration-workflow",
|
|
468
|
+
"production": "#production-migrations"
|
|
469
|
+
},
|
|
470
|
+
"digest": "Run migrations at app startup via MigrateAsync() only in dev. In production, apply migrations as part of CI/CD, never at runtime. Never modify existing migrations — always create a new one. Use meaningful names (Add-Migration AddUserEmailIndex). Test rollback on every migration.",
|
|
471
|
+
"stacks": [
|
|
472
|
+
"dotnet"
|
|
473
|
+
]
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"id": "backend-database-postgresql-database",
|
|
477
|
+
"name": "database",
|
|
478
|
+
"path": "backend/database/postgresql/database.md",
|
|
479
|
+
"category": "backend",
|
|
480
|
+
"subcategory": "database",
|
|
481
|
+
"tags": [
|
|
482
|
+
"backend",
|
|
483
|
+
"database",
|
|
484
|
+
"postgresql"
|
|
485
|
+
],
|
|
486
|
+
"aliases": [
|
|
487
|
+
"PostgreSQL",
|
|
488
|
+
"postgres",
|
|
489
|
+
"pg",
|
|
490
|
+
"database design",
|
|
491
|
+
"SQL schema"
|
|
492
|
+
],
|
|
493
|
+
"anchors": {
|
|
494
|
+
"schema": "#schema-design",
|
|
495
|
+
"indexes": "#index-strategy"
|
|
496
|
+
},
|
|
497
|
+
"digest": "Use timestamptz for all timestamps (not timestamp). UUID primary keys for public-facing IDs. Add indexes on FK columns and frequently filtered columns. Use GIN indexes for JSON/array columns. JSONB over JSON. Row-level security for multi-tenant. Never store binary in columns — use storage URLs.",
|
|
498
|
+
"stacks": [
|
|
499
|
+
"dotnet"
|
|
500
|
+
]
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"id": "backend-database-repository-patterns",
|
|
504
|
+
"name": "repository patterns",
|
|
505
|
+
"path": "backend/database/repository-patterns.md",
|
|
506
|
+
"category": "backend",
|
|
507
|
+
"subcategory": "database",
|
|
508
|
+
"tags": [
|
|
509
|
+
"backend",
|
|
510
|
+
"database"
|
|
511
|
+
],
|
|
512
|
+
"aliases": [
|
|
513
|
+
"repository",
|
|
514
|
+
"IRepository",
|
|
515
|
+
"Unit of Work",
|
|
516
|
+
"data access",
|
|
517
|
+
"repository pattern"
|
|
518
|
+
],
|
|
519
|
+
"anchors": {
|
|
520
|
+
"pattern": "#repository-pattern",
|
|
521
|
+
"uow": "#unit-of-work"
|
|
522
|
+
},
|
|
523
|
+
"digest": "Repository abstracts data access behind an interface. Return domain objects, not IQueryable. Unit of Work coordinates multiple repository operations in one transaction. Avoid generic repositories — domain-specific repositories express intent better. Test repositories with in-memory providers or integration tests.",
|
|
524
|
+
"stacks": [
|
|
525
|
+
"dotnet"
|
|
526
|
+
]
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"id": "backend-database-vector-search-rag",
|
|
530
|
+
"name": "vector search rag",
|
|
531
|
+
"path": "backend/database/vector-search-rag.md",
|
|
532
|
+
"category": "backend",
|
|
533
|
+
"subcategory": "database",
|
|
534
|
+
"tags": [
|
|
535
|
+
"backend",
|
|
536
|
+
"database"
|
|
537
|
+
],
|
|
538
|
+
"aliases": [
|
|
539
|
+
"vector search",
|
|
540
|
+
"RAG",
|
|
541
|
+
"embeddings",
|
|
542
|
+
"pgvector",
|
|
543
|
+
"semantic search"
|
|
544
|
+
],
|
|
545
|
+
"anchors": {
|
|
546
|
+
"chunking": "#chunking-strategy",
|
|
547
|
+
"retrieval": "#retrieval-patterns"
|
|
548
|
+
},
|
|
549
|
+
"digest": "Chunk documents with 512 token size and 50 token overlap for RAG. Embed with text-embedding-3-small. Store embedding + metadata (source, chunk index). Retrieve top-k=5 by cosine similarity. Re-rank before injecting into LLM context. Use pgvector HNSW index for performance at scale.",
|
|
550
|
+
"stacks": [
|
|
551
|
+
"dotnet"
|
|
552
|
+
]
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"id": "backend-dotnet-async",
|
|
556
|
+
"name": "async",
|
|
557
|
+
"path": "backend/dotnet/async.md",
|
|
558
|
+
"category": "backend",
|
|
559
|
+
"subcategory": "dotnet",
|
|
560
|
+
"tags": [
|
|
561
|
+
"backend",
|
|
562
|
+
"dotnet"
|
|
563
|
+
],
|
|
564
|
+
"aliases": [
|
|
565
|
+
"async/await",
|
|
566
|
+
"Task<T>",
|
|
567
|
+
"CancellationToken",
|
|
568
|
+
"ValueTask",
|
|
569
|
+
"async programming"
|
|
570
|
+
],
|
|
571
|
+
"anchors": {
|
|
572
|
+
"cancellation": "#cancellation-token-pattern",
|
|
573
|
+
"parallel": "#parallel-execution-patterns"
|
|
574
|
+
},
|
|
575
|
+
"digest": "Use CancellationToken in all async signatures. Prefer Task<T> over ValueTask<T> unless hot-path allocation is measured. Never async void except event handlers. Task.WhenAll for independent parallel ops.",
|
|
576
|
+
"stacks": [
|
|
577
|
+
"dotnet"
|
|
578
|
+
]
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"id": "backend-dotnet-core",
|
|
582
|
+
"name": "core",
|
|
583
|
+
"path": "backend/dotnet/core.md",
|
|
584
|
+
"category": "backend",
|
|
585
|
+
"subcategory": "dotnet",
|
|
586
|
+
"tags": [
|
|
587
|
+
"backend",
|
|
588
|
+
"dotnet"
|
|
589
|
+
],
|
|
590
|
+
"aliases": [
|
|
591
|
+
".NET core",
|
|
592
|
+
"dotnet core",
|
|
593
|
+
"C# patterns",
|
|
594
|
+
"backend core",
|
|
595
|
+
"dotnet standards"
|
|
596
|
+
],
|
|
597
|
+
"anchors": {
|
|
598
|
+
"di": "#dependency-injection",
|
|
599
|
+
"services": "#service-registration",
|
|
600
|
+
"security": "#security-patterns"
|
|
601
|
+
},
|
|
602
|
+
"digest": "Register services in Program.cs with AddScoped/AddSingleton/AddTransient. Use constructor injection only — never service locator. Apply interface segregation. Validate all input at API boundary. Never expose raw exceptions to clients.",
|
|
603
|
+
"stacks": [
|
|
604
|
+
"dotnet"
|
|
605
|
+
]
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
"id": "backend-dotnet-di",
|
|
609
|
+
"name": "di",
|
|
610
|
+
"path": "backend/dotnet/di.md",
|
|
611
|
+
"category": "backend",
|
|
612
|
+
"subcategory": "dotnet",
|
|
613
|
+
"tags": [
|
|
614
|
+
"backend",
|
|
615
|
+
"dotnet"
|
|
616
|
+
],
|
|
617
|
+
"aliases": [
|
|
618
|
+
"dependency injection",
|
|
619
|
+
"IoC",
|
|
620
|
+
"DI container",
|
|
621
|
+
"service registration",
|
|
622
|
+
"inversion of control"
|
|
623
|
+
],
|
|
624
|
+
"anchors": {
|
|
625
|
+
"patterns": "#di-patterns",
|
|
626
|
+
"anti-patterns": "#di-anti-patterns"
|
|
627
|
+
},
|
|
628
|
+
"digest": "Use constructor injection exclusively. Register concrete types with interfaces. Never use service locator or static factories. Scoped services must not be injected into singletons. Validate dependency graph at startup with ValidateOnBuild.",
|
|
629
|
+
"stacks": [
|
|
630
|
+
"dotnet"
|
|
631
|
+
]
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
"id": "backend-dotnet-program-cs-checklist",
|
|
635
|
+
"name": "program cs checklist",
|
|
636
|
+
"path": "backend/dotnet/program-cs-checklist.md",
|
|
637
|
+
"category": "backend",
|
|
638
|
+
"subcategory": "dotnet",
|
|
639
|
+
"tags": [
|
|
640
|
+
"backend",
|
|
641
|
+
"dotnet"
|
|
642
|
+
],
|
|
643
|
+
"aliases": [
|
|
644
|
+
"program.cs",
|
|
645
|
+
"startup configuration",
|
|
646
|
+
"NuGet packages",
|
|
647
|
+
"package setup",
|
|
648
|
+
"app bootstrap"
|
|
649
|
+
],
|
|
650
|
+
"anchors": {
|
|
651
|
+
"nuget": "#nuget-packages",
|
|
652
|
+
"middleware": "#middleware-order"
|
|
653
|
+
},
|
|
654
|
+
"digest": "Configure middleware in order: CORS → Auth → Routing → Endpoints. Register all required NuGet packages. Enable Swagger in dev only. Apply global exception handler. Configure HTTPS redirection. Enable CORS before Auth.",
|
|
655
|
+
"stacks": [
|
|
656
|
+
"dotnet"
|
|
657
|
+
]
|
|
658
|
+
},
|
|
659
|
+
{
|
|
660
|
+
"id": "backend-integrations-asaas-asaas-api",
|
|
661
|
+
"name": "asaas api",
|
|
662
|
+
"path": "backend/integrations/asaas/asaas-api.md",
|
|
663
|
+
"category": "backend",
|
|
664
|
+
"subcategory": "integrations",
|
|
665
|
+
"tags": [
|
|
666
|
+
"backend",
|
|
667
|
+
"integrations",
|
|
668
|
+
"asaas"
|
|
669
|
+
],
|
|
670
|
+
"aliases": [
|
|
671
|
+
"asaas",
|
|
672
|
+
"payment",
|
|
673
|
+
"PIX",
|
|
674
|
+
"boleto",
|
|
675
|
+
"Brazilian payment"
|
|
676
|
+
],
|
|
677
|
+
"anchors": {
|
|
678
|
+
"payments": "#payment-types",
|
|
679
|
+
"webhooks": "#webhook-handling"
|
|
680
|
+
},
|
|
681
|
+
"digest": "Use AsaasClient SDK — never call REST API directly. Register as scoped service. Implement webhook signature verification. Map SDK enums to domain enums at integration boundary. Use idempotency keys for retry safety. Test with Asaas sandbox environment.",
|
|
682
|
+
"stacks": [
|
|
683
|
+
"dotnet"
|
|
684
|
+
]
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
"id": "backend-integrations-clerk-clerk-auth",
|
|
688
|
+
"name": "clerk auth",
|
|
689
|
+
"path": "backend/integrations/clerk/clerk-auth.md",
|
|
690
|
+
"category": "backend",
|
|
691
|
+
"subcategory": "integrations",
|
|
692
|
+
"tags": [
|
|
693
|
+
"backend",
|
|
694
|
+
"integrations",
|
|
695
|
+
"clerk"
|
|
696
|
+
],
|
|
697
|
+
"aliases": [
|
|
698
|
+
"clerk",
|
|
699
|
+
"authentication",
|
|
700
|
+
"OAuth",
|
|
701
|
+
"JWT",
|
|
702
|
+
"session management"
|
|
703
|
+
],
|
|
704
|
+
"anchors": {
|
|
705
|
+
"setup": "#clerk-setup",
|
|
706
|
+
"middleware": "#auth-middleware"
|
|
707
|
+
},
|
|
708
|
+
"digest": "Add ClerkMiddleware to ASP.NET pipeline. Access userId via User.GetClerkUserId(). Configure allowed redirect URLs in Clerk dashboard. Use [Authorize] for protected endpoints. Never store passwords — Clerk manages credentials. Sync Clerk users to local DB on first login.",
|
|
709
|
+
"stacks": [
|
|
710
|
+
"dotnet"
|
|
711
|
+
]
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"id": "backend-integrations-hangfire-hangfire-jobs",
|
|
715
|
+
"name": "hangfire jobs",
|
|
716
|
+
"path": "backend/integrations/hangfire/hangfire-jobs.md",
|
|
717
|
+
"category": "backend",
|
|
718
|
+
"subcategory": "integrations",
|
|
719
|
+
"tags": [
|
|
720
|
+
"backend",
|
|
721
|
+
"integrations",
|
|
722
|
+
"hangfire"
|
|
723
|
+
],
|
|
724
|
+
"aliases": [
|
|
725
|
+
"hangfire",
|
|
726
|
+
"background jobs",
|
|
727
|
+
"scheduled jobs",
|
|
728
|
+
"recurring",
|
|
729
|
+
"cron",
|
|
730
|
+
"fire and forget"
|
|
731
|
+
],
|
|
732
|
+
"anchors": {
|
|
733
|
+
"jobs": "#job-types",
|
|
734
|
+
"retry": "#retry-policies"
|
|
735
|
+
},
|
|
736
|
+
"digest": "Use IDbContextFactory for scoped DB operations in jobs — never inject DbContext directly into job classes. BackgroundJob.Enqueue for fire-and-forget, RecurringJob.AddOrUpdate for cron. Add RetryCountAttribute for retries. Secure Hangfire Dashboard with auth in production. Never put long-running work in a single job — decompose.",
|
|
737
|
+
"stacks": [
|
|
738
|
+
"dotnet"
|
|
739
|
+
]
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
"id": "backend-integrations-resend-resend-email",
|
|
743
|
+
"name": "resend email",
|
|
744
|
+
"path": "backend/integrations/resend/resend-email.md",
|
|
745
|
+
"category": "backend",
|
|
746
|
+
"subcategory": "integrations",
|
|
747
|
+
"tags": [
|
|
748
|
+
"backend",
|
|
749
|
+
"integrations",
|
|
750
|
+
"resend"
|
|
751
|
+
],
|
|
752
|
+
"aliases": [
|
|
753
|
+
"resend",
|
|
754
|
+
"email",
|
|
755
|
+
"transactional email",
|
|
756
|
+
"SMTP",
|
|
757
|
+
"email notification"
|
|
758
|
+
],
|
|
759
|
+
"anchors": {
|
|
760
|
+
"sending": "#send-email",
|
|
761
|
+
"templates": "#email-templates"
|
|
762
|
+
},
|
|
763
|
+
"digest": "Register ResendClient as singleton. Provide both HTML and plain-text alternatives. Handle bounce/complaint webhooks to maintain sender reputation. Never send from test domains in production. Queue emails via Hangfire for reliability — don't send inline in request handlers.",
|
|
764
|
+
"stacks": [
|
|
765
|
+
"dotnet"
|
|
766
|
+
]
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
"id": "context-analytics",
|
|
770
|
+
"name": "analytics",
|
|
771
|
+
"path": "context/analytics.md",
|
|
772
|
+
"category": "context",
|
|
773
|
+
"subcategory": null,
|
|
774
|
+
"tags": [
|
|
775
|
+
"context"
|
|
776
|
+
],
|
|
777
|
+
"aliases": [
|
|
778
|
+
"analytics",
|
|
779
|
+
"GTM",
|
|
780
|
+
"GA4",
|
|
781
|
+
"event tracking",
|
|
782
|
+
"data layer"
|
|
783
|
+
],
|
|
784
|
+
"anchors": {
|
|
785
|
+
"events": "#event-tracking",
|
|
786
|
+
"setup": "#analytics-setup"
|
|
787
|
+
},
|
|
788
|
+
"digest": "Install GTM via component, not raw script. Track custom events via dataLayer.push. GA4 events follow snake_case naming. Define event schema before implementing. Never log PII in analytics events. Test event firing with GA4 DebugView or GTM Preview before production.",
|
|
789
|
+
"stacks": [
|
|
790
|
+
"*"
|
|
791
|
+
]
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
"id": "context-bundles",
|
|
795
|
+
"name": "bundles",
|
|
796
|
+
"path": "context/bundles.md",
|
|
797
|
+
"category": "context",
|
|
798
|
+
"subcategory": null,
|
|
799
|
+
"tags": [
|
|
800
|
+
"context"
|
|
801
|
+
],
|
|
802
|
+
"aliases": [
|
|
803
|
+
"context bundles",
|
|
804
|
+
"bundled context",
|
|
805
|
+
"spec bundles",
|
|
806
|
+
"feature bundles"
|
|
807
|
+
],
|
|
808
|
+
"anchors": {
|
|
809
|
+
"structure": "#bundle-structure",
|
|
810
|
+
"loading": "#context-loading"
|
|
811
|
+
},
|
|
812
|
+
"digest": "Bundle related context files to reduce per-agent injection overhead. Define bundle manifests listing included standards by scope. Agents load their assigned bundle, not the full context. Bundles are versioned — bump version when standards change significantly.",
|
|
813
|
+
"stacks": [
|
|
814
|
+
"*"
|
|
815
|
+
]
|
|
816
|
+
},
|
|
817
|
+
{
|
|
818
|
+
"id": "context-priming",
|
|
819
|
+
"name": "priming",
|
|
820
|
+
"path": "context/priming.md",
|
|
821
|
+
"category": "context",
|
|
822
|
+
"subcategory": null,
|
|
823
|
+
"tags": [
|
|
824
|
+
"context"
|
|
825
|
+
],
|
|
826
|
+
"aliases": [
|
|
827
|
+
"context priming",
|
|
828
|
+
"agent priming",
|
|
829
|
+
"system prompt",
|
|
830
|
+
"context injection"
|
|
831
|
+
],
|
|
832
|
+
"anchors": {
|
|
833
|
+
"patterns": "#priming-patterns",
|
|
834
|
+
"efficiency": "#context-efficiency"
|
|
835
|
+
},
|
|
836
|
+
"digest": "Prime agents with role + constraints + output format in the first message. Keep priming concise — under 200 tokens. Include only relevant standards for the current phase. Re-prime after context compaction. Never include full file contents when a digest suffices.",
|
|
837
|
+
"stacks": [
|
|
838
|
+
"*"
|
|
839
|
+
]
|
|
840
|
+
},
|
|
841
|
+
{
|
|
842
|
+
"id": "core-architecture",
|
|
843
|
+
"name": "architecture",
|
|
844
|
+
"path": "core/architecture.md",
|
|
845
|
+
"category": "core",
|
|
846
|
+
"subcategory": null,
|
|
847
|
+
"tags": [
|
|
848
|
+
"core"
|
|
849
|
+
],
|
|
850
|
+
"aliases": [
|
|
851
|
+
"architecture",
|
|
852
|
+
"clean architecture",
|
|
853
|
+
"layered architecture",
|
|
854
|
+
"SOLID",
|
|
855
|
+
"design principles"
|
|
856
|
+
],
|
|
857
|
+
"anchors": {
|
|
858
|
+
"layers": "#layer-boundaries",
|
|
859
|
+
"patterns": "#architectural-patterns"
|
|
860
|
+
},
|
|
861
|
+
"digest": "Apply Clean Architecture: dependency rule points inward (Infrastructure → Application → Domain). Domain has no external dependencies. Application orchestrates use cases. Infrastructure implements ports. SOLID principles at every layer. Never skip architecture review for cross-cutting concerns.",
|
|
862
|
+
"stacks": [
|
|
863
|
+
"*"
|
|
864
|
+
]
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"id": "core-coding",
|
|
868
|
+
"name": "coding",
|
|
869
|
+
"path": "core/coding.md",
|
|
870
|
+
"category": "core",
|
|
871
|
+
"subcategory": null,
|
|
872
|
+
"tags": [
|
|
873
|
+
"core"
|
|
874
|
+
],
|
|
875
|
+
"aliases": [
|
|
876
|
+
"coding standards",
|
|
877
|
+
"code style",
|
|
878
|
+
"clean code",
|
|
879
|
+
"naming conventions",
|
|
880
|
+
"code quality"
|
|
881
|
+
],
|
|
882
|
+
"anchors": {
|
|
883
|
+
"naming": "#naming-conventions",
|
|
884
|
+
"patterns": "#code-patterns"
|
|
885
|
+
},
|
|
886
|
+
"digest": "PascalCase for types/methods, camelCase for fields/locals, UPPER_SNAKE_CASE for constants. Methods are verbs, classes are nouns. Single responsibility per class/method. Max 30 lines per method. Prefer immutability. No magic strings — use constants or enums. Every public API has XML docs.",
|
|
887
|
+
"stacks": [
|
|
888
|
+
"*"
|
|
889
|
+
]
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"id": "core-git-branching-strategy",
|
|
893
|
+
"name": "git branching strategy",
|
|
894
|
+
"path": "core/git-branching-strategy.md",
|
|
895
|
+
"category": "core",
|
|
896
|
+
"subcategory": null,
|
|
897
|
+
"tags": [
|
|
898
|
+
"core"
|
|
899
|
+
],
|
|
900
|
+
"aliases": [
|
|
901
|
+
"git flow",
|
|
902
|
+
"branch strategy",
|
|
903
|
+
"feature branch",
|
|
904
|
+
"gitflow",
|
|
905
|
+
"branch naming"
|
|
906
|
+
],
|
|
907
|
+
"anchors": {
|
|
908
|
+
"branching": "#branch-naming",
|
|
909
|
+
"workflow": "#git-workflow"
|
|
910
|
+
},
|
|
911
|
+
"digest": "Branch naming: feature/{ticket}-{description}, fix/{ticket}-{description}. main is production-ready, develop is integration branch. PRs require passing CI and at least one review. Squash merge for features. Delete branches after merge. Protect main and develop with required checks.",
|
|
912
|
+
"stacks": [
|
|
913
|
+
"*"
|
|
914
|
+
]
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
"id": "core-git",
|
|
918
|
+
"name": "git",
|
|
919
|
+
"path": "core/git.md",
|
|
920
|
+
"category": "core",
|
|
921
|
+
"subcategory": null,
|
|
922
|
+
"tags": [
|
|
923
|
+
"core"
|
|
924
|
+
],
|
|
925
|
+
"aliases": [
|
|
926
|
+
"git",
|
|
927
|
+
"commit messages",
|
|
928
|
+
"conventional commits",
|
|
929
|
+
"changelog",
|
|
930
|
+
"git hooks"
|
|
931
|
+
],
|
|
932
|
+
"anchors": {
|
|
933
|
+
"commits": "#commit-format",
|
|
934
|
+
"hooks": "#pre-commit-hooks"
|
|
935
|
+
},
|
|
936
|
+
"digest": "Conventional Commits: feat, fix, chore, docs, refactor, test, style. Scope in parentheses: feat(auth): add JWT validation. Breaking changes use BREAKING CHANGE footer. Commits are atomic — one logical change per commit. Pre-commit hooks run build + lint. Never commit .env or secrets.",
|
|
937
|
+
"stacks": [
|
|
938
|
+
"*"
|
|
939
|
+
]
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
"id": "core-testing",
|
|
943
|
+
"name": "testing",
|
|
944
|
+
"path": "core/testing.md",
|
|
945
|
+
"category": "core",
|
|
946
|
+
"subcategory": null,
|
|
947
|
+
"tags": [
|
|
948
|
+
"core"
|
|
949
|
+
],
|
|
950
|
+
"aliases": [
|
|
951
|
+
"testing",
|
|
952
|
+
"unit tests",
|
|
953
|
+
"integration tests",
|
|
954
|
+
"TDD",
|
|
955
|
+
"test coverage",
|
|
956
|
+
"xUnit"
|
|
957
|
+
],
|
|
958
|
+
"anchors": {
|
|
959
|
+
"patterns": "#test-patterns",
|
|
960
|
+
"coverage": "#coverage-requirements"
|
|
961
|
+
},
|
|
962
|
+
"digest": "Arrange-Act-Assert in every test. Unit tests for domain logic — no DB or HTTP. Integration tests use TestContainers for real dependencies. Minimum 80% coverage on domain layer. Mock external services at system boundaries. Test names: Given_When_Then or MethodName_Scenario_ExpectedResult.",
|
|
963
|
+
"stacks": [
|
|
964
|
+
"*"
|
|
965
|
+
]
|
|
966
|
+
},
|
|
967
|
+
{
|
|
968
|
+
"id": "data-nosql-blob-storage",
|
|
969
|
+
"name": "blob storage",
|
|
970
|
+
"path": "data/nosql/blob-storage.md",
|
|
971
|
+
"category": "data",
|
|
972
|
+
"subcategory": "nosql",
|
|
973
|
+
"tags": [
|
|
974
|
+
"data",
|
|
975
|
+
"nosql"
|
|
976
|
+
],
|
|
977
|
+
"aliases": [
|
|
978
|
+
"blob storage",
|
|
979
|
+
"Azure Storage",
|
|
980
|
+
"file storage",
|
|
981
|
+
"BlobServiceClient",
|
|
982
|
+
"object storage"
|
|
983
|
+
],
|
|
984
|
+
"anchors": {
|
|
985
|
+
"upload": "#upload-patterns",
|
|
986
|
+
"access": "#sas-tokens"
|
|
987
|
+
},
|
|
988
|
+
"digest": "Use BlobServiceClient with DefaultAzureCredential — never hardcode connection strings. Organize by container/virtual-path. Generate SAS tokens for client-side access with minimum permissions and short TTL. Set content-type on upload. Use CDN for public assets. Enable versioning + soft delete for business data.",
|
|
989
|
+
"stacks": [
|
|
990
|
+
"dotnet",
|
|
991
|
+
"azure"
|
|
992
|
+
]
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
"id": "data-nosql-cache-redis",
|
|
996
|
+
"name": "redis",
|
|
997
|
+
"path": "data/nosql/cache/redis.md",
|
|
998
|
+
"category": "data",
|
|
999
|
+
"subcategory": "nosql",
|
|
1000
|
+
"tags": [
|
|
1001
|
+
"data",
|
|
1002
|
+
"nosql",
|
|
1003
|
+
"cache"
|
|
1004
|
+
],
|
|
1005
|
+
"aliases": [
|
|
1006
|
+
"redis",
|
|
1007
|
+
"cache",
|
|
1008
|
+
"distributed cache",
|
|
1009
|
+
"IDistributedCache",
|
|
1010
|
+
"cache-aside",
|
|
1011
|
+
"StackExchange.Redis"
|
|
1012
|
+
],
|
|
1013
|
+
"anchors": {
|
|
1014
|
+
"patterns": "#cache-patterns",
|
|
1015
|
+
"invalidation": "#cache-invalidation"
|
|
1016
|
+
},
|
|
1017
|
+
"digest": "IDistributedCache for cache-aside pattern. Set TTL on every entry — never cache without expiry. Serialize with System.Text.Json. Sliding expiration for sessions, absolute for computed results. Invalidate by key prefix. Redis eviction policy must be set (allkeys-lru). Never cache PII without encryption.",
|
|
1018
|
+
"stacks": [
|
|
1019
|
+
"dotnet",
|
|
1020
|
+
"azure"
|
|
1021
|
+
]
|
|
1022
|
+
},
|
|
1023
|
+
{
|
|
1024
|
+
"id": "data-nosql-cosmos-db",
|
|
1025
|
+
"name": "cosmos db",
|
|
1026
|
+
"path": "data/nosql/cosmos-db.md",
|
|
1027
|
+
"category": "data",
|
|
1028
|
+
"subcategory": "nosql",
|
|
1029
|
+
"tags": [
|
|
1030
|
+
"data",
|
|
1031
|
+
"nosql"
|
|
1032
|
+
],
|
|
1033
|
+
"aliases": [
|
|
1034
|
+
"cosmos",
|
|
1035
|
+
"CosmosDB",
|
|
1036
|
+
"document database",
|
|
1037
|
+
"partition key",
|
|
1038
|
+
"RUs"
|
|
1039
|
+
],
|
|
1040
|
+
"anchors": {
|
|
1041
|
+
"modeling": "#document-modeling",
|
|
1042
|
+
"queries": "#query-patterns"
|
|
1043
|
+
},
|
|
1044
|
+
"digest": "Choose partition key with high cardinality for even distribution. Design documents for single-partition reads. Enable TTL for ephemeral data. Prefer point reads (O(1)) over cross-partition queries. Set provisioned throughput based on measured RUs. Use change feed for event-driven processing.",
|
|
1045
|
+
"stacks": [
|
|
1046
|
+
"dotnet",
|
|
1047
|
+
"azure"
|
|
1048
|
+
]
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"id": "data-vector-search-azure-ai-search",
|
|
1052
|
+
"name": "azure ai search",
|
|
1053
|
+
"path": "data/vector-search/azure-ai-search.md",
|
|
1054
|
+
"category": "data",
|
|
1055
|
+
"subcategory": "vector-search",
|
|
1056
|
+
"tags": [
|
|
1057
|
+
"data",
|
|
1058
|
+
"vector-search"
|
|
1059
|
+
],
|
|
1060
|
+
"aliases": [
|
|
1061
|
+
"Azure AI Search",
|
|
1062
|
+
"cognitive search",
|
|
1063
|
+
"vector search",
|
|
1064
|
+
"hybrid search",
|
|
1065
|
+
"semantic ranking"
|
|
1066
|
+
],
|
|
1067
|
+
"anchors": {
|
|
1068
|
+
"indexing": "#index-setup",
|
|
1069
|
+
"queries": "#search-queries"
|
|
1070
|
+
},
|
|
1071
|
+
"digest": "Create index with semantic configuration for hybrid search (keyword + vector). Batch index uploads (1000 docs/batch). Use OData filters for pre-filtering before vector search. Apply RRF fusion for hybrid ranking. Set up incremental indexing for updates. Add enrichment pipeline for PDFs/images.",
|
|
1072
|
+
"stacks": [
|
|
1073
|
+
"dotnet",
|
|
1074
|
+
"azure"
|
|
1075
|
+
]
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
"id": "data-vector-search-rag-chunking",
|
|
1079
|
+
"name": "rag chunking",
|
|
1080
|
+
"path": "data/vector-search/rag-chunking.md",
|
|
1081
|
+
"category": "data",
|
|
1082
|
+
"subcategory": "vector-search",
|
|
1083
|
+
"tags": [
|
|
1084
|
+
"data",
|
|
1085
|
+
"vector-search"
|
|
1086
|
+
],
|
|
1087
|
+
"aliases": [
|
|
1088
|
+
"RAG chunking",
|
|
1089
|
+
"document chunking",
|
|
1090
|
+
"text splitting",
|
|
1091
|
+
"chunk overlap",
|
|
1092
|
+
"embedding chunks"
|
|
1093
|
+
],
|
|
1094
|
+
"anchors": {
|
|
1095
|
+
"strategies": "#chunking-strategies",
|
|
1096
|
+
"retrieval": "#retrieval-pipeline"
|
|
1097
|
+
},
|
|
1098
|
+
"digest": "Recursive character splitting: 512 token chunks, 50 token overlap. Embed with text-embedding-3-small (1536 dims). Store chunk + metadata (source, page, section). Retrieve top-k=5 by cosine similarity. Re-rank with cross-encoder before LLM injection. Evaluate retrieval quality with RAGAS.",
|
|
1099
|
+
"stacks": [
|
|
1100
|
+
"dotnet",
|
|
1101
|
+
"azure"
|
|
1102
|
+
]
|
|
1103
|
+
},
|
|
1104
|
+
{
|
|
1105
|
+
"id": "frontend-blazor-design-checklist",
|
|
1106
|
+
"name": "design checklist",
|
|
1107
|
+
"path": "frontend/blazor/design-checklist.md",
|
|
1108
|
+
"category": "frontend",
|
|
1109
|
+
"subcategory": "blazor",
|
|
1110
|
+
"tags": [
|
|
1111
|
+
"frontend",
|
|
1112
|
+
"blazor"
|
|
1113
|
+
],
|
|
1114
|
+
"aliases": [
|
|
1115
|
+
"blazor checklist",
|
|
1116
|
+
"blazor design review",
|
|
1117
|
+
"UI checklist",
|
|
1118
|
+
"component checklist"
|
|
1119
|
+
],
|
|
1120
|
+
"anchors": {
|
|
1121
|
+
"components": "#component-checklist",
|
|
1122
|
+
"accessibility": "#a11y-checklist"
|
|
1123
|
+
},
|
|
1124
|
+
"digest": "Every Blazor component must: use @inject not constructor injection, define loading and error states, implement IDisposable for event subscriptions, use CancellationToken for async ops. Fluent UI: use DataGrid not custom tables, FluentDialog for modals, FluentTooltip for hints. No hardcoded colors.",
|
|
1125
|
+
"stacks": [
|
|
1126
|
+
"blazor"
|
|
1127
|
+
]
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
"id": "frontend-blazor-fluent-ui-setup",
|
|
1131
|
+
"name": "fluent ui setup",
|
|
1132
|
+
"path": "frontend/blazor/fluent-ui-setup.md",
|
|
1133
|
+
"category": "frontend",
|
|
1134
|
+
"subcategory": "blazor",
|
|
1135
|
+
"tags": [
|
|
1136
|
+
"frontend",
|
|
1137
|
+
"blazor"
|
|
1138
|
+
],
|
|
1139
|
+
"aliases": [
|
|
1140
|
+
"fluent ui setup",
|
|
1141
|
+
"blazor fluent",
|
|
1142
|
+
"Microsoft Fluent UI",
|
|
1143
|
+
"FluentUI install"
|
|
1144
|
+
],
|
|
1145
|
+
"anchors": {
|
|
1146
|
+
"setup": "#package-setup",
|
|
1147
|
+
"theme": "#theme-configuration"
|
|
1148
|
+
},
|
|
1149
|
+
"digest": "Install Microsoft.FluentUI.AspNetCore.Components. Register: builder.Services.AddFluentUIComponents(). Add <FluentDesignTheme> to MainLayout.razor. Install FluentIcons package separately. Set CachingEnabled=true for icons in production. Configure theme via --accent-color CSS variable in app.css.",
|
|
1150
|
+
"stacks": [
|
|
1151
|
+
"blazor"
|
|
1152
|
+
]
|
|
1153
|
+
},
|
|
1154
|
+
{
|
|
1155
|
+
"id": "frontend-blazor-fluent-ui",
|
|
1156
|
+
"name": "fluent ui",
|
|
1157
|
+
"path": "frontend/blazor/fluent-ui.md",
|
|
1158
|
+
"category": "frontend",
|
|
1159
|
+
"subcategory": "blazor",
|
|
1160
|
+
"tags": [
|
|
1161
|
+
"frontend",
|
|
1162
|
+
"blazor"
|
|
1163
|
+
],
|
|
1164
|
+
"aliases": [
|
|
1165
|
+
"fluent ui components",
|
|
1166
|
+
"FluentDataGrid",
|
|
1167
|
+
"FluentDialog",
|
|
1168
|
+
"FluentButton",
|
|
1169
|
+
"FluentCombobox"
|
|
1170
|
+
],
|
|
1171
|
+
"anchors": {
|
|
1172
|
+
"grid": "#data-grid",
|
|
1173
|
+
"forms": "#form-components"
|
|
1174
|
+
},
|
|
1175
|
+
"digest": "Use FluentDataGrid with virtualization for >100 rows. FluentDialog requires DialogService injection. FluentTextField uses @bind-Value. FluentCombobox with @bind-Value and TOption type param. Never mix FluentUI and MudBlazor in the same project. Use Appearance enum for button variants.",
|
|
1176
|
+
"stacks": [
|
|
1177
|
+
"blazor"
|
|
1178
|
+
]
|
|
1179
|
+
},
|
|
1180
|
+
{
|
|
1181
|
+
"id": "frontend-blazor-html-conversion",
|
|
1182
|
+
"name": "html conversion",
|
|
1183
|
+
"path": "frontend/blazor/html-conversion.md",
|
|
1184
|
+
"category": "frontend",
|
|
1185
|
+
"subcategory": "blazor",
|
|
1186
|
+
"tags": [
|
|
1187
|
+
"frontend",
|
|
1188
|
+
"blazor"
|
|
1189
|
+
],
|
|
1190
|
+
"aliases": [
|
|
1191
|
+
"html to blazor",
|
|
1192
|
+
"blazor migration",
|
|
1193
|
+
"html conversion",
|
|
1194
|
+
"razor conversion"
|
|
1195
|
+
],
|
|
1196
|
+
"anchors": {
|
|
1197
|
+
"mapping": "#html-to-blazor-mapping",
|
|
1198
|
+
"components": "#component-patterns"
|
|
1199
|
+
},
|
|
1200
|
+
"digest": "Convert <div> containers to <FluentStack> or <FluentGrid>. Replace <input> with FluentTextField/FluentCheckbox/FluentSelect. Convert <table> to FluentDataGrid. Replace class= with Class=. Event handlers: onclick → @onclick. Use CascadingValue for theme propagation. Blazor-specific: @ref, @key, @bind.",
|
|
1201
|
+
"stacks": [
|
|
1202
|
+
"blazor"
|
|
1203
|
+
]
|
|
1204
|
+
},
|
|
1205
|
+
{
|
|
1206
|
+
"id": "frontend-blazor-lifecycle",
|
|
1207
|
+
"name": "lifecycle",
|
|
1208
|
+
"path": "frontend/blazor/lifecycle.md",
|
|
1209
|
+
"category": "frontend",
|
|
1210
|
+
"subcategory": "blazor",
|
|
1211
|
+
"tags": [
|
|
1212
|
+
"frontend",
|
|
1213
|
+
"blazor"
|
|
1214
|
+
],
|
|
1215
|
+
"aliases": [
|
|
1216
|
+
"blazor lifecycle",
|
|
1217
|
+
"OnInitialized",
|
|
1218
|
+
"OnAfterRender",
|
|
1219
|
+
"StateHasChanged",
|
|
1220
|
+
"component lifecycle"
|
|
1221
|
+
],
|
|
1222
|
+
"anchors": {
|
|
1223
|
+
"hooks": "#lifecycle-hooks",
|
|
1224
|
+
"async": "#async-patterns"
|
|
1225
|
+
},
|
|
1226
|
+
"digest": "OnInitializedAsync for data loading (not constructor or OnInitialized). JSInterop only in OnAfterRenderAsync(firstRender:true). Dispose event subscriptions in IDisposable.Dispose(). Call StateHasChanged() after async state changes from non-UI threads. Cancel background work with CancellationTokenSource in Dispose().",
|
|
1227
|
+
"stacks": [
|
|
1228
|
+
"blazor"
|
|
1229
|
+
]
|
|
1230
|
+
},
|
|
1231
|
+
{
|
|
1232
|
+
"id": "frontend-blazor-pitfalls",
|
|
1233
|
+
"name": "pitfalls",
|
|
1234
|
+
"path": "frontend/blazor/pitfalls.md",
|
|
1235
|
+
"category": "frontend",
|
|
1236
|
+
"subcategory": "blazor",
|
|
1237
|
+
"tags": [
|
|
1238
|
+
"frontend",
|
|
1239
|
+
"blazor"
|
|
1240
|
+
],
|
|
1241
|
+
"aliases": [
|
|
1242
|
+
"blazor anti-patterns",
|
|
1243
|
+
"blazor mistakes",
|
|
1244
|
+
"blazor gotchas",
|
|
1245
|
+
"blazor bugs",
|
|
1246
|
+
"common errors"
|
|
1247
|
+
],
|
|
1248
|
+
"anchors": {
|
|
1249
|
+
"concurrency": "#concurrency-pitfalls",
|
|
1250
|
+
"memory": "#memory-leaks"
|
|
1251
|
+
},
|
|
1252
|
+
"digest": "Never inject DbContext directly — use IDbContextFactory. Avoid async void event handlers (use async Task). Route parameters need [Parameter] attribute. Use EventCallback<T> not Action<T> for parent-child callbacks. Dispose HttpClient connections, SignalR connections, and timers in IDisposable.",
|
|
1253
|
+
"stacks": [
|
|
1254
|
+
"blazor"
|
|
1255
|
+
]
|
|
1256
|
+
},
|
|
1257
|
+
{
|
|
1258
|
+
"id": "frontend-blazor-state",
|
|
1259
|
+
"name": "state",
|
|
1260
|
+
"path": "frontend/blazor/state.md",
|
|
1261
|
+
"category": "frontend",
|
|
1262
|
+
"subcategory": "blazor",
|
|
1263
|
+
"tags": [
|
|
1264
|
+
"frontend",
|
|
1265
|
+
"blazor"
|
|
1266
|
+
],
|
|
1267
|
+
"aliases": [
|
|
1268
|
+
"blazor state",
|
|
1269
|
+
"cascading value",
|
|
1270
|
+
"state container",
|
|
1271
|
+
"component state",
|
|
1272
|
+
"Fluxor"
|
|
1273
|
+
],
|
|
1274
|
+
"anchors": {
|
|
1275
|
+
"patterns": "#state-patterns",
|
|
1276
|
+
"sharing": "#state-sharing"
|
|
1277
|
+
},
|
|
1278
|
+
"digest": "CascadingParameter for app-wide state (auth, theme). Scoped services as state containers for per-user state. Local component state with private fields + StateHasChanged. Never store state in static fields — use DI. localStorage via IJSRuntime for persistence. Fluxor for complex state with multiple consumers.",
|
|
1279
|
+
"stacks": [
|
|
1280
|
+
"blazor"
|
|
1281
|
+
]
|
|
1282
|
+
},
|
|
1283
|
+
{
|
|
1284
|
+
"id": "frontend-design-system-aesthetic-direction",
|
|
1285
|
+
"name": "aesthetic direction",
|
|
1286
|
+
"path": "frontend/design-system/aesthetic-direction.md",
|
|
1287
|
+
"category": "frontend",
|
|
1288
|
+
"subcategory": "design-system",
|
|
1289
|
+
"tags": [
|
|
1290
|
+
"frontend",
|
|
1291
|
+
"design-system"
|
|
1292
|
+
],
|
|
1293
|
+
"aliases": [
|
|
1294
|
+
"aesthetic direction",
|
|
1295
|
+
"visual design",
|
|
1296
|
+
"brand identity",
|
|
1297
|
+
"design language",
|
|
1298
|
+
"design tone"
|
|
1299
|
+
],
|
|
1300
|
+
"anchors": {
|
|
1301
|
+
"principles": "#design-principles",
|
|
1302
|
+
"tokens": "#design-tokens"
|
|
1303
|
+
},
|
|
1304
|
+
"digest": "Define aesthetic direction before generating mockups: tone (professional/playful), density (compact/spacious), brand colors (primary, secondary, accent). Document in design-system.md. All UI decisions derive from aesthetic direction — never use arbitrary colors or spacing values.",
|
|
1305
|
+
"stacks": [
|
|
1306
|
+
"*"
|
|
1307
|
+
]
|
|
1308
|
+
},
|
|
1309
|
+
{
|
|
1310
|
+
"id": "frontend-design-system-animations",
|
|
1311
|
+
"name": "animations",
|
|
1312
|
+
"path": "frontend/design-system/animations.md",
|
|
1313
|
+
"category": "frontend",
|
|
1314
|
+
"subcategory": "design-system",
|
|
1315
|
+
"tags": [
|
|
1316
|
+
"frontend",
|
|
1317
|
+
"design-system"
|
|
1318
|
+
],
|
|
1319
|
+
"aliases": [
|
|
1320
|
+
"animations",
|
|
1321
|
+
"transitions",
|
|
1322
|
+
"motion",
|
|
1323
|
+
"CSS animations",
|
|
1324
|
+
"keyframes",
|
|
1325
|
+
"prefers-reduced-motion"
|
|
1326
|
+
],
|
|
1327
|
+
"anchors": {
|
|
1328
|
+
"tokens": "#animation-tokens",
|
|
1329
|
+
"principles": "#motion-principles"
|
|
1330
|
+
},
|
|
1331
|
+
"digest": "Use CSS custom properties for durations: --duration-fast (100ms), --duration-normal (200ms), --duration-slow (300ms). Prefer transform/opacity for GPU-accelerated animations. Always respect prefers-reduced-motion. No decorative animations over 300ms. Ease-out for entrances, ease-in for exits.",
|
|
1332
|
+
"stacks": [
|
|
1333
|
+
"*"
|
|
1334
|
+
]
|
|
1335
|
+
},
|
|
1336
|
+
{
|
|
1337
|
+
"id": "frontend-design-system-naming",
|
|
1338
|
+
"name": "naming",
|
|
1339
|
+
"path": "frontend/design-system/naming.md",
|
|
1340
|
+
"category": "frontend",
|
|
1341
|
+
"subcategory": "design-system",
|
|
1342
|
+
"tags": [
|
|
1343
|
+
"frontend",
|
|
1344
|
+
"design-system"
|
|
1345
|
+
],
|
|
1346
|
+
"aliases": [
|
|
1347
|
+
"BEM",
|
|
1348
|
+
"CSS naming",
|
|
1349
|
+
"class naming",
|
|
1350
|
+
"design token naming",
|
|
1351
|
+
"component naming"
|
|
1352
|
+
],
|
|
1353
|
+
"anchors": {
|
|
1354
|
+
"blocks": "#bem-blocks",
|
|
1355
|
+
"tokens": "#token-naming"
|
|
1356
|
+
},
|
|
1357
|
+
"digest": "BEM for CSS: .block__element--modifier. Design tokens: --color-primary-500, --spacing-4, --font-size-base. Component names PascalCase (Blazor) / kebab-case (CSS). No generic names (blue, big). Semantic names only: --color-action, --spacing-page-gutter. Tokens are the single source of truth.",
|
|
1358
|
+
"stacks": [
|
|
1359
|
+
"*"
|
|
1360
|
+
]
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
"id": "frontend-nextjs-app-router",
|
|
1364
|
+
"name": "app router",
|
|
1365
|
+
"path": "frontend/nextjs/app-router.md",
|
|
1366
|
+
"category": "frontend",
|
|
1367
|
+
"subcategory": "nextjs",
|
|
1368
|
+
"tags": [
|
|
1369
|
+
"frontend",
|
|
1370
|
+
"nextjs"
|
|
1371
|
+
],
|
|
1372
|
+
"aliases": [
|
|
1373
|
+
"app router",
|
|
1374
|
+
"Next.js 14",
|
|
1375
|
+
"server components",
|
|
1376
|
+
"app directory",
|
|
1377
|
+
"RSC"
|
|
1378
|
+
],
|
|
1379
|
+
"anchors": {
|
|
1380
|
+
"layout": "#layout-patterns",
|
|
1381
|
+
"routing": "#routing-patterns"
|
|
1382
|
+
},
|
|
1383
|
+
"digest": "Server Components by default — only add 'use client' when needed (interactivity, browser APIs, hooks). Layouts persist across navigations. Parallel Routes with @folder for simultaneous views. Route Groups with (folder) to organize without affecting URL. Use generateMetadata() for dynamic SEO metadata.",
|
|
1384
|
+
"stacks": [
|
|
1385
|
+
"nextjs"
|
|
1386
|
+
]
|
|
1387
|
+
},
|
|
1388
|
+
{
|
|
1389
|
+
"id": "frontend-nextjs-components",
|
|
1390
|
+
"name": "components",
|
|
1391
|
+
"path": "frontend/nextjs/components.md",
|
|
1392
|
+
"category": "frontend",
|
|
1393
|
+
"subcategory": "nextjs",
|
|
1394
|
+
"tags": [
|
|
1395
|
+
"frontend",
|
|
1396
|
+
"nextjs"
|
|
1397
|
+
],
|
|
1398
|
+
"aliases": [
|
|
1399
|
+
"react components",
|
|
1400
|
+
"server component",
|
|
1401
|
+
"client component",
|
|
1402
|
+
"shadcn/ui",
|
|
1403
|
+
"UI components"
|
|
1404
|
+
],
|
|
1405
|
+
"anchors": {
|
|
1406
|
+
"patterns": "#component-patterns",
|
|
1407
|
+
"shadcn": "#shadcn-usage"
|
|
1408
|
+
},
|
|
1409
|
+
"digest": "Server Components for data fetching and static content. Client Components for interactivity. shadcn/ui components are copy-paste — customize in src/components/ui/. Never use index.tsx for named exports. One component per file. Avoid prop drilling — use composition or Context API.",
|
|
1410
|
+
"stacks": [
|
|
1411
|
+
"nextjs"
|
|
1412
|
+
]
|
|
1413
|
+
},
|
|
1414
|
+
{
|
|
1415
|
+
"id": "frontend-nextjs-data-fetching",
|
|
1416
|
+
"name": "data fetching",
|
|
1417
|
+
"path": "frontend/nextjs/data-fetching.md",
|
|
1418
|
+
"category": "frontend",
|
|
1419
|
+
"subcategory": "nextjs",
|
|
1420
|
+
"tags": [
|
|
1421
|
+
"frontend",
|
|
1422
|
+
"nextjs"
|
|
1423
|
+
],
|
|
1424
|
+
"aliases": [
|
|
1425
|
+
"TanStack Query",
|
|
1426
|
+
"react-query",
|
|
1427
|
+
"server actions",
|
|
1428
|
+
"data fetching",
|
|
1429
|
+
"useQuery"
|
|
1430
|
+
],
|
|
1431
|
+
"anchors": {
|
|
1432
|
+
"server": "#server-fetching",
|
|
1433
|
+
"client": "#client-fetching"
|
|
1434
|
+
},
|
|
1435
|
+
"digest": "Server Components: fetch() with caching tags for static/ISR. Client Components: TanStack Query useQuery/useMutation for client-side state. Server Actions for mutations from Client Components. Never fetch in useEffect — use TanStack Query. Set revalidate intervals for ISR. Use React Suspense for loading states.",
|
|
1436
|
+
"stacks": [
|
|
1437
|
+
"nextjs"
|
|
1438
|
+
]
|
|
1439
|
+
},
|
|
1440
|
+
{
|
|
1441
|
+
"id": "frontend-nextjs-forms",
|
|
1442
|
+
"name": "forms",
|
|
1443
|
+
"path": "frontend/nextjs/forms.md",
|
|
1444
|
+
"category": "frontend",
|
|
1445
|
+
"subcategory": "nextjs",
|
|
1446
|
+
"tags": [
|
|
1447
|
+
"frontend",
|
|
1448
|
+
"nextjs"
|
|
1449
|
+
],
|
|
1450
|
+
"aliases": [
|
|
1451
|
+
"react-hook-form",
|
|
1452
|
+
"Zod",
|
|
1453
|
+
"form validation",
|
|
1454
|
+
"Server Actions forms",
|
|
1455
|
+
"useFormState"
|
|
1456
|
+
],
|
|
1457
|
+
"anchors": {
|
|
1458
|
+
"validation": "#zod-schemas",
|
|
1459
|
+
"submission": "#form-submission"
|
|
1460
|
+
},
|
|
1461
|
+
"digest": "react-hook-form with Zod resolver for client forms. Define Zod schema before component. Server Actions for mutations: 'use server' directive. Use useFormState/useActionState for Server Action feedback. Never submit to API routes — use Server Actions or React Query mutations. Display field-level errors from Zod.",
|
|
1462
|
+
"stacks": [
|
|
1463
|
+
"nextjs"
|
|
1464
|
+
]
|
|
1465
|
+
},
|
|
1466
|
+
{
|
|
1467
|
+
"id": "frontend-nextjs-naming-conventions",
|
|
1468
|
+
"name": "naming conventions",
|
|
1469
|
+
"path": "frontend/nextjs/naming-conventions.md",
|
|
1470
|
+
"category": "frontend",
|
|
1471
|
+
"subcategory": "nextjs",
|
|
1472
|
+
"tags": [
|
|
1473
|
+
"frontend",
|
|
1474
|
+
"nextjs"
|
|
1475
|
+
],
|
|
1476
|
+
"aliases": [
|
|
1477
|
+
"naming conventions",
|
|
1478
|
+
"file naming",
|
|
1479
|
+
"component naming",
|
|
1480
|
+
"Next.js naming",
|
|
1481
|
+
"TypeScript naming"
|
|
1482
|
+
],
|
|
1483
|
+
"anchors": {
|
|
1484
|
+
"files": "#file-naming",
|
|
1485
|
+
"components": "#component-naming"
|
|
1486
|
+
},
|
|
1487
|
+
"digest": "Pages: lowercase kebab-case (user-profile/page.tsx). Components: PascalCase (UserProfile.tsx). Hooks: camelCase with 'use' prefix (useUserProfile.ts). API routes: kebab-case. Types: PascalCase. No default exports except page.tsx and layout.tsx. Feature-based co-location preferred.",
|
|
1488
|
+
"stacks": [
|
|
1489
|
+
"nextjs"
|
|
1490
|
+
]
|
|
1491
|
+
},
|
|
1492
|
+
{
|
|
1493
|
+
"id": "frontend-nextjs-nextjs-patterns",
|
|
1494
|
+
"name": "nextjs patterns",
|
|
1495
|
+
"path": "frontend/nextjs/nextjs-patterns.md",
|
|
1496
|
+
"category": "frontend",
|
|
1497
|
+
"subcategory": "nextjs",
|
|
1498
|
+
"tags": [
|
|
1499
|
+
"frontend",
|
|
1500
|
+
"nextjs"
|
|
1501
|
+
],
|
|
1502
|
+
"aliases": [
|
|
1503
|
+
"Next.js patterns",
|
|
1504
|
+
"middleware",
|
|
1505
|
+
"auth patterns",
|
|
1506
|
+
"caching patterns",
|
|
1507
|
+
"image optimization"
|
|
1508
|
+
],
|
|
1509
|
+
"anchors": {
|
|
1510
|
+
"auth": "#auth-patterns",
|
|
1511
|
+
"caching": "#caching-patterns"
|
|
1512
|
+
},
|
|
1513
|
+
"digest": "Middleware for auth redirects (use matcher config). next/image for all images (auto-optimization). next/link for navigation (prefetching). loading.tsx for Suspense boundaries per route. error.tsx for error boundaries. Use unstable_cache for expensive server computations with tag-based revalidation.",
|
|
1514
|
+
"stacks": [
|
|
1515
|
+
"nextjs"
|
|
1516
|
+
]
|
|
1517
|
+
},
|
|
1518
|
+
{
|
|
1519
|
+
"id": "frontend-nextjs-project-structure",
|
|
1520
|
+
"name": "project structure",
|
|
1521
|
+
"path": "frontend/nextjs/project-structure.md",
|
|
1522
|
+
"category": "frontend",
|
|
1523
|
+
"subcategory": "nextjs",
|
|
1524
|
+
"tags": [
|
|
1525
|
+
"frontend",
|
|
1526
|
+
"nextjs"
|
|
1527
|
+
],
|
|
1528
|
+
"aliases": [
|
|
1529
|
+
"project structure",
|
|
1530
|
+
"folder structure",
|
|
1531
|
+
"src directory",
|
|
1532
|
+
"app directory organization"
|
|
1533
|
+
],
|
|
1534
|
+
"anchors": {
|
|
1535
|
+
"structure": "#directory-structure",
|
|
1536
|
+
"organization": "#feature-organization"
|
|
1537
|
+
},
|
|
1538
|
+
"digest": "src/app/ for routes, src/components/ for shared UI, src/lib/ for utilities, src/hooks/ for custom hooks, src/types/ for TypeScript types. Co-locate feature components near their routes. Public API via components/index.ts. Avoid barrel files in app/ directory. Keep pages thin — logic in hooks and utilities.",
|
|
1539
|
+
"stacks": [
|
|
1540
|
+
"nextjs"
|
|
1541
|
+
]
|
|
1542
|
+
},
|
|
1543
|
+
{
|
|
1544
|
+
"id": "frontend-nextjs-state-management",
|
|
1545
|
+
"name": "state management",
|
|
1546
|
+
"path": "frontend/nextjs/state-management.md",
|
|
1547
|
+
"category": "frontend",
|
|
1548
|
+
"subcategory": "nextjs",
|
|
1549
|
+
"tags": [
|
|
1550
|
+
"frontend",
|
|
1551
|
+
"nextjs"
|
|
1552
|
+
],
|
|
1553
|
+
"aliases": [
|
|
1554
|
+
"zustand",
|
|
1555
|
+
"React context",
|
|
1556
|
+
"global state",
|
|
1557
|
+
"state management",
|
|
1558
|
+
"client state"
|
|
1559
|
+
],
|
|
1560
|
+
"anchors": {
|
|
1561
|
+
"patterns": "#state-patterns",
|
|
1562
|
+
"server": "#server-state"
|
|
1563
|
+
},
|
|
1564
|
+
"digest": "TanStack Query for server state (caching, background sync, optimistic updates). Zustand for global client state (auth, theme, user preferences). URL params for shareable UI state (filters, pagination). useState for local component state. Avoid Redux — Zustand is sufficient for most Next.js use cases.",
|
|
1565
|
+
"stacks": [
|
|
1566
|
+
"nextjs"
|
|
1567
|
+
]
|
|
1568
|
+
},
|
|
1569
|
+
{
|
|
1570
|
+
"id": "frontend-nextjs-testing",
|
|
1571
|
+
"name": "testing",
|
|
1572
|
+
"path": "frontend/nextjs/testing.md",
|
|
1573
|
+
"category": "frontend",
|
|
1574
|
+
"subcategory": "nextjs",
|
|
1575
|
+
"tags": [
|
|
1576
|
+
"frontend",
|
|
1577
|
+
"nextjs"
|
|
1578
|
+
],
|
|
1579
|
+
"aliases": [
|
|
1580
|
+
"vitest",
|
|
1581
|
+
"jest",
|
|
1582
|
+
"testing-library",
|
|
1583
|
+
"Playwright",
|
|
1584
|
+
"Next.js testing",
|
|
1585
|
+
"component tests"
|
|
1586
|
+
],
|
|
1587
|
+
"anchors": {
|
|
1588
|
+
"unit": "#unit-tests",
|
|
1589
|
+
"e2e": "#e2e-tests"
|
|
1590
|
+
},
|
|
1591
|
+
"digest": "Vitest for unit tests, React Testing Library for component tests. Mock next/navigation with vi.mock. Test Server Actions with direct function calls. Use MSW for API mocking in component tests. Playwright for E2E tests against running app. Never test implementation details — test user behavior and output.",
|
|
1592
|
+
"stacks": [
|
|
1593
|
+
"nextjs"
|
|
1594
|
+
]
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
"id": "infrastructure-azure-azure",
|
|
1598
|
+
"name": "azure",
|
|
1599
|
+
"path": "infrastructure/azure/azure.md",
|
|
1600
|
+
"category": "infrastructure",
|
|
1601
|
+
"subcategory": "azure",
|
|
1602
|
+
"tags": [
|
|
1603
|
+
"infrastructure",
|
|
1604
|
+
"azure"
|
|
1605
|
+
],
|
|
1606
|
+
"aliases": [
|
|
1607
|
+
"azure",
|
|
1608
|
+
"Azure setup",
|
|
1609
|
+
"resource group",
|
|
1610
|
+
"subscription",
|
|
1611
|
+
"azure baseline"
|
|
1612
|
+
],
|
|
1613
|
+
"anchors": {
|
|
1614
|
+
"resources": "#core-resources",
|
|
1615
|
+
"security": "#security-baseline"
|
|
1616
|
+
},
|
|
1617
|
+
"digest": "Organize resources by resource groups per environment (dev/staging/prod). Use managed identities for service-to-service auth — never service principals or keys in code. Tag all resources (env, project, owner). Enable diagnostic settings for all services. All secrets in Key Vault. Apply Azure Policy for compliance guardrails.",
|
|
1618
|
+
"stacks": [
|
|
1619
|
+
"azure"
|
|
1620
|
+
]
|
|
1621
|
+
},
|
|
1622
|
+
{
|
|
1623
|
+
"id": "infrastructure-azure-bicep-bicep-patterns",
|
|
1624
|
+
"name": "bicep patterns",
|
|
1625
|
+
"path": "infrastructure/azure/bicep/bicep-patterns.md",
|
|
1626
|
+
"category": "infrastructure",
|
|
1627
|
+
"subcategory": "azure",
|
|
1628
|
+
"tags": [
|
|
1629
|
+
"infrastructure",
|
|
1630
|
+
"azure",
|
|
1631
|
+
"bicep"
|
|
1632
|
+
],
|
|
1633
|
+
"aliases": [
|
|
1634
|
+
"bicep",
|
|
1635
|
+
"ARM template",
|
|
1636
|
+
"IaC",
|
|
1637
|
+
"infrastructure as code",
|
|
1638
|
+
"resource deployment"
|
|
1639
|
+
],
|
|
1640
|
+
"anchors": {
|
|
1641
|
+
"modules": "#module-patterns",
|
|
1642
|
+
"parameters": "#parameter-files"
|
|
1643
|
+
},
|
|
1644
|
+
"digest": "Structure as main.bicep + modules/. Parameters in parameters.{env}.bicepparams. Use @secure() for secrets — never hardcode. Run What-If before apply. Use existing keyword for cross-RG references. Modules are reusable units — never duplicate resource blocks. Deploy via CI/CD pipeline, not ad hoc.",
|
|
1645
|
+
"stacks": [
|
|
1646
|
+
"azure"
|
|
1647
|
+
]
|
|
1648
|
+
},
|
|
1649
|
+
{
|
|
1650
|
+
"id": "infrastructure-azure-devops-azure-devops-setup",
|
|
1651
|
+
"name": "azure devops setup",
|
|
1652
|
+
"path": "infrastructure/azure/devops/azure-devops-setup.md",
|
|
1653
|
+
"category": "infrastructure",
|
|
1654
|
+
"subcategory": "azure",
|
|
1655
|
+
"tags": [
|
|
1656
|
+
"infrastructure",
|
|
1657
|
+
"azure",
|
|
1658
|
+
"devops"
|
|
1659
|
+
],
|
|
1660
|
+
"aliases": [
|
|
1661
|
+
"azure devops",
|
|
1662
|
+
"ADO",
|
|
1663
|
+
"pipelines",
|
|
1664
|
+
"YAML pipeline",
|
|
1665
|
+
"azure-pipelines.yml"
|
|
1666
|
+
],
|
|
1667
|
+
"anchors": {
|
|
1668
|
+
"setup": "#organization-setup",
|
|
1669
|
+
"pipelines": "#pipeline-setup"
|
|
1670
|
+
},
|
|
1671
|
+
"digest": "YAML pipelines checked into repo — no classic editor. Separate environments: dev, staging, prod with approval gates. Service connections use managed identity (no service principals). Variable groups for per-env config. Artifacts feed for private NuGet packages. Branch policies require PR + CI for main/develop.",
|
|
1672
|
+
"stacks": [
|
|
1673
|
+
"azure"
|
|
1674
|
+
]
|
|
1675
|
+
},
|
|
1676
|
+
{
|
|
1677
|
+
"id": "infrastructure-azure-devops-local-development",
|
|
1678
|
+
"name": "local development",
|
|
1679
|
+
"path": "infrastructure/azure/devops/local-development.md",
|
|
1680
|
+
"category": "infrastructure",
|
|
1681
|
+
"subcategory": "azure",
|
|
1682
|
+
"tags": [
|
|
1683
|
+
"infrastructure",
|
|
1684
|
+
"azure",
|
|
1685
|
+
"devops"
|
|
1686
|
+
],
|
|
1687
|
+
"aliases": [
|
|
1688
|
+
"local dev",
|
|
1689
|
+
"azurite",
|
|
1690
|
+
"local azure",
|
|
1691
|
+
"dev container",
|
|
1692
|
+
"local secrets",
|
|
1693
|
+
"dotnet user-secrets"
|
|
1694
|
+
],
|
|
1695
|
+
"anchors": {
|
|
1696
|
+
"emulators": "#local-emulators",
|
|
1697
|
+
"secrets": "#local-secrets"
|
|
1698
|
+
},
|
|
1699
|
+
"digest": "Use Azurite for local Blob/Queue/Table storage emulation. dotnet user-secrets for local credentials — never .env files committed to git. Use Connection String for local, Managed Identity for deployed. Dev containers for reproducible environments. Local HTTPS with ASP.NET dev certificates.",
|
|
1700
|
+
"stacks": [
|
|
1701
|
+
"azure"
|
|
1702
|
+
]
|
|
1703
|
+
},
|
|
1704
|
+
{
|
|
1705
|
+
"id": "infrastructure-azure-services-functions",
|
|
1706
|
+
"name": "functions",
|
|
1707
|
+
"path": "infrastructure/azure/services/functions.md",
|
|
1708
|
+
"category": "infrastructure",
|
|
1709
|
+
"subcategory": "azure",
|
|
1710
|
+
"tags": [
|
|
1711
|
+
"infrastructure",
|
|
1712
|
+
"azure",
|
|
1713
|
+
"services"
|
|
1714
|
+
],
|
|
1715
|
+
"aliases": [
|
|
1716
|
+
"Azure Functions",
|
|
1717
|
+
"serverless",
|
|
1718
|
+
"function app",
|
|
1719
|
+
"timer trigger",
|
|
1720
|
+
"HTTP trigger",
|
|
1721
|
+
"Durable Functions"
|
|
1722
|
+
],
|
|
1723
|
+
"anchors": {
|
|
1724
|
+
"triggers": "#trigger-types",
|
|
1725
|
+
"bindings": "#input-output-bindings"
|
|
1726
|
+
},
|
|
1727
|
+
"digest": "Use isolated worker model (.NET 8+). HTTP triggers for API endpoints, Timer triggers for scheduled work, Service Bus triggers for event processing. Configure scale-out limits to prevent runaway costs. Durable Functions for long-running orchestrations. Deploy with deployment slots for zero-downtime.",
|
|
1728
|
+
"stacks": [
|
|
1729
|
+
"azure"
|
|
1730
|
+
]
|
|
1731
|
+
},
|
|
1732
|
+
{
|
|
1733
|
+
"id": "infrastructure-azure-services-service-bus",
|
|
1734
|
+
"name": "service bus",
|
|
1735
|
+
"path": "infrastructure/azure/services/service-bus.md",
|
|
1736
|
+
"category": "infrastructure",
|
|
1737
|
+
"subcategory": "azure",
|
|
1738
|
+
"tags": [
|
|
1739
|
+
"infrastructure",
|
|
1740
|
+
"azure",
|
|
1741
|
+
"services"
|
|
1742
|
+
],
|
|
1743
|
+
"aliases": [
|
|
1744
|
+
"service bus",
|
|
1745
|
+
"message queue",
|
|
1746
|
+
"topics",
|
|
1747
|
+
"subscriptions",
|
|
1748
|
+
"dead letter queue"
|
|
1749
|
+
],
|
|
1750
|
+
"anchors": {
|
|
1751
|
+
"setup": "#namespace-setup",
|
|
1752
|
+
"patterns": "#messaging-patterns"
|
|
1753
|
+
},
|
|
1754
|
+
"digest": "Topics+subscriptions for pub/sub, queues for point-to-point. Set MaxDeliveryCount=10 for retry limit. Monitor dead letter queue. Use message sessions for ordered processing. Implement idempotent handlers (check processed message IDs). Use managed identity for authentication. Prefetch for high-throughput consumers.",
|
|
1755
|
+
"stacks": [
|
|
1756
|
+
"azure"
|
|
1757
|
+
]
|
|
1758
|
+
},
|
|
1759
|
+
{
|
|
1760
|
+
"id": "infrastructure-azure-services-storage",
|
|
1761
|
+
"name": "storage",
|
|
1762
|
+
"path": "infrastructure/azure/services/storage.md",
|
|
1763
|
+
"category": "infrastructure",
|
|
1764
|
+
"subcategory": "azure",
|
|
1765
|
+
"tags": [
|
|
1766
|
+
"infrastructure",
|
|
1767
|
+
"azure",
|
|
1768
|
+
"services"
|
|
1769
|
+
],
|
|
1770
|
+
"aliases": [
|
|
1771
|
+
"azure storage",
|
|
1772
|
+
"blob",
|
|
1773
|
+
"table storage",
|
|
1774
|
+
"queue storage",
|
|
1775
|
+
"storage account tiers"
|
|
1776
|
+
],
|
|
1777
|
+
"anchors": {
|
|
1778
|
+
"tiers": "#storage-tiers",
|
|
1779
|
+
"security": "#access-control"
|
|
1780
|
+
},
|
|
1781
|
+
"digest": "Hot tier for frequently accessed, cool for infrequent, archive for compliance. Always use managed identity — not storage keys. Enable versioning + soft delete for business data. Lifecycle management rules for cost optimization. Private endpoints for secure access from VNet. CDN for public static assets.",
|
|
1782
|
+
"stacks": [
|
|
1783
|
+
"azure"
|
|
1784
|
+
]
|
|
1785
|
+
},
|
|
1786
|
+
{
|
|
1787
|
+
"id": "infrastructure-docker-easypanel-deploy",
|
|
1788
|
+
"name": "easypanel deploy",
|
|
1789
|
+
"path": "infrastructure/docker/easypanel-deploy.md",
|
|
1790
|
+
"category": "infrastructure",
|
|
1791
|
+
"subcategory": "docker",
|
|
1792
|
+
"tags": [
|
|
1793
|
+
"infrastructure",
|
|
1794
|
+
"docker"
|
|
1795
|
+
],
|
|
1796
|
+
"aliases": [
|
|
1797
|
+
"easypanel",
|
|
1798
|
+
"docker deploy",
|
|
1799
|
+
"self-hosted",
|
|
1800
|
+
"VPS deployment",
|
|
1801
|
+
"docker compose"
|
|
1802
|
+
],
|
|
1803
|
+
"anchors": {
|
|
1804
|
+
"setup": "#easypanel-setup",
|
|
1805
|
+
"deployment": "#deployment-flow"
|
|
1806
|
+
},
|
|
1807
|
+
"digest": "Create app in EasyPanel from container registry image. Configure environment variables in EasyPanel UI — not in Dockerfile. Use EasyPanel's managed Postgres/Redis for databases. Configure /health endpoint for health checks. Enable HTTPS via Let's Encrypt automatically. Use EasyPanel volumes for persistent storage.",
|
|
1808
|
+
"stacks": [
|
|
1809
|
+
"docker"
|
|
1810
|
+
]
|
|
1811
|
+
},
|
|
1812
|
+
{
|
|
1813
|
+
"id": "infrastructure-supabase-mcp-setup",
|
|
1814
|
+
"name": "mcp setup",
|
|
1815
|
+
"path": "infrastructure/supabase/mcp-setup.md",
|
|
1816
|
+
"category": "infrastructure",
|
|
1817
|
+
"subcategory": "supabase",
|
|
1818
|
+
"tags": [
|
|
1819
|
+
"infrastructure",
|
|
1820
|
+
"supabase"
|
|
1821
|
+
],
|
|
1822
|
+
"aliases": [
|
|
1823
|
+
"supabase MCP",
|
|
1824
|
+
"supabase tools",
|
|
1825
|
+
"supabase configuration",
|
|
1826
|
+
"MCP supabase"
|
|
1827
|
+
],
|
|
1828
|
+
"anchors": {
|
|
1829
|
+
"setup": "#mcp-configuration",
|
|
1830
|
+
"tools": "#available-tools"
|
|
1831
|
+
},
|
|
1832
|
+
"digest": "Configure Supabase MCP server with project URL and service_role key in .claude/settings.json. Use MCP tools for schema inspection, query execution, and migration management. Never expose service_role key client-side. Set up anon key for client SDK. Enable in Claude settings for database introspection during design phase.",
|
|
1833
|
+
"stacks": [
|
|
1834
|
+
"supabase"
|
|
1835
|
+
]
|
|
1836
|
+
},
|
|
1837
|
+
{
|
|
1838
|
+
"id": "infrastructure-supabase-supabase-auth",
|
|
1839
|
+
"name": "supabase auth",
|
|
1840
|
+
"path": "infrastructure/supabase/supabase-auth.md",
|
|
1841
|
+
"category": "infrastructure",
|
|
1842
|
+
"subcategory": "supabase",
|
|
1843
|
+
"tags": [
|
|
1844
|
+
"infrastructure",
|
|
1845
|
+
"supabase"
|
|
1846
|
+
],
|
|
1847
|
+
"aliases": [
|
|
1848
|
+
"supabase auth",
|
|
1849
|
+
"magic link",
|
|
1850
|
+
"OAuth",
|
|
1851
|
+
"JWT supabase",
|
|
1852
|
+
"row level security auth"
|
|
1853
|
+
],
|
|
1854
|
+
"anchors": {
|
|
1855
|
+
"setup": "#auth-setup",
|
|
1856
|
+
"providers": "#auth-providers"
|
|
1857
|
+
},
|
|
1858
|
+
"digest": "Use Supabase Auth for magic links, OAuth (Google, GitHub), phone OTP. Configure site URL and redirect URLs in dashboard. Server-side: use supabase.auth.getUser() not getSession(). Enable email confirmations for production. JWT expiry 3600s. RLS policies must reference auth.uid() for user isolation.",
|
|
1859
|
+
"stacks": [
|
|
1860
|
+
"supabase"
|
|
1861
|
+
]
|
|
1862
|
+
},
|
|
1863
|
+
{
|
|
1864
|
+
"id": "infrastructure-supabase-supabase-pgvector",
|
|
1865
|
+
"name": "supabase pgvector",
|
|
1866
|
+
"path": "infrastructure/supabase/supabase-pgvector.md",
|
|
1867
|
+
"category": "infrastructure",
|
|
1868
|
+
"subcategory": "supabase",
|
|
1869
|
+
"tags": [
|
|
1870
|
+
"infrastructure",
|
|
1871
|
+
"supabase"
|
|
1872
|
+
],
|
|
1873
|
+
"aliases": [
|
|
1874
|
+
"pgvector",
|
|
1875
|
+
"vector embeddings",
|
|
1876
|
+
"similarity search",
|
|
1877
|
+
"supabase vectors",
|
|
1878
|
+
"HNSW index"
|
|
1879
|
+
],
|
|
1880
|
+
"anchors": {
|
|
1881
|
+
"setup": "#pgvector-setup",
|
|
1882
|
+
"queries": "#similarity-queries"
|
|
1883
|
+
},
|
|
1884
|
+
"digest": "Enable: CREATE EXTENSION vector. Define column as vector(1536) for OpenAI embeddings. Create HNSW index: CREATE INDEX USING hnsw (embedding vector_cosine_ops). Use match_documents() RPC for similarity search. Batch insert embeddings (100 at a time). RLS policies apply to vector queries like all other tables.",
|
|
1885
|
+
"stacks": [
|
|
1886
|
+
"supabase"
|
|
1887
|
+
]
|
|
1888
|
+
},
|
|
1889
|
+
{
|
|
1890
|
+
"id": "infrastructure-supabase-supabase-rls",
|
|
1891
|
+
"name": "supabase rls",
|
|
1892
|
+
"path": "infrastructure/supabase/supabase-rls.md",
|
|
1893
|
+
"category": "infrastructure",
|
|
1894
|
+
"subcategory": "supabase",
|
|
1895
|
+
"tags": [
|
|
1896
|
+
"infrastructure",
|
|
1897
|
+
"supabase"
|
|
1898
|
+
],
|
|
1899
|
+
"aliases": [
|
|
1900
|
+
"RLS",
|
|
1901
|
+
"row level security",
|
|
1902
|
+
"postgres policies",
|
|
1903
|
+
"multi-tenant security",
|
|
1904
|
+
"supabase policies"
|
|
1905
|
+
],
|
|
1906
|
+
"anchors": {
|
|
1907
|
+
"policies": "#rls-policies",
|
|
1908
|
+
"patterns": "#tenant-patterns"
|
|
1909
|
+
},
|
|
1910
|
+
"digest": "Enable RLS on every table: ALTER TABLE ... ENABLE ROW LEVEL SECURITY. User isolation: USING (auth.uid() = user_id). Multi-tenant: USING (tenant_id = (auth.jwt()->>'tenant_id')::uuid). Test policies with SET LOCAL ROLE anon. Service role bypasses RLS — use only server-side. Never rely on application-level security alone.",
|
|
1911
|
+
"stacks": [
|
|
1912
|
+
"supabase"
|
|
1913
|
+
]
|
|
1914
|
+
},
|
|
1915
|
+
{
|
|
1916
|
+
"id": "infrastructure-supabase-supabase-storage",
|
|
1917
|
+
"name": "supabase storage",
|
|
1918
|
+
"path": "infrastructure/supabase/supabase-storage.md",
|
|
1919
|
+
"category": "infrastructure",
|
|
1920
|
+
"subcategory": "supabase",
|
|
1921
|
+
"tags": [
|
|
1922
|
+
"infrastructure",
|
|
1923
|
+
"supabase"
|
|
1924
|
+
],
|
|
1925
|
+
"aliases": [
|
|
1926
|
+
"supabase storage",
|
|
1927
|
+
"file uploads",
|
|
1928
|
+
"storage buckets",
|
|
1929
|
+
"storage policies",
|
|
1930
|
+
"signed URLs"
|
|
1931
|
+
],
|
|
1932
|
+
"anchors": {
|
|
1933
|
+
"buckets": "#bucket-setup",
|
|
1934
|
+
"policies": "#storage-policies"
|
|
1935
|
+
},
|
|
1936
|
+
"digest": "Public buckets for CDN-served assets, private for user files (signed URLs). Storage policies use same RLS syntax as tables. Upload: supabase.storage.from('bucket').upload(path, file). Signed URLs: createSignedUrl(path, 3600). Set content-type on upload. Enable image transformations for on-the-fly resizing.",
|
|
1937
|
+
"stacks": [
|
|
1938
|
+
"supabase"
|
|
1939
|
+
]
|
|
1940
|
+
},
|
|
1941
|
+
{
|
|
1942
|
+
"id": "infrastructure-supabase-supabase-custom-jwt",
|
|
1943
|
+
"name": "supabase custom jwt",
|
|
1944
|
+
"path": "infrastructure/supabase/supabase-custom-jwt.md",
|
|
1945
|
+
"category": "infrastructure",
|
|
1946
|
+
"subcategory": "supabase",
|
|
1947
|
+
"tags": [
|
|
1948
|
+
"infrastructure",
|
|
1949
|
+
"supabase",
|
|
1950
|
+
"jwt"
|
|
1951
|
+
],
|
|
1952
|
+
"aliases": [
|
|
1953
|
+
"custom JWT",
|
|
1954
|
+
"JWT signing",
|
|
1955
|
+
"token creation",
|
|
1956
|
+
"JWT claims"
|
|
1957
|
+
],
|
|
1958
|
+
"anchors": {
|
|
1959
|
+
"creation": "#jwt-token-creation",
|
|
1960
|
+
"claims": "#custom-claims-structure",
|
|
1961
|
+
"refresh": "#jwt-refresh-patterns"
|
|
1962
|
+
},
|
|
1963
|
+
"digest": "Create custom JWTs with jose (Node.js) or System.IdentityModel.Tokens.Jwt (.NET). Always set expiry, use HS256/RS256, include tenant_id in app_metadata for RLS. Refresh tokens via rotation. Store JWT secret in env vars only.",
|
|
1964
|
+
"stacks": [
|
|
1965
|
+
"dotnet",
|
|
1966
|
+
"nextjs"
|
|
1967
|
+
]
|
|
1968
|
+
},
|
|
1969
|
+
{
|
|
1970
|
+
"id": "integration-api-graphql",
|
|
1971
|
+
"name": "graphql",
|
|
1972
|
+
"path": "integration/api/graphql.md",
|
|
1973
|
+
"category": "integration",
|
|
1974
|
+
"subcategory": "api",
|
|
1975
|
+
"tags": [
|
|
1976
|
+
"integration",
|
|
1977
|
+
"api"
|
|
1978
|
+
],
|
|
1979
|
+
"aliases": [
|
|
1980
|
+
"graphql",
|
|
1981
|
+
"Hot Chocolate",
|
|
1982
|
+
"GraphQL schema",
|
|
1983
|
+
"query",
|
|
1984
|
+
"mutation",
|
|
1985
|
+
"subscription"
|
|
1986
|
+
],
|
|
1987
|
+
"anchors": {
|
|
1988
|
+
"setup": "#hot-chocolate-setup",
|
|
1989
|
+
"patterns": "#schema-patterns"
|
|
1990
|
+
},
|
|
1991
|
+
"digest": "Use Hot Chocolate for .NET GraphQL. Define types with [GraphQLType], mutations with [UseMutationConvention]. Enable pagination with [UsePaging]. Use DataLoader to prevent N+1 queries. Add [Authorize] for field-level security. Never expose internal exceptions — use custom error types. Enable introspection only in dev.",
|
|
1992
|
+
"stacks": [
|
|
1993
|
+
"dotnet"
|
|
1994
|
+
]
|
|
1995
|
+
},
|
|
1996
|
+
{
|
|
1997
|
+
"id": "integration-api-grpc",
|
|
1998
|
+
"name": "grpc",
|
|
1999
|
+
"path": "integration/api/grpc.md",
|
|
2000
|
+
"category": "integration",
|
|
2001
|
+
"subcategory": "api",
|
|
2002
|
+
"tags": [
|
|
2003
|
+
"integration",
|
|
2004
|
+
"api"
|
|
2005
|
+
],
|
|
2006
|
+
"aliases": [
|
|
2007
|
+
"grpc",
|
|
2008
|
+
"protobuf",
|
|
2009
|
+
".proto files",
|
|
2010
|
+
"gRPC service",
|
|
2011
|
+
"server streaming"
|
|
2012
|
+
],
|
|
2013
|
+
"anchors": {
|
|
2014
|
+
"proto": "#proto-design",
|
|
2015
|
+
"patterns": "#service-patterns"
|
|
2016
|
+
},
|
|
2017
|
+
"digest": "Define .proto files first, generate C# stubs. Use proto3 syntax. Unary for request-response, server streaming for real-time data. GrpcChannel with managed credentials. Add grpc-health-probe for health checks. Prefer REST for external APIs, gRPC for internal service-to-service. Use Buf for proto linting and schema registry.",
|
|
2018
|
+
"stacks": [
|
|
2019
|
+
"dotnet"
|
|
2020
|
+
]
|
|
2021
|
+
},
|
|
2022
|
+
{
|
|
2023
|
+
"id": "integration-api-rest-design",
|
|
2024
|
+
"name": "rest design",
|
|
2025
|
+
"path": "integration/api/rest-design.md",
|
|
2026
|
+
"category": "integration",
|
|
2027
|
+
"subcategory": "api",
|
|
2028
|
+
"tags": [
|
|
2029
|
+
"integration",
|
|
2030
|
+
"api"
|
|
2031
|
+
],
|
|
2032
|
+
"aliases": [
|
|
2033
|
+
"REST design",
|
|
2034
|
+
"RESTful API",
|
|
2035
|
+
"HTTP API design",
|
|
2036
|
+
"resource naming",
|
|
2037
|
+
"API versioning"
|
|
2038
|
+
],
|
|
2039
|
+
"anchors": {
|
|
2040
|
+
"resources": "#resource-naming",
|
|
2041
|
+
"errors": "#error-handling"
|
|
2042
|
+
},
|
|
2043
|
+
"digest": "Resources are nouns, HTTP verbs are actions: GET /users, POST /users, PUT /users/{id}, DELETE /users/{id}. 201+Location for creation, 204 for deletion. RFC 9457 ProblemDetails for errors. Cursor-based pagination for large collections. URL versioning (/api/v1/). HATEOAS links for discoverable APIs.",
|
|
2044
|
+
"stacks": [
|
|
2045
|
+
"dotnet"
|
|
2046
|
+
]
|
|
2047
|
+
},
|
|
2048
|
+
{
|
|
2049
|
+
"id": "integration-event-driven-cqrs",
|
|
2050
|
+
"name": "cqrs",
|
|
2051
|
+
"path": "integration/event-driven/cqrs.md",
|
|
2052
|
+
"category": "integration",
|
|
2053
|
+
"subcategory": "event-driven",
|
|
2054
|
+
"tags": [
|
|
2055
|
+
"integration",
|
|
2056
|
+
"event-driven"
|
|
2057
|
+
],
|
|
2058
|
+
"aliases": [
|
|
2059
|
+
"CQRS",
|
|
2060
|
+
"command query separation",
|
|
2061
|
+
"MediatR",
|
|
2062
|
+
"read model",
|
|
2063
|
+
"write model"
|
|
2064
|
+
],
|
|
2065
|
+
"anchors": {
|
|
2066
|
+
"commands": "#command-patterns",
|
|
2067
|
+
"queries": "#query-patterns"
|
|
2068
|
+
},
|
|
2069
|
+
"digest": "Commands mutate state, queries read state — never mix. Commands return void or Result (not data). Queries return DTOs (not domain entities). Use MediatR for in-process CQRS. Validate commands at API boundary before handler. Read models can be denormalized for query performance.",
|
|
2070
|
+
"stacks": [
|
|
2071
|
+
"dotnet"
|
|
2072
|
+
]
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
"id": "integration-event-driven-event-sourcing",
|
|
2076
|
+
"name": "event sourcing",
|
|
2077
|
+
"path": "integration/event-driven/event-sourcing.md",
|
|
2078
|
+
"category": "integration",
|
|
2079
|
+
"subcategory": "event-driven",
|
|
2080
|
+
"tags": [
|
|
2081
|
+
"integration",
|
|
2082
|
+
"event-driven"
|
|
2083
|
+
],
|
|
2084
|
+
"aliases": [
|
|
2085
|
+
"event sourcing",
|
|
2086
|
+
"event store",
|
|
2087
|
+
"event replay",
|
|
2088
|
+
"aggregate events",
|
|
2089
|
+
"append-only log"
|
|
2090
|
+
],
|
|
2091
|
+
"anchors": {
|
|
2092
|
+
"events": "#domain-events",
|
|
2093
|
+
"replay": "#event-replay"
|
|
2094
|
+
},
|
|
2095
|
+
"digest": "Store events as immutable past-tense facts: OrderCreated, PaymentProcessed. Aggregate rebuilds state from event stream. Take snapshots for aggregates with >100 events. Use EventStoreDB or CosmosDB change feed for storage. Projections build read models from events. Never delete events — use correction events.",
|
|
2096
|
+
"stacks": [
|
|
2097
|
+
"dotnet"
|
|
2098
|
+
]
|
|
2099
|
+
},
|
|
2100
|
+
{
|
|
2101
|
+
"id": "integration-event-driven-service-bus",
|
|
2102
|
+
"name": "service bus",
|
|
2103
|
+
"path": "integration/event-driven/service-bus.md",
|
|
2104
|
+
"category": "integration",
|
|
2105
|
+
"subcategory": "event-driven",
|
|
2106
|
+
"tags": [
|
|
2107
|
+
"integration",
|
|
2108
|
+
"event-driven"
|
|
2109
|
+
],
|
|
2110
|
+
"aliases": [
|
|
2111
|
+
"service bus integration",
|
|
2112
|
+
"message broker",
|
|
2113
|
+
"event bus",
|
|
2114
|
+
"publisher",
|
|
2115
|
+
"consumer"
|
|
2116
|
+
],
|
|
2117
|
+
"anchors": {
|
|
2118
|
+
"topics": "#topic-subscription",
|
|
2119
|
+
"patterns": "#integration-patterns"
|
|
2120
|
+
},
|
|
2121
|
+
"digest": "Publish domain events to Service Bus after aggregate persistence (transactional outbox). Consumers must be idempotent — check processed message IDs. Use correlation IDs for distributed tracing. Message envelope includes schema version. Consumer groups enable event replay. Monitor dead letter queue in production.",
|
|
2122
|
+
"stacks": [
|
|
2123
|
+
"dotnet"
|
|
2124
|
+
]
|
|
2125
|
+
},
|
|
2126
|
+
{
|
|
2127
|
+
"id": "integration-mcp-mcp-tools",
|
|
2128
|
+
"name": "mcp tools",
|
|
2129
|
+
"path": "integration/mcp/mcp-tools.md",
|
|
2130
|
+
"category": "integration",
|
|
2131
|
+
"subcategory": "mcp",
|
|
2132
|
+
"tags": [
|
|
2133
|
+
"integration",
|
|
2134
|
+
"mcp"
|
|
2135
|
+
],
|
|
2136
|
+
"aliases": [
|
|
2137
|
+
"MCP",
|
|
2138
|
+
"Model Context Protocol",
|
|
2139
|
+
"Claude tools",
|
|
2140
|
+
"MCP server",
|
|
2141
|
+
"MCP client"
|
|
2142
|
+
],
|
|
2143
|
+
"anchors": {
|
|
2144
|
+
"tools": "#tool-definitions",
|
|
2145
|
+
"setup": "#server-setup"
|
|
2146
|
+
},
|
|
2147
|
+
"digest": "MCP tools extend Claude with external data and actions. Tools are synchronous request-response with typed inputSchema. Resources provide read-only data access. Prompts are reusable templates. Register MCP servers in .claude/settings.json. Prefer @context7 for live library docs. Test tools with MCP Inspector before integrating.",
|
|
2148
|
+
"stacks": [
|
|
2149
|
+
"*"
|
|
2150
|
+
]
|
|
2151
|
+
},
|
|
2152
|
+
{
|
|
2153
|
+
"id": "observability-logging",
|
|
2154
|
+
"name": "logging",
|
|
2155
|
+
"path": "observability/logging.md",
|
|
2156
|
+
"category": "observability",
|
|
2157
|
+
"subcategory": null,
|
|
2158
|
+
"tags": [
|
|
2159
|
+
"observability"
|
|
2160
|
+
],
|
|
2161
|
+
"aliases": [
|
|
2162
|
+
"logging",
|
|
2163
|
+
"serilog",
|
|
2164
|
+
"ILogger",
|
|
2165
|
+
"structured logging",
|
|
2166
|
+
"log levels",
|
|
2167
|
+
"Application Insights"
|
|
2168
|
+
],
|
|
2169
|
+
"anchors": {
|
|
2170
|
+
"setup": "#serilog-setup",
|
|
2171
|
+
"patterns": "#logging-patterns"
|
|
2172
|
+
},
|
|
2173
|
+
"digest": "Use Serilog with structured logging. Sinks: Console (dev), Application Insights (prod). Inject ILogger<T> — never static Logger. Log levels: Debug for trace, Information for business events, Warning for recoverable, Error for failures. Include correlation IDs in all logs. Never log PII or credentials.",
|
|
2174
|
+
"stacks": [
|
|
2175
|
+
"*"
|
|
2176
|
+
]
|
|
2177
|
+
},
|
|
2178
|
+
{
|
|
2179
|
+
"id": "observability-metrics",
|
|
2180
|
+
"name": "metrics",
|
|
2181
|
+
"path": "observability/metrics.md",
|
|
2182
|
+
"category": "observability",
|
|
2183
|
+
"subcategory": null,
|
|
2184
|
+
"tags": [
|
|
2185
|
+
"observability"
|
|
2186
|
+
],
|
|
2187
|
+
"aliases": [
|
|
2188
|
+
"metrics",
|
|
2189
|
+
"prometheus",
|
|
2190
|
+
"OpenTelemetry metrics",
|
|
2191
|
+
"custom metrics",
|
|
2192
|
+
"counters",
|
|
2193
|
+
"histograms"
|
|
2194
|
+
],
|
|
2195
|
+
"anchors": {
|
|
2196
|
+
"setup": "#metrics-setup",
|
|
2197
|
+
"instruments": "#metric-types"
|
|
2198
|
+
},
|
|
2199
|
+
"digest": "System.Diagnostics.Metrics API for .NET. Register meters: builder.Services.AddMetrics(). Types: Counter (total count), Histogram (latency distribution), Gauge (current value). Export to Prometheus or Azure Monitor. Tag dimensions: environment, service, version. Define SLIs from business metrics, not technical ones.",
|
|
2200
|
+
"stacks": [
|
|
2201
|
+
"*"
|
|
2202
|
+
]
|
|
2203
|
+
},
|
|
2204
|
+
{
|
|
2205
|
+
"id": "observability-monitoring",
|
|
2206
|
+
"name": "monitoring",
|
|
2207
|
+
"path": "observability/monitoring.md",
|
|
2208
|
+
"category": "observability",
|
|
2209
|
+
"subcategory": null,
|
|
2210
|
+
"tags": [
|
|
2211
|
+
"observability"
|
|
2212
|
+
],
|
|
2213
|
+
"aliases": [
|
|
2214
|
+
"monitoring",
|
|
2215
|
+
"alerts",
|
|
2216
|
+
"dashboards",
|
|
2217
|
+
"Application Insights",
|
|
2218
|
+
"health checks",
|
|
2219
|
+
"SLA"
|
|
2220
|
+
],
|
|
2221
|
+
"anchors": {
|
|
2222
|
+
"alerts": "#alert-rules",
|
|
2223
|
+
"dashboards": "#dashboard-setup"
|
|
2224
|
+
},
|
|
2225
|
+
"digest": "Health checks: /health for liveness, /health/ready for readiness. Application Insights for distributed tracing. SLA-based alerts: p99 latency, error rate >1%, availability <99.9%. Azure Workbooks dashboards per feature. Availability tests for external endpoints. Each alert has an on-call runbook.",
|
|
2226
|
+
"stacks": [
|
|
2227
|
+
"*"
|
|
2228
|
+
]
|
|
2229
|
+
},
|
|
2230
|
+
{
|
|
2231
|
+
"id": "observability-tracing",
|
|
2232
|
+
"name": "tracing",
|
|
2233
|
+
"path": "observability/tracing.md",
|
|
2234
|
+
"category": "observability",
|
|
2235
|
+
"subcategory": null,
|
|
2236
|
+
"tags": [
|
|
2237
|
+
"observability"
|
|
2238
|
+
],
|
|
2239
|
+
"aliases": [
|
|
2240
|
+
"tracing",
|
|
2241
|
+
"OpenTelemetry",
|
|
2242
|
+
"distributed trace",
|
|
2243
|
+
"spans",
|
|
2244
|
+
"W3C TraceContext"
|
|
2245
|
+
],
|
|
2246
|
+
"anchors": {
|
|
2247
|
+
"setup": "#otel-setup",
|
|
2248
|
+
"propagation": "#context-propagation"
|
|
2249
|
+
},
|
|
2250
|
+
"digest": "Add OpenTelemetry SDK. Auto-instrument HTTP, SQL, Service Bus. Propagate W3C TraceContext across services. Custom spans for business operations: using var span = tracer.StartActiveSpan('operation'). Export to Azure Monitor or Jaeger. Sampling: 10% in prod, 100% for errors. Correlate traces with logs via trace ID.",
|
|
2251
|
+
"stacks": [
|
|
2252
|
+
"*"
|
|
2253
|
+
]
|
|
2254
|
+
},
|
|
2255
|
+
{
|
|
2256
|
+
"id": "workflows-parallel-execution",
|
|
2257
|
+
"name": "parallel execution",
|
|
2258
|
+
"path": "workflows/parallel-execution.md",
|
|
2259
|
+
"category": "workflows",
|
|
2260
|
+
"subcategory": null,
|
|
2261
|
+
"tags": [
|
|
2262
|
+
"workflows"
|
|
2263
|
+
],
|
|
2264
|
+
"aliases": [
|
|
2265
|
+
"parallel",
|
|
2266
|
+
"Task.WhenAll",
|
|
2267
|
+
"concurrent",
|
|
2268
|
+
"parallelism",
|
|
2269
|
+
"async parallel",
|
|
2270
|
+
"Parallel.ForEachAsync"
|
|
2271
|
+
],
|
|
2272
|
+
"anchors": {
|
|
2273
|
+
"patterns": "#parallel-patterns",
|
|
2274
|
+
"throttling": "#concurrency-limits"
|
|
2275
|
+
},
|
|
2276
|
+
"digest": "Task.WhenAll for I/O-bound independent parallel ops. Parallel.ForEachAsync with CancellationToken for CPU-bound batches. SemaphoreSlim for concurrency limiting. Channel<T> for producer-consumer. Never Task.WhenAll with DbContext — use separate factory-created instances per task. Measure actual benefit before adding parallelism.",
|
|
2277
|
+
"stacks": [
|
|
2278
|
+
"*"
|
|
2279
|
+
]
|
|
2280
|
+
},
|
|
2281
|
+
{
|
|
2282
|
+
"id": "workflows-thread-management",
|
|
2283
|
+
"name": "thread management",
|
|
2284
|
+
"path": "workflows/thread-management.md",
|
|
2285
|
+
"category": "workflows",
|
|
2286
|
+
"subcategory": null,
|
|
2287
|
+
"tags": [
|
|
2288
|
+
"workflows"
|
|
2289
|
+
],
|
|
2290
|
+
"aliases": [
|
|
2291
|
+
"threads",
|
|
2292
|
+
"ThreadPool",
|
|
2293
|
+
"ConfigureAwait",
|
|
2294
|
+
"deadlock prevention",
|
|
2295
|
+
"async void",
|
|
2296
|
+
"synchronization"
|
|
2297
|
+
],
|
|
2298
|
+
"anchors": {
|
|
2299
|
+
"patterns": "#thread-patterns",
|
|
2300
|
+
"deadlocks": "#deadlock-prevention"
|
|
2301
|
+
},
|
|
2302
|
+
"digest": "Use async/await throughout — never mix blocking calls (.Result, .Wait()). ConfigureAwait(false) in library code. Never Thread.Sleep — use Task.Delay with CancellationToken. Lock-free with Interlocked for counters, ConcurrentDictionary for shared state. ThreadPool.QueueUserWorkItem only for truly detached background work.",
|
|
2303
|
+
"stacks": [
|
|
2304
|
+
"*"
|
|
2305
|
+
]
|
|
2306
|
+
},
|
|
2307
|
+
{
|
|
2308
|
+
"id": "infrastructure-vercel-database",
|
|
2309
|
+
"name": "vercel database",
|
|
2310
|
+
"path": "infrastructure/vercel/vercel-database.md",
|
|
2311
|
+
"category": "infrastructure",
|
|
2312
|
+
"subcategory": "vercel",
|
|
2313
|
+
"tags": [
|
|
2314
|
+
"infrastructure",
|
|
2315
|
+
"vercel",
|
|
2316
|
+
"nextjs",
|
|
2317
|
+
"database"
|
|
2318
|
+
],
|
|
2319
|
+
"aliases": [
|
|
2320
|
+
"Vercel deploy",
|
|
2321
|
+
"serverless database",
|
|
2322
|
+
"Neon",
|
|
2323
|
+
"PlanetScale",
|
|
2324
|
+
"Vercel Postgres",
|
|
2325
|
+
"serverless postgres"
|
|
2326
|
+
],
|
|
2327
|
+
"anchors": {
|
|
2328
|
+
"decision": "#decision-tree-choose-your-db-tier",
|
|
2329
|
+
"neon": "#implementation-neon-recommended",
|
|
2330
|
+
"supabase": "#implementation-supabase--pgbouncer-transaction-mode"
|
|
2331
|
+
},
|
|
2332
|
+
"digest": "NEVER use a traditional TCP connection pool (plain pg/Npgsql) when deploying to Vercel — ephemeral functions exhaust connections instantly. ALWAYS use a serverless-compatible database: Neon (first choice for SQL), Supabase with PgBouncer on port 6543 (transaction mode), PlanetScale, or Turso. Set connection_limit=1 when using ORMs with PgBouncer.",
|
|
2333
|
+
"stacks": [
|
|
2334
|
+
"vercel"
|
|
2335
|
+
]
|
|
2336
|
+
}
|
|
2337
|
+
]
|
|
2338
|
+
}
|