@juangcarmona/lighthouse 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +8 -2
  2. package/assets/dotnet-template/Directory.Build.props +22 -0
  3. package/assets/dotnet-template/Directory.Packages.props +16 -0
  4. package/assets/dotnet-template/Lighthouse.Analyzers/BackendContractAnalyzer.cs +72 -0
  5. package/assets/dotnet-template/Lighthouse.Analyzers/Lighthouse.Analyzers.csproj +12 -0
  6. package/assets/dotnet-template/Lighthouse.Analyzers/packages.lock.json +121 -0
  7. package/assets/dotnet-template/Lighthouse.Cqrs/Handlers.cs +11 -0
  8. package/assets/dotnet-template/Lighthouse.Cqrs/Lighthouse.Cqrs.csproj +5 -0
  9. package/assets/dotnet-template/Lighthouse.Cqrs/packages.lock.json +6 -0
  10. package/assets/dotnet-template/Lighthouse.slnx +17 -0
  11. package/assets/dotnet-template/examples/src/modules/Lighthouse.Example.Modules.Catalog/CatalogModule.cs +24 -0
  12. package/assets/dotnet-template/examples/src/modules/Lighthouse.Example.Modules.Catalog/Features/Entries/CreateEntry.cs +47 -0
  13. package/assets/dotnet-template/examples/src/modules/Lighthouse.Example.Modules.Catalog/Features/Entries/EntryStore.cs +17 -0
  14. package/assets/dotnet-template/examples/src/modules/Lighthouse.Example.Modules.Catalog/Features/Entries/GetEntry.cs +30 -0
  15. package/assets/dotnet-template/examples/src/modules/Lighthouse.Example.Modules.Catalog/Lighthouse.Example.Modules.Catalog.csproj +12 -0
  16. package/assets/dotnet-template/examples/src/modules/Lighthouse.Example.Modules.Catalog/packages.lock.json +10 -0
  17. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.Api/Lighthouse.Example.Api.csproj +6 -0
  18. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.Api/Program.cs +25 -0
  19. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.Api/Properties/launchSettings.json +10 -0
  20. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.Api/packages.lock.json +86 -0
  21. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.AppHost/Lighthouse.Example.AppHost.csproj +13 -0
  22. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.AppHost/Program.cs +3 -0
  23. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.AppHost/Properties/launchSettings.json +15 -0
  24. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.AppHost/aspire.config.json +5 -0
  25. package/assets/dotnet-template/examples/src/root/Lighthouse.Example.AppHost/packages.lock.json +689 -0
  26. package/assets/dotnet-template/global.json +6 -0
  27. package/assets/dotnet-template/tests/Lighthouse.Analyzers.Tests/BackendContractTests.cs +102 -0
  28. package/assets/dotnet-template/tests/Lighthouse.Analyzers.Tests/Lighthouse.Analyzers.Tests.csproj +9 -0
  29. package/assets/dotnet-template/tests/Lighthouse.Analyzers.Tests/packages.lock.json +125 -0
  30. package/assets/dotnet-template/tests/Lighthouse.Example.Tests/CatalogTests.cs +111 -0
  31. package/assets/dotnet-template/tests/Lighthouse.Example.Tests/Lighthouse.Example.Tests.csproj +9 -0
  32. package/assets/dotnet-template/tests/Lighthouse.Example.Tests/packages.lock.json +490 -0
  33. package/assets/profiles/catalog.json +48 -0
  34. package/assets/profiles/dotnet/README.md +32 -0
  35. package/assets/profiles/dotnet/SKILL.md +18 -0
  36. package/assets/profiles/dotnet/adoption.md +39 -0
  37. package/assets/profiles/dotnet/architecture.md +37 -0
  38. package/assets/profiles/dotnet/guardrails.md +32 -0
  39. package/assets/profiles/dotnet/practices.md +36 -0
  40. package/assets/profiles/dotnet/testing-and-development.md +29 -0
  41. package/assets/profiles/dotnet/use-cases.md +29 -0
  42. package/assets/schemas/lighthouse-manifest.schema.json +10 -7
  43. package/assets/schemas/profile-catalog.schema.json +63 -0
  44. package/package.json +5 -2
  45. package/src/create-dotnet.mjs +112 -0
  46. package/src/lighthouse.mjs +63 -13
  47. package/src/profiles.mjs +133 -0
  48. package/src/verify-dotnet.mjs +85 -0
@@ -0,0 +1,490 @@
1
+ {
2
+ "version": 2,
3
+ "dependencies": {
4
+ "net10.0": {
5
+ "Microsoft.AspNetCore.Mvc.Testing": {
6
+ "type": "Direct",
7
+ "requested": "[10.0.13, )",
8
+ "resolved": "10.0.13",
9
+ "contentHash": "AiQkwLuYCtZoWD1lm6ll/tqVf+u1GVdVJw+EEBQnCOgdofcwpMCnZ6h8HEwD04rOdmF1v+pVfGzr9HFCmq3zdw==",
10
+ "dependencies": {
11
+ "Microsoft.AspNetCore.TestHost": "10.0.13",
12
+ "Microsoft.Extensions.DependencyModel": "10.0.13",
13
+ "Microsoft.Extensions.Hosting": "10.0.13"
14
+ }
15
+ },
16
+ "Microsoft.NET.Test.Sdk": {
17
+ "type": "Direct",
18
+ "requested": "[18.7.0, )",
19
+ "resolved": "18.7.0",
20
+ "contentHash": "49xH9j4UzCh2hMohJp53g3wUTvyycECw7CtVht4gfCz5ykudB1uBcF6D0TtgJPjCtP76UPW53bQElKdCeX+dUg==",
21
+ "dependencies": {
22
+ "Microsoft.CodeCoverage": "18.7.0",
23
+ "Microsoft.TestPlatform.TestHost": "18.7.0"
24
+ }
25
+ },
26
+ "xunit": {
27
+ "type": "Direct",
28
+ "requested": "[2.9.3, )",
29
+ "resolved": "2.9.3",
30
+ "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==",
31
+ "dependencies": {
32
+ "xunit.analyzers": "1.18.0",
33
+ "xunit.assert": "2.9.3",
34
+ "xunit.core": "[2.9.3]"
35
+ }
36
+ },
37
+ "xunit.runner.visualstudio": {
38
+ "type": "Direct",
39
+ "requested": "[3.1.5, )",
40
+ "resolved": "3.1.5",
41
+ "contentHash": "tKi7dSTwP4m5m9eXPM2Ime4Kn7xNf4x4zT9sdLO/G4hZVnQCRiMTWoSZqI/pYTVeI27oPPqHBKYI/DjJ9GsYgA=="
42
+ },
43
+ "Microsoft.AspNetCore.TestHost": {
44
+ "type": "Transitive",
45
+ "resolved": "10.0.13",
46
+ "contentHash": "8xzbDfEOWg5GRp5byA42Axr4TbockbxCvdHTYk27ZIdst79DO0CLBp/Zw5sduK2goRii7of4EeuTjG/yPH4tsg=="
47
+ },
48
+ "Microsoft.Bcl.Cryptography": {
49
+ "type": "Transitive",
50
+ "resolved": "10.0.2",
51
+ "contentHash": "LG9Yll3B5aNpxv0+D47g6LiOiKBIlodhcHdQwcYzo8VeexFLGqx5ymetmA2aBRyo9cCcWsQWrFsdbsr8LvmWDw=="
52
+ },
53
+ "Microsoft.CodeCoverage": {
54
+ "type": "Transitive",
55
+ "resolved": "18.7.0",
56
+ "contentHash": "+wFfx9s7D9wegM0RziXMj2kvYDT4qcqXXtyjiQwSZOGQ2wwcOAJQcD6eQXk02jt0MvRNawtp8TJxTrV+wD8X1g=="
57
+ },
58
+ "Microsoft.Extensions.Configuration": {
59
+ "type": "Transitive",
60
+ "resolved": "10.0.13",
61
+ "contentHash": "inhujYI/nikhmLxYI6ZEcaCgZ28ipJsKMPPxxr2XWf3vM0Q2P+E9R3hDHABZOLBxzD3gjpgcbSH/+hd2+gvI2A==",
62
+ "dependencies": {
63
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
64
+ "Microsoft.Extensions.Primitives": "10.0.13"
65
+ }
66
+ },
67
+ "Microsoft.Extensions.Configuration.Abstractions": {
68
+ "type": "Transitive",
69
+ "resolved": "10.0.13",
70
+ "contentHash": "DY4C2qzTt2lOIY3VoscBH/TCwTolI5DKOfgJLuI+k1QUvRNT5vTMS58AOerNiihdVRStO0wEpLeRWA8jytzHBQ==",
71
+ "dependencies": {
72
+ "Microsoft.Extensions.Primitives": "10.0.13"
73
+ }
74
+ },
75
+ "Microsoft.Extensions.Configuration.Binder": {
76
+ "type": "Transitive",
77
+ "resolved": "10.0.13",
78
+ "contentHash": "yJJl/b0+W+GEWbu+7viw6C3h2BoNkB69Vlz7s/4e+hm4mYbJqfhdcDSi9sCXJw47blsBaiQd3UDPgDtop92+ug==",
79
+ "dependencies": {
80
+ "Microsoft.Extensions.Configuration": "10.0.13",
81
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13"
82
+ }
83
+ },
84
+ "Microsoft.Extensions.Configuration.CommandLine": {
85
+ "type": "Transitive",
86
+ "resolved": "10.0.13",
87
+ "contentHash": "RwdNZ9JdGs8eZmeL5qRe7ugp0Irk3KVkWpC/w1c8kjJwu1R4HvCXYz9kwHZxn45WiaRBG5lphQKtqnBaJOQC+Q==",
88
+ "dependencies": {
89
+ "Microsoft.Extensions.Configuration": "10.0.13",
90
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13"
91
+ }
92
+ },
93
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": {
94
+ "type": "Transitive",
95
+ "resolved": "10.0.13",
96
+ "contentHash": "qJK2dm9/AxyPVfqqBaZtjkUFl2hnBR/CQnMJtSO5LdEoyATMqvZjeQVY+8l0oa6PM6qlVe28iMEyXIRQ0wyZjA==",
97
+ "dependencies": {
98
+ "Microsoft.Extensions.Configuration": "10.0.13",
99
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13"
100
+ }
101
+ },
102
+ "Microsoft.Extensions.Configuration.FileExtensions": {
103
+ "type": "Transitive",
104
+ "resolved": "10.0.13",
105
+ "contentHash": "kwC1DY55CsqPmDtJAz+7alD3G+gJcM+XwHSZrcRO8mJGYB9hRq1qC6ZH8DL0SPW9WtJ/Bae5ikzPic8SxSv6Vw==",
106
+ "dependencies": {
107
+ "Microsoft.Extensions.Configuration": "10.0.13",
108
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
109
+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.13",
110
+ "Microsoft.Extensions.FileProviders.Physical": "10.0.13",
111
+ "Microsoft.Extensions.Primitives": "10.0.13"
112
+ }
113
+ },
114
+ "Microsoft.Extensions.Configuration.Json": {
115
+ "type": "Transitive",
116
+ "resolved": "10.0.13",
117
+ "contentHash": "acCWM2+WR67kBAz6gAhD2zG+IZH9Q2VpKv5le7Msiu0vAMsnnLXpnV3BAzxd8/i+uOEo/dfb2XRYTynRVTDvEg==",
118
+ "dependencies": {
119
+ "Microsoft.Extensions.Configuration": "10.0.13",
120
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
121
+ "Microsoft.Extensions.Configuration.FileExtensions": "10.0.13",
122
+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.13"
123
+ }
124
+ },
125
+ "Microsoft.Extensions.Configuration.UserSecrets": {
126
+ "type": "Transitive",
127
+ "resolved": "10.0.13",
128
+ "contentHash": "kQ/Tx972unP+ueQL8SSninthIj6w6XP2o0VnJPFC5HQIimPMwEN704MOspEgDkmm4FUL5SuxLEU0bNiW4HEZFA==",
129
+ "dependencies": {
130
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
131
+ "Microsoft.Extensions.Configuration.Json": "10.0.13",
132
+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.13",
133
+ "Microsoft.Extensions.FileProviders.Physical": "10.0.13"
134
+ }
135
+ },
136
+ "Microsoft.Extensions.DependencyInjection": {
137
+ "type": "Transitive",
138
+ "resolved": "10.0.13",
139
+ "contentHash": "4tnWU9vrU/A8NwYe9Z6wvieZ0EBb/uM82LAT+edNhdepOBWREZ7M7mzb941EIDPJaeOFdbVrDd5+7s9e89U6bQ==",
140
+ "dependencies": {
141
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13"
142
+ }
143
+ },
144
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
145
+ "type": "Transitive",
146
+ "resolved": "10.0.13",
147
+ "contentHash": "G2GrGWNAPZBsii2F6AU8n+JT2tC1/I0Ml/e9ZyNCgPjf3hZqronP7o0X91aAynCmVeae8KkSIUNXXeXCNRmdVQ=="
148
+ },
149
+ "Microsoft.Extensions.DependencyModel": {
150
+ "type": "Transitive",
151
+ "resolved": "10.0.13",
152
+ "contentHash": "6TyllZsToy3S/Ziu67GddljRTttuVJ8bbrbVUrsdHqH5678Oax5MpaEubxLoPoWLvgUBYo4KfcAig0mkBtktXQ=="
153
+ },
154
+ "Microsoft.Extensions.Diagnostics": {
155
+ "type": "Transitive",
156
+ "resolved": "10.0.13",
157
+ "contentHash": "J9ODOrffj1mK3Et69elNsLGRguesPxvThTdVpFmQX7fLNPhIOgqHQfLdGnTBEwNAV3yf8yiyVlpDZNw2qN87Nw==",
158
+ "dependencies": {
159
+ "Microsoft.Extensions.Configuration": "10.0.13",
160
+ "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.13",
161
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.13"
162
+ }
163
+ },
164
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
165
+ "type": "Transitive",
166
+ "resolved": "10.0.13",
167
+ "contentHash": "oZzqZze8ed1fLS20HtIrkPxQXGRG/koq09srIw2ptnDHm9RHfwB++d35hosB/cXc55TH7Pshv85O0txongjCIg==",
168
+ "dependencies": {
169
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
170
+ "Microsoft.Extensions.Options": "10.0.13"
171
+ }
172
+ },
173
+ "Microsoft.Extensions.FileProviders.Abstractions": {
174
+ "type": "Transitive",
175
+ "resolved": "10.0.13",
176
+ "contentHash": "BZDwtN3uoWRghDi5lRRZPDjMMCg2Ds7J6YEYjqka/TLjqnzquEpXyvchrIMeoubwT1ns23ow6PPeAoBHJO81Rw==",
177
+ "dependencies": {
178
+ "Microsoft.Extensions.Primitives": "10.0.13"
179
+ }
180
+ },
181
+ "Microsoft.Extensions.FileProviders.Physical": {
182
+ "type": "Transitive",
183
+ "resolved": "10.0.13",
184
+ "contentHash": "U7HkgGCNPICN5k7NVK6dmLsSPSPeO/EbNcuxOl/5qdC9Ahjp9UZWKOvlnUC+rYurmoxIlwyv9e5j0BaQlTOELA==",
185
+ "dependencies": {
186
+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.13",
187
+ "Microsoft.Extensions.FileSystemGlobbing": "10.0.13",
188
+ "Microsoft.Extensions.Primitives": "10.0.13"
189
+ }
190
+ },
191
+ "Microsoft.Extensions.FileSystemGlobbing": {
192
+ "type": "Transitive",
193
+ "resolved": "10.0.13",
194
+ "contentHash": "vQVzmAbnzlhXSXA2caYnlxtG9GXxEwtj5bODiWLu06A6iqeJmfBtlfKjuOSJGRy0/CFaNUrm7u9nxEUlljc2Rg=="
195
+ },
196
+ "Microsoft.Extensions.Hosting": {
197
+ "type": "Transitive",
198
+ "resolved": "10.0.13",
199
+ "contentHash": "Q+hmPoDqeHipHyJcY7mDCQiLDUcn9jIgjoCThcgaOgjLTTT3ApTe8p6M2+twsDyfKuuCsKhSNlnNjaaggtXxRA==",
200
+ "dependencies": {
201
+ "Microsoft.Extensions.Configuration": "10.0.13",
202
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
203
+ "Microsoft.Extensions.Configuration.Binder": "10.0.13",
204
+ "Microsoft.Extensions.Configuration.CommandLine": "10.0.13",
205
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.13",
206
+ "Microsoft.Extensions.Configuration.FileExtensions": "10.0.13",
207
+ "Microsoft.Extensions.Configuration.Json": "10.0.13",
208
+ "Microsoft.Extensions.Configuration.UserSecrets": "10.0.13",
209
+ "Microsoft.Extensions.DependencyInjection": "10.0.13",
210
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
211
+ "Microsoft.Extensions.Diagnostics": "10.0.13",
212
+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.13",
213
+ "Microsoft.Extensions.FileProviders.Physical": "10.0.13",
214
+ "Microsoft.Extensions.Hosting.Abstractions": "10.0.13",
215
+ "Microsoft.Extensions.Logging": "10.0.13",
216
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13",
217
+ "Microsoft.Extensions.Logging.Configuration": "10.0.13",
218
+ "Microsoft.Extensions.Logging.Console": "10.0.13",
219
+ "Microsoft.Extensions.Logging.Debug": "10.0.13",
220
+ "Microsoft.Extensions.Logging.EventLog": "10.0.13",
221
+ "Microsoft.Extensions.Logging.EventSource": "10.0.13",
222
+ "Microsoft.Extensions.Options": "10.0.13"
223
+ }
224
+ },
225
+ "Microsoft.Extensions.Hosting.Abstractions": {
226
+ "type": "Transitive",
227
+ "resolved": "10.0.13",
228
+ "contentHash": "zIrbe9vkIFXxW3mOApIOWXw+xMwX7Cgsptr3ZSlglJt4hW2qp4fB/JU1NHgAevteBNH4PicvU9DsFPHxlnnloA==",
229
+ "dependencies": {
230
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
231
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
232
+ "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.13",
233
+ "Microsoft.Extensions.FileProviders.Abstractions": "10.0.13",
234
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13"
235
+ }
236
+ },
237
+ "Microsoft.Extensions.Logging": {
238
+ "type": "Transitive",
239
+ "resolved": "10.0.13",
240
+ "contentHash": "fqbiPy4nUp4H2XHKAVQXKN2y3T2h4cFIx1DAAgE6iY9OHkN/OA1cKFi+geJKRWGuX6pS5SFbsjIPWHJqrxE0eg==",
241
+ "dependencies": {
242
+ "Microsoft.Extensions.DependencyInjection": "10.0.13",
243
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13",
244
+ "Microsoft.Extensions.Options": "10.0.13"
245
+ }
246
+ },
247
+ "Microsoft.Extensions.Logging.Abstractions": {
248
+ "type": "Transitive",
249
+ "resolved": "10.0.13",
250
+ "contentHash": "aSZEhEig4fvNiw2zs8Z6NyDlniKtq6YjcF3DyHuqTEHcZ2VKA/6itMPZ+dW+yWABWExlDcQwwdbqX1Rcb7W8WQ==",
251
+ "dependencies": {
252
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13"
253
+ }
254
+ },
255
+ "Microsoft.Extensions.Logging.Configuration": {
256
+ "type": "Transitive",
257
+ "resolved": "10.0.13",
258
+ "contentHash": "OyYJOaE9WbBx1Hp+Dd2zrqeFM0JwH5M/x0VL6tNUv3V18vIAVpix8UjhvY9eW/iXpguEHy68JO/Z9YkBOwftIw==",
259
+ "dependencies": {
260
+ "Microsoft.Extensions.Configuration": "10.0.13",
261
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
262
+ "Microsoft.Extensions.Configuration.Binder": "10.0.13",
263
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
264
+ "Microsoft.Extensions.Logging": "10.0.13",
265
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13",
266
+ "Microsoft.Extensions.Options": "10.0.13",
267
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.13"
268
+ }
269
+ },
270
+ "Microsoft.Extensions.Logging.Console": {
271
+ "type": "Transitive",
272
+ "resolved": "10.0.13",
273
+ "contentHash": "i9rn0rHkiCxfNVbf4DRG7LOFcKPy/BioAxS07w6daWvIpLNRjskqDJcGGaYVFWndsq0iTRaS8Msry0t5fRYQug==",
274
+ "dependencies": {
275
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
276
+ "Microsoft.Extensions.Logging": "10.0.13",
277
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13",
278
+ "Microsoft.Extensions.Logging.Configuration": "10.0.13",
279
+ "Microsoft.Extensions.Options": "10.0.13"
280
+ }
281
+ },
282
+ "Microsoft.Extensions.Logging.Debug": {
283
+ "type": "Transitive",
284
+ "resolved": "10.0.13",
285
+ "contentHash": "yBig0DNMq+3UgliwxYlUC48dg0fPqvqI5B3ljzmLTrpR6maoKTOO5i9QnPgQUmQoaQWZMgu74fuF6oSDihb6pg==",
286
+ "dependencies": {
287
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
288
+ "Microsoft.Extensions.Logging": "10.0.13",
289
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13"
290
+ }
291
+ },
292
+ "Microsoft.Extensions.Logging.EventLog": {
293
+ "type": "Transitive",
294
+ "resolved": "10.0.13",
295
+ "contentHash": "OAK40lXhgMuvyNwvzW3fxLvvucN8yr5XS7dQRcPmtnPf+Pt1lpbMgao5T4Wa6VdFagtIeDZNgPtV5Ig4xstziQ==",
296
+ "dependencies": {
297
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
298
+ "Microsoft.Extensions.Logging": "10.0.13",
299
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13",
300
+ "Microsoft.Extensions.Options": "10.0.13",
301
+ "System.Diagnostics.EventLog": "10.0.13"
302
+ }
303
+ },
304
+ "Microsoft.Extensions.Logging.EventSource": {
305
+ "type": "Transitive",
306
+ "resolved": "10.0.13",
307
+ "contentHash": "SxJu3oczk+TJtHvpgAmCVzEkzx69/obA6GZCbGrbqYqc981YOAyfEprySBdFX7Yc5qatHJKHNTlpGeeBAQkZcA==",
308
+ "dependencies": {
309
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
310
+ "Microsoft.Extensions.Logging": "10.0.13",
311
+ "Microsoft.Extensions.Logging.Abstractions": "10.0.13",
312
+ "Microsoft.Extensions.Options": "10.0.13",
313
+ "Microsoft.Extensions.Primitives": "10.0.13"
314
+ }
315
+ },
316
+ "Microsoft.Extensions.Options": {
317
+ "type": "Transitive",
318
+ "resolved": "10.0.13",
319
+ "contentHash": "tmMJgdrE4uhf1JcNs9CV9moAHW+hmDuvgMiPpnQxarKaUxqI2eN33sYK5S4l9Uw+rG9PJvlm4qPxMhvolTDTaQ==",
320
+ "dependencies": {
321
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
322
+ "Microsoft.Extensions.Primitives": "10.0.13"
323
+ }
324
+ },
325
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
326
+ "type": "Transitive",
327
+ "resolved": "10.0.13",
328
+ "contentHash": "xVO5HhATc09WXuS/RaDmx8ZeWS0mTpT1L0tkEDMSBHtAnNpNsDr0ge0wIO2jinCWWqpq5dL1tRTzpYNVlvyqLw==",
329
+ "dependencies": {
330
+ "Microsoft.Extensions.Configuration.Abstractions": "10.0.13",
331
+ "Microsoft.Extensions.Configuration.Binder": "10.0.13",
332
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.13",
333
+ "Microsoft.Extensions.Options": "10.0.13",
334
+ "Microsoft.Extensions.Primitives": "10.0.13"
335
+ }
336
+ },
337
+ "Microsoft.Extensions.Primitives": {
338
+ "type": "Transitive",
339
+ "resolved": "10.0.13",
340
+ "contentHash": "ZjTwxzhiw2TMEzIbUDkMF0dfDB2I4NQgIfKD0ELu9/5Mk+SRGdKZcD0/lvBrRCAPo6KN2r0BW86MRancoyJkoA=="
341
+ },
342
+ "Microsoft.IdentityModel.Abstractions": {
343
+ "type": "Transitive",
344
+ "resolved": "8.19.2",
345
+ "contentHash": "HJbo/lnSfNHUfphPRT910poQc4T2/9+8svFLvzuaYHGAOJ2Tu+oEDqpX0BVP3BJ4OuUM1kylEKyaiX2fCAK3Cw=="
346
+ },
347
+ "Microsoft.IdentityModel.JsonWebTokens": {
348
+ "type": "Transitive",
349
+ "resolved": "8.19.2",
350
+ "contentHash": "ui3fuBT4fs8kdKfBthI4NzLYIBIneEVS8UrL1JVBzAn80UiKmngBBi0BEByE7n/9c+EElcfFlCMFFTqpkBSLNA==",
351
+ "dependencies": {
352
+ "Microsoft.IdentityModel.Tokens": "8.19.2"
353
+ }
354
+ },
355
+ "Microsoft.IdentityModel.Logging": {
356
+ "type": "Transitive",
357
+ "resolved": "8.19.2",
358
+ "contentHash": "r5YLDIxGOnkVJHrqXv/iD1FM1CgGrQOdriXuvuWvTPmKbnGANhEysq9XKmN6IHjf2a+9bAGEpnoRBsAQlvJU5w==",
359
+ "dependencies": {
360
+ "Microsoft.IdentityModel.Abstractions": "8.19.2"
361
+ }
362
+ },
363
+ "Microsoft.IdentityModel.Protocols": {
364
+ "type": "Transitive",
365
+ "resolved": "8.19.2",
366
+ "contentHash": "sGxSsSrZXNmca6D+jHH2rVRyo2nNRd/g4H9CFbPmLLq0xgoH1U0orLWE5minfijw7+zq49tBs7txenbfAErRoQ==",
367
+ "dependencies": {
368
+ "Microsoft.IdentityModel.Tokens": "8.19.2"
369
+ }
370
+ },
371
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": {
372
+ "type": "Transitive",
373
+ "resolved": "8.19.2",
374
+ "contentHash": "1XOcyY36cVymzE3qKdzKaUEZ4Pzt7ZpSa14JZoPPK1NLFUkQDs85TCqpV6XDo0YjFXj6nVK00AfOHppjghjhtw==",
375
+ "dependencies": {
376
+ "Microsoft.IdentityModel.Protocols": "8.19.2",
377
+ "System.IdentityModel.Tokens.Jwt": "8.19.2"
378
+ }
379
+ },
380
+ "Microsoft.IdentityModel.Tokens": {
381
+ "type": "Transitive",
382
+ "resolved": "8.19.2",
383
+ "contentHash": "GtPC1S02uH1gOO4fQ+zRysIicKmEXaYFP8PIkdJYXqMyruYhopre4ozVHp0XiDSA0+GJvOZH9prxCPvgBMg4Ww==",
384
+ "dependencies": {
385
+ "Microsoft.Bcl.Cryptography": "10.0.2",
386
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
387
+ "Microsoft.IdentityModel.Logging": "8.19.2"
388
+ }
389
+ },
390
+ "Microsoft.TestPlatform.ObjectModel": {
391
+ "type": "Transitive",
392
+ "resolved": "18.7.0",
393
+ "contentHash": "6rmgU4q3/WOpOPcncI0YW0Q/QpcQtwR2TTEXDR5+4TfSimPBAk6Z/BgKLeGgp1SOun0ROVUCCafXhRLwsHaPpA=="
394
+ },
395
+ "Microsoft.TestPlatform.TestHost": {
396
+ "type": "Transitive",
397
+ "resolved": "18.7.0",
398
+ "contentHash": "kYwfmebCs8992zaxEDkvG7S+YEouTeKfYVKUFEkwh1W2dIoOaevBt80XSKVXCUFEhusjOIm1sFfHBnoJgygrRA==",
399
+ "dependencies": {
400
+ "Microsoft.TestPlatform.ObjectModel": "18.7.0",
401
+ "Newtonsoft.Json": "13.0.3"
402
+ }
403
+ },
404
+ "Newtonsoft.Json": {
405
+ "type": "Transitive",
406
+ "resolved": "13.0.3",
407
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
408
+ },
409
+ "System.Diagnostics.EventLog": {
410
+ "type": "Transitive",
411
+ "resolved": "10.0.13",
412
+ "contentHash": "DkNjtQyPR5Ud/zHnWHdsOuKbFRL9nIC92Q76z0NmHVDoQm40toLtsGFTIWq7toBoVa6fo/DInL3PLxY3Asixyw=="
413
+ },
414
+ "System.IdentityModel.Tokens.Jwt": {
415
+ "type": "Transitive",
416
+ "resolved": "8.19.2",
417
+ "contentHash": "gqhDC/icByKEutygpr+OFgAmjwTVowyzFjWB8K0q1ww8uFj5a1BQNL+QvijUl9uhq4p8OdDwcAIrjVC+eC9FVA==",
418
+ "dependencies": {
419
+ "Microsoft.IdentityModel.JsonWebTokens": "8.19.2",
420
+ "Microsoft.IdentityModel.Tokens": "8.19.2"
421
+ }
422
+ },
423
+ "xunit.abstractions": {
424
+ "type": "Transitive",
425
+ "resolved": "2.0.3",
426
+ "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
427
+ },
428
+ "xunit.analyzers": {
429
+ "type": "Transitive",
430
+ "resolved": "1.18.0",
431
+ "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
432
+ },
433
+ "xunit.assert": {
434
+ "type": "Transitive",
435
+ "resolved": "2.9.3",
436
+ "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
437
+ },
438
+ "xunit.core": {
439
+ "type": "Transitive",
440
+ "resolved": "2.9.3",
441
+ "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==",
442
+ "dependencies": {
443
+ "xunit.extensibility.core": "[2.9.3]",
444
+ "xunit.extensibility.execution": "[2.9.3]"
445
+ }
446
+ },
447
+ "xunit.extensibility.core": {
448
+ "type": "Transitive",
449
+ "resolved": "2.9.3",
450
+ "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==",
451
+ "dependencies": {
452
+ "xunit.abstractions": "2.0.3"
453
+ }
454
+ },
455
+ "xunit.extensibility.execution": {
456
+ "type": "Transitive",
457
+ "resolved": "2.9.3",
458
+ "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==",
459
+ "dependencies": {
460
+ "xunit.extensibility.core": "[2.9.3]"
461
+ }
462
+ },
463
+ "JuanGCarmona.Lighthouse.Example.Modules.Catalog": {
464
+ "type": "Project",
465
+ "dependencies": {
466
+ "Lighthouse.Cqrs": "[1.0.0, )"
467
+ }
468
+ },
469
+ "lighthouse.cqrs": {
470
+ "type": "Project"
471
+ },
472
+ "lighthouse.example.api": {
473
+ "type": "Project",
474
+ "dependencies": {
475
+ "JuanGCarmona.Lighthouse.Example.Modules.Catalog": "[1.0.0, )",
476
+ "Microsoft.AspNetCore.Authentication.JwtBearer": "[10.0.13, )"
477
+ }
478
+ },
479
+ "Microsoft.AspNetCore.Authentication.JwtBearer": {
480
+ "type": "CentralTransitive",
481
+ "requested": "[10.0.13, )",
482
+ "resolved": "10.0.13",
483
+ "contentHash": "cEPhQWsaUKymSdQ+NB2rF4GnWtjofAcRrzr2aGPzbjSFyeDtIlBzrbX1Qeh/OAHjvdwBe05SbsukoSbz27AD6g==",
484
+ "dependencies": {
485
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.19.2"
486
+ }
487
+ }
488
+ }
489
+ }
490
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "../schemas/profile-catalog.schema.json",
3
+ "schemaVersion": 1,
4
+ "profiles": [
5
+ {
6
+ "id": "node-tooling",
7
+ "owner": "@juangcarmona/lighthouse",
8
+ "purpose": "Node.js tooling, package and command-line work.",
9
+ "appliesTo": { "shapes": ["library", "tooling", "cli", "worker"], "stacks": ["node"] },
10
+ "surfaces": ["package scripts", "Node.js verification"],
11
+ "verification": {
12
+ "layers": [
13
+ { "id": "static", "level": "required", "kind": "hard", "verification": "deterministic", "command": "npm run verify" },
14
+ { "id": "unit", "level": "recommended", "kind": "hard", "verification": "deterministic", "command": "npm test" }
15
+ ]
16
+ }
17
+ },
18
+ {
19
+ "id": "dotnet-backend",
20
+ "owner": "@juangcarmona/lighthouse",
21
+ "purpose": ".NET backend work with Aspire composition and a modular application boundary.",
22
+ "appliesTo": { "shapes": ["backend", "full-stack", "service"], "stacks": ["dotnet"] },
23
+ "surfaces": ["Aspire composition", "feature-aligned backend", "Roslyn guardrails", ".NET verification"],
24
+ "verification": {
25
+ "layers": [
26
+ { "id": "static", "level": "required", "kind": "hard", "verification": "deterministic", "command": "npm run verify:dotnet" },
27
+ { "id": "unit", "level": "required", "kind": "hard", "verification": "deterministic", "command": "dotnet test" },
28
+ { "id": "architecture", "level": "recommended", "kind": "hard", "verification": "deterministic", "command": "npm run verify:dotnet" },
29
+ { "id": "integration", "level": "recommended", "kind": "hard", "verification": "deterministic", "command": null },
30
+ { "id": "functional", "level": "recommended", "kind": "hard", "verification": "deterministic", "command": null }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "id": "visual-theme",
36
+ "owner": "@juangcarmona/lighthouse-ui",
37
+ "purpose": "A framework-neutral visual contract for applications with a user interface.",
38
+ "appliesTo": { "shapes": ["frontend", "full-stack", "mobile"], "stacks": [] },
39
+ "surfaces": ["semantic design tokens", "DESIGN.md", "UI design skill"],
40
+ "verification": {
41
+ "layers": [
42
+ { "id": "static", "level": "required", "kind": "hard", "verification": "deterministic", "command": "lighthouse verify" },
43
+ { "id": "browser-e2e", "level": "recommended", "kind": "soft", "verification": "semantic", "command": null }
44
+ ]
45
+ }
46
+ }
47
+ ]
48
+ }
@@ -0,0 +1,32 @@
1
+ # Lighthouse .NET profile
2
+
3
+ Use this profile to create an ASP.NET Core backend or assess an existing one. The executable reference targets .NET 10 and combines Minimal APIs, one file per command/query slice, a modular monolith structure, Aspire development orchestration, typed CQRS contracts and Roslyn boundary checks.
4
+
5
+ | Start here | Then follow |
6
+ | --- | --- |
7
+ | New backend | [Adoption](adoption.md#new-backend) → [layout and boundaries](architecture.md) → [one-file use cases](use-cases.md) |
8
+ | Existing backend | [Assessment and adoption](adoption.md#existing-backend) → [guardrail matrix](guardrails.md) |
9
+ | Implement a capability | [Use-case contract](use-cases.md) → [tests](testing-and-development.md) |
10
+ | Review all backend practices | [Practice catalog, applicability and real mechanisms](practices.md) |
11
+ | Diagnose a failed build | [Diagnostics and exceptions](guardrails.md) |
12
+
13
+ ## Defaults
14
+
15
+ - Start with one deployable API. Introduce a module only for a real ownership, domain, data or lifecycle boundary; keep features within a module by default.
16
+ - Use Minimal APIs. Place transport mapping, request/response records, command or query, validator and handler in one use-case file. Keep the handler independent of HTTP.
17
+ - Keep handlers `internal sealed`. Expose module composition and intentionally designed contracts; do not expose persistence or domain implementation types.
18
+ - Treat commands and queries as separate responsibilities. CQRS does not require separate databases, a broker or eventual consistency.
19
+ - Validate before side effects. Translate expected outcomes into useful HTTP statuses/ProblemDetails at the endpoint. Propagate cancellation.
20
+ - Run analyzers during local build and CI, back them with semantic tests and retain a narrow exception process.
21
+
22
+ ## Working implementation
23
+
24
+ ```sh
25
+ dotnet restore src/dotnet/Lighthouse.slnx --locked-mode
26
+ npm run verify:dotnet
27
+ dotnet run --project src/dotnet/examples/src/root/Lighthouse.Example.Api
28
+ ```
29
+
30
+ The distributed starter includes a Catalog example that exercises a POST command and GET query. Its store is in memory and deliberately disposable. JWT authorization is enforced; test identities live only in the test assembly. Production persistence, multitenancy, migrations, distributed caching and outbox delivery require product-specific design and tests.
31
+
32
+ The [enforcement table](guardrails.md) distinguishes implemented rules from recommendations. No rule implies remote branch protection or production readiness.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: lighthouse-dotnet
3
+ description: Apply the Lighthouse .NET profile when a repository selects the dotnet-backend profile.
4
+ ---
5
+
6
+ # Lighthouse .NET profile
7
+
8
+ Read the profile guide before changing a .NET adopter.
9
+
10
+ Keep the default backend as a feature-aligned modular monolith with Minimal API endpoints, one file per command or query, internal sealed handlers and explicit module contracts.
11
+
12
+ Use Aspire as the composition boundary and keep analyzers active in every implementation module.
13
+
14
+ Use red-green development: start with unit tests, then add integration, functional and browser evidence when the selected application surface needs them.
15
+
16
+ Run `npm run verify` and `npm run verify:dotnet` after a focused change. Treat unavailable evidence as a repair action, not as proof of compliance.
17
+
18
+ Application code, tests and build policy become adopter-owned after creation. Do not overwrite them from the profile.
@@ -0,0 +1,39 @@
1
+ # Adopt the Lighthouse .NET profile
2
+
3
+ ## New backend
4
+
5
+ From a Lighthouse checkout:
6
+
7
+ ```sh
8
+ npm run create:dotnet -- /tmp/Workshop --name Workshop
9
+ cd /tmp/Workshop
10
+ dotnet restore Workshop.slnx
11
+ npm run verify
12
+ ```
13
+
14
+ The creator accepts a new directory or an existing empty directory. It validates the C# product name and refuses a populated target. It seeds a self-contained original backend, analyzer/CQRS source, tests, manifest, SDK/package policy and CI definition. No remote repository or external service is created.
15
+
16
+ Keep one command and one query before adding a second module or persistence. Change example domain behavior through product requirements, add the real identity configuration, then select persistence, tenancy and deployment only when needed. Follow [the layout](architecture.md) and [single-file contract](use-cases.md).
17
+
18
+ ## Existing backend
19
+
20
+ 1. Inventory framework/SDK, layout, domain seams, data ownership, authentication, analysis, tests, CI and local startup. Preserve existing work.
21
+ 2. Map current code to profile defaults. Document valuable differences before changing paths or public APIs.
22
+ 3. Add pinned analyzer/CQRS source from an accepted Lighthouse revision in an isolated change. Keep a repository snapshot/version record. Adapt a rule if the product uses different handler contracts or assembly naming; prove the adapter with compiler fixtures.
23
+ 4. Enable one module at a time. Establish positive tests and inspect every new diagnostic; use narrow expiring exceptions during migration.
24
+ 5. Choose one low-risk command/query and adopt the file contract without moving unrelated features. Add functional authorization/validation tests.
25
+ 6. Run local checks, then wire them into CI. Make checks required through the product's hosting policy only after runtime and flakiness are understood.
26
+
27
+ The creator is for new products; never run it over an existing checkout.
28
+
29
+ ## File ownership and upgrades
30
+
31
+ | Content | Owner after creation | Upgrade path |
32
+ | --- | --- | --- |
33
+ | Application, tests, build policy, analyzer/CQRS source and workflow | Product | Seeded snapshot, then editable; manually review Lighthouse changes, adapt and rerun verification |
34
+ | `lighthouse.json` | Product | Select baseline/profile/integration pins explicitly |
35
+ | `LIGHTHOUSE.md` | Lighthouse projection | Generate/check through the pinned local verifier |
36
+ | Lockfiles | Package manager, committed by product | Intentional restore/update, inspect resolved diff |
37
+ | `bin`, `obj`, reports | Disposable build output | Regenerate; never hand-edit |
38
+
39
+ The current creator is a source starter, not a synchronized framework installer. Drift detection covers the declared managed projection; application/tooling changes are product-owned and are not silently overwritten. There is no automatic bulk upgrade. For repeatable adoption, retain the accepted Lighthouse commit or distributed source bundle in the product's tooling record.