@juangcarmona/lighthouse 0.6.0 → 0.8.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 (40) hide show
  1. package/README.md +7 -4
  2. package/assets/command-aliases.json +11 -0
  3. package/assets/profiles/catalog.json +1019 -17
  4. package/assets/profiles/mobile-expo/README.md +19 -0
  5. package/assets/profiles/mobile-expo/SKILL.md +14 -0
  6. package/assets/profiles/mobile-expo/adoption.md +11 -0
  7. package/assets/profiles/mobile-expo/guardrails.md +14 -0
  8. package/assets/profiles/mobile-expo/testing.md +13 -0
  9. package/assets/profiles/mobile-maui/README.md +19 -0
  10. package/assets/profiles/mobile-maui/SKILL.md +14 -0
  11. package/assets/profiles/mobile-maui/adoption.md +11 -0
  12. package/assets/profiles/mobile-maui/guardrails.md +13 -0
  13. package/assets/profiles/mobile-maui/testing.md +13 -0
  14. package/assets/profiles/pwa-capability/README.md +19 -0
  15. package/assets/profiles/pwa-capability/SKILL.md +14 -0
  16. package/assets/profiles/pwa-capability/adoption.md +9 -0
  17. package/assets/profiles/pwa-capability/guardrails.md +13 -0
  18. package/assets/profiles/pwa-capability/offline.md +11 -0
  19. package/assets/profiles/pwa-capability/testing.md +15 -0
  20. package/assets/profiles/react-web-platform/README.md +24 -0
  21. package/assets/profiles/react-web-platform/SKILL.md +18 -0
  22. package/assets/profiles/react-web-platform/adoption.md +17 -0
  23. package/assets/profiles/react-web-platform/guardrails.md +17 -0
  24. package/assets/profiles/react-web-platform/structure.md +36 -0
  25. package/assets/profiles/react-web-platform/testing.md +15 -0
  26. package/assets/profiles/web-bff/README.md +22 -0
  27. package/assets/profiles/web-bff/SKILL.md +16 -0
  28. package/assets/profiles/web-bff/adoption.md +9 -0
  29. package/assets/profiles/web-bff/security.md +16 -0
  30. package/assets/profiles/web-bff/testing.md +14 -0
  31. package/assets/schemas/command-aliases.schema.json +35 -0
  32. package/assets/schemas/init-plan.schema.json +40 -0
  33. package/assets/schemas/profile-catalog.schema.json +286 -20
  34. package/assets/skills/init/SKILL.md +30 -0
  35. package/package.json +5 -3
  36. package/src/aliases.mjs +56 -0
  37. package/src/create-dotnet.mjs +5 -1
  38. package/src/init-plan.mjs +62 -0
  39. package/src/lighthouse.mjs +443 -14
  40. package/src/profiles.mjs +78 -5
@@ -6,41 +6,1043 @@
6
6
  "id": "node-tooling",
7
7
  "owner": "@juangcarmona/lighthouse",
8
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"],
9
+ "appliesTo": {
10
+ "shapes": [
11
+ "library",
12
+ "tooling",
13
+ "cli",
14
+ "worker"
15
+ ],
16
+ "stacks": [
17
+ "node"
18
+ ]
19
+ },
20
+ "surfaces": [
21
+ "package scripts",
22
+ "Node.js verification"
23
+ ],
11
24
  "verification": {
12
25
  "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" }
26
+ {
27
+ "id": "static",
28
+ "level": "required",
29
+ "kind": "hard",
30
+ "verification": "deterministic",
31
+ "command": "npm run verify"
32
+ },
33
+ {
34
+ "id": "unit",
35
+ "level": "recommended",
36
+ "kind": "hard",
37
+ "verification": "deterministic",
38
+ "command": "npm test"
39
+ }
15
40
  ]
16
- }
41
+ },
42
+ "prerequisites": [],
43
+ "dependencies": [],
44
+ "incompatibleWith": [],
45
+ "libraries": [
46
+ "Node.js"
47
+ ],
48
+ "structure": [
49
+ "src/"
50
+ ],
51
+ "commands": [
52
+ "npm run verify",
53
+ "npm test"
54
+ ],
55
+ "failureConsequence": "The selected tooling profile cannot be reported as compliant until its required static checks pass.",
56
+ "repairHints": [
57
+ "Run npm run verify and inspect the reported repository check."
58
+ ],
59
+ "exceptions": [
60
+ "Record a project-owned exception with an owner and review date."
61
+ ],
62
+ "combinations": [],
63
+ "consumerFixture": "src/tests/lighthouse.test.mjs",
64
+ "upgradeStrategy": "Keep the catalog entry additive and rerun lighthouse profiles and lighthouse verify after upgrade.",
65
+ "guardrails": [
66
+ {
67
+ "id": "static",
68
+ "level": "required",
69
+ "kind": "hard",
70
+ "verification": "deterministic",
71
+ "command": "npm run verify",
72
+ "description": "Repository verification passes."
73
+ },
74
+ {
75
+ "id": "unit",
76
+ "level": "recommended",
77
+ "kind": "hard",
78
+ "verification": "deterministic",
79
+ "command": "npm test",
80
+ "description": "Unit tests pass."
81
+ }
82
+ ]
17
83
  },
18
84
  {
19
85
  "id": "dotnet-backend",
20
86
  "owner": "@juangcarmona/lighthouse",
21
87
  "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"],
88
+ "appliesTo": {
89
+ "shapes": [
90
+ "backend",
91
+ "full-stack",
92
+ "service"
93
+ ],
94
+ "stacks": [
95
+ "dotnet"
96
+ ]
97
+ },
98
+ "surfaces": [
99
+ "Aspire composition",
100
+ "feature-aligned backend",
101
+ "Roslyn guardrails",
102
+ ".NET verification"
103
+ ],
24
104
  "verification": {
25
105
  "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 }
106
+ {
107
+ "id": "static",
108
+ "level": "required",
109
+ "kind": "hard",
110
+ "verification": "deterministic",
111
+ "command": "npm run verify:dotnet"
112
+ },
113
+ {
114
+ "id": "unit",
115
+ "level": "required",
116
+ "kind": "hard",
117
+ "verification": "deterministic",
118
+ "command": "dotnet test"
119
+ },
120
+ {
121
+ "id": "architecture",
122
+ "level": "recommended",
123
+ "kind": "hard",
124
+ "verification": "deterministic",
125
+ "command": "npm run verify:dotnet"
126
+ },
127
+ {
128
+ "id": "integration",
129
+ "level": "recommended",
130
+ "kind": "hard",
131
+ "verification": "deterministic",
132
+ "command": null
133
+ },
134
+ {
135
+ "id": "functional",
136
+ "level": "recommended",
137
+ "kind": "hard",
138
+ "verification": "deterministic",
139
+ "command": null
140
+ }
31
141
  ]
32
- }
142
+ },
143
+ "prerequisites": [
144
+ ".NET SDK and Aspire tooling"
145
+ ],
146
+ "dependencies": [],
147
+ "incompatibleWith": [],
148
+ "libraries": [
149
+ ".NET",
150
+ "Aspire",
151
+ "NSubstitute"
152
+ ],
153
+ "structure": [
154
+ "src/",
155
+ "tests/",
156
+ "Directory.Build.props"
157
+ ],
158
+ "commands": [
159
+ "npm run verify:dotnet",
160
+ "dotnet test"
161
+ ],
162
+ "failureConsequence": "The backend profile is not ready for delivery while its analyzer, architecture or test checks fail.",
163
+ "repairHints": [
164
+ "Run npm run verify:dotnet and dotnet test, then resolve the reported profile check."
165
+ ],
166
+ "exceptions": [
167
+ "Record a narrow, expiring exception for a suppressed diagnostic."
168
+ ],
169
+ "combinations": [],
170
+ "consumerFixture": "src/tests/create-dotnet.test.mjs",
171
+ "upgradeStrategy": "Regenerate only Lighthouse-owned starter and guidance surfaces after reviewing the profile upgrade guide.",
172
+ "guardrails": [
173
+ {
174
+ "id": "static",
175
+ "level": "required",
176
+ "kind": "hard",
177
+ "verification": "deterministic",
178
+ "command": "npm run verify:dotnet",
179
+ "description": "Static backend and analyzer checks pass."
180
+ },
181
+ {
182
+ "id": "unit",
183
+ "level": "required",
184
+ "kind": "hard",
185
+ "verification": "deterministic",
186
+ "command": "dotnet test",
187
+ "description": "Backend unit tests pass."
188
+ },
189
+ {
190
+ "id": "architecture",
191
+ "level": "recommended",
192
+ "kind": "hard",
193
+ "verification": "deterministic",
194
+ "command": "npm run verify:dotnet",
195
+ "description": "Architecture checks pass."
196
+ },
197
+ {
198
+ "id": "integration",
199
+ "level": "recommended",
200
+ "kind": "hard",
201
+ "verification": "deterministic",
202
+ "command": null,
203
+ "description": "Integration evidence is available when the application requires it."
204
+ },
205
+ {
206
+ "id": "functional",
207
+ "level": "recommended",
208
+ "kind": "hard",
209
+ "verification": "deterministic",
210
+ "command": null,
211
+ "description": "Functional evidence is available when the application requires it."
212
+ }
213
+ ]
33
214
  },
34
215
  {
35
216
  "id": "visual-theme",
36
217
  "owner": "@juangcarmona/lighthouse-ui",
37
218
  "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"],
219
+ "appliesTo": {
220
+ "shapes": [
221
+ "frontend",
222
+ "full-stack",
223
+ "mobile"
224
+ ],
225
+ "stacks": []
226
+ },
227
+ "surfaces": [
228
+ "semantic design tokens",
229
+ "DESIGN.md",
230
+ "UI design skill"
231
+ ],
232
+ "verification": {
233
+ "layers": [
234
+ {
235
+ "id": "static",
236
+ "level": "required",
237
+ "kind": "hard",
238
+ "verification": "deterministic",
239
+ "command": "lighthouse verify"
240
+ },
241
+ {
242
+ "id": "browser-e2e",
243
+ "level": "recommended",
244
+ "kind": "soft",
245
+ "verification": "semantic",
246
+ "command": null
247
+ }
248
+ ]
249
+ },
250
+ "prerequisites": [
251
+ "A user-interface surface"
252
+ ],
253
+ "dependencies": [],
254
+ "incompatibleWith": [],
255
+ "libraries": [
256
+ "@juangcarmona/lighthouse-ui"
257
+ ],
258
+ "structure": [
259
+ "docs/design/DESIGN.md",
260
+ ".agents/skills/lighthouse-ui/SKILL.md"
261
+ ],
262
+ "commands": [
263
+ "lighthouse verify",
264
+ "npm run test:visual"
265
+ ],
266
+ "failureConsequence": "The visual contract is incomplete until its tokens, guide, skill and applicable visual evidence are restored.",
267
+ "repairHints": [
268
+ "Run lighthouse reconcile after reviewing the visual-theme profile plan.",
269
+ "Run npm run test:visual for visual changes."
270
+ ],
271
+ "exceptions": [
272
+ "Record a project-owned visual exception with an owner and review date."
273
+ ],
274
+ "combinations": [],
275
+ "consumerFixture": "src/tests/lighthouse.test.mjs",
276
+ "upgradeStrategy": "Preserve project-owned design content and reconcile only Lighthouse-owned visual projections.",
277
+ "guardrails": [
278
+ {
279
+ "id": "static",
280
+ "level": "required",
281
+ "kind": "hard",
282
+ "verification": "deterministic",
283
+ "command": "lighthouse verify",
284
+ "description": "The token and design-guide contract passes."
285
+ },
286
+ {
287
+ "id": "browser-e2e",
288
+ "level": "recommended",
289
+ "kind": "soft",
290
+ "verification": "semantic",
291
+ "command": "npm run test:visual",
292
+ "description": "Critical visual journeys have reviewed evidence."
293
+ }
294
+ ]
295
+ },
296
+ {
297
+ "id": "react-web-platform",
298
+ "owner": "@juangcarmona/lighthouse",
299
+ "purpose": "React and TypeScript web applications with feature-oriented source, explicit browser contracts and reproducible evidence.",
300
+ "appliesTo": {
301
+ "shapes": [
302
+ "frontend",
303
+ "full-stack"
304
+ ],
305
+ "stacks": [
306
+ "react",
307
+ "typescript"
308
+ ]
309
+ },
310
+ "surfaces": [
311
+ "React application structure",
312
+ "feature slices",
313
+ "API client",
314
+ "server state",
315
+ "browser evidence",
316
+ "accessibility evidence"
317
+ ],
318
+ "prerequisites": [
319
+ "Node.js and a supported React toolchain"
320
+ ],
321
+ "dependencies": [
322
+ "visual-theme"
323
+ ],
324
+ "incompatibleWith": [],
325
+ "libraries": [
326
+ "React",
327
+ "TypeScript",
328
+ "TanStack Query",
329
+ "Testing Library",
330
+ "Vitest",
331
+ "Playwright",
332
+ "@axe-core/playwright",
333
+ "ESLint",
334
+ "typescript-eslint",
335
+ "Prettier"
336
+ ],
337
+ "structure": [
338
+ "src/app/",
339
+ "src/features/",
340
+ "src/shared/",
341
+ "src/api/",
342
+ "src/i18n/",
343
+ "src/design-system/",
344
+ "tests/"
345
+ ],
346
+ "commands": [
347
+ "npm run typecheck",
348
+ "npm run lint",
349
+ "npm run format:check",
350
+ "npm run build",
351
+ "npm test",
352
+ "npm run test:e2e"
353
+ ],
354
+ "failureConsequence": "The web profile is not ready for delivery while its required static, unit, browser or accessibility evidence is missing or failing.",
355
+ "repairHints": [
356
+ "Run the project typecheck, lint, format, build and unit commands.",
357
+ "Run the critical Playwright journeys and axe checks.",
358
+ "Select web-bff for authenticated browser sessions."
359
+ ],
360
+ "exceptions": [
361
+ "Record a project-owned exception with an owner, scope, reason and review date."
362
+ ],
363
+ "combinations": [
364
+ {
365
+ "with": [
366
+ "visual-theme"
367
+ ],
368
+ "purpose": "A web application using the Lighthouse visual contract."
369
+ },
370
+ {
371
+ "with": [
372
+ "visual-theme",
373
+ "web-bff",
374
+ "dotnet-backend"
375
+ ],
376
+ "purpose": "An authenticated web application with a server-side session boundary."
377
+ }
378
+ ],
379
+ "consumerFixture": "src/tests/profile-fixtures.test.mjs",
380
+ "upgradeStrategy": "Preserve adopter-owned source and configuration; reconcile only Lighthouse-owned profile guidance and declared projections.",
381
+ "guardrails": [
382
+ {
383
+ "id": "static",
384
+ "level": "required",
385
+ "kind": "hard",
386
+ "verification": "deterministic",
387
+ "command": "npm run typecheck",
388
+ "description": "Strict TypeScript and static checks pass."
389
+ },
390
+ {
391
+ "id": "unit",
392
+ "level": "required",
393
+ "kind": "hard",
394
+ "verification": "deterministic",
395
+ "command": "npm test",
396
+ "description": "Unit and component tests pass."
397
+ },
398
+ {
399
+ "id": "browser-e2e",
400
+ "level": "required",
401
+ "kind": "hard",
402
+ "verification": "deterministic",
403
+ "command": "npm run test:e2e",
404
+ "description": "Critical browser journeys have Playwright evidence."
405
+ },
406
+ {
407
+ "id": "functional",
408
+ "level": "required",
409
+ "kind": "soft",
410
+ "verification": "semantic",
411
+ "command": null,
412
+ "description": "Critical accessibility surfaces have axe and required human evidence."
413
+ },
414
+ {
415
+ "id": "architecture",
416
+ "level": "recommended",
417
+ "kind": "hard",
418
+ "verification": "deterministic",
419
+ "command": null,
420
+ "description": "Feature import boundaries remain valid."
421
+ },
422
+ {
423
+ "id": "operational",
424
+ "level": "optional",
425
+ "kind": "soft",
426
+ "verification": "human",
427
+ "command": null,
428
+ "description": "The project has reviewed performance and runtime budgets when selected."
429
+ }
430
+ ],
431
+ "verification": {
432
+ "layers": [
433
+ {
434
+ "id": "static",
435
+ "level": "required",
436
+ "kind": "hard",
437
+ "verification": "deterministic",
438
+ "command": "npm run typecheck"
439
+ },
440
+ {
441
+ "id": "unit",
442
+ "level": "required",
443
+ "kind": "hard",
444
+ "verification": "deterministic",
445
+ "command": "npm test"
446
+ },
447
+ {
448
+ "id": "browser-e2e",
449
+ "level": "required",
450
+ "kind": "hard",
451
+ "verification": "deterministic",
452
+ "command": "npm run test:e2e"
453
+ },
454
+ {
455
+ "id": "functional",
456
+ "level": "required",
457
+ "kind": "soft",
458
+ "verification": "semantic",
459
+ "command": null
460
+ },
461
+ {
462
+ "id": "architecture",
463
+ "level": "recommended",
464
+ "kind": "hard",
465
+ "verification": "deterministic",
466
+ "command": null
467
+ },
468
+ {
469
+ "id": "operational",
470
+ "level": "optional",
471
+ "kind": "soft",
472
+ "verification": "human",
473
+ "command": null
474
+ }
475
+ ]
476
+ }
477
+ },
478
+ {
479
+ "id": "web-bff",
480
+ "owner": "@juangcarmona/lighthouse",
481
+ "purpose": "A server-side session and API boundary for authenticated web applications.",
482
+ "appliesTo": {
483
+ "shapes": [
484
+ "full-stack"
485
+ ],
486
+ "stacks": [
487
+ "react",
488
+ "dotnet"
489
+ ]
490
+ },
491
+ "surfaces": [
492
+ "same-origin session",
493
+ "OAuth callback",
494
+ "CSRF policy",
495
+ "API proxy boundary",
496
+ "ProblemDetails",
497
+ "correlation and rate limiting"
498
+ ],
499
+ "prerequisites": [
500
+ "An identity provider or approved test identity",
501
+ "A web application with an API boundary"
502
+ ],
503
+ "dependencies": [
504
+ "react-web-platform",
505
+ "dotnet-backend"
506
+ ],
507
+ "incompatibleWith": [],
508
+ "libraries": [
509
+ "ASP.NET Core",
510
+ "OAuth Authorization Code with PKCE"
511
+ ],
512
+ "structure": [
513
+ "src/",
514
+ "tests/",
515
+ "session boundary",
516
+ "API routes"
517
+ ],
518
+ "commands": [
519
+ "npm run verify",
520
+ "npm run verify:dotnet",
521
+ "npm run test:e2e"
522
+ ],
523
+ "failureConsequence": "The authenticated web profile is not ready for delivery while session, CSRF, allowlist, logout or browser evidence is missing.",
524
+ "repairHints": [
525
+ "Verify cookie flags and the PKCE callback.",
526
+ "Run the negative CSRF, destination, logout and expiry tests.",
527
+ "Keep tokens outside browser storage."
528
+ ],
529
+ "exceptions": [
530
+ "Record a product and architecture decision for direct browser-to-API access or a separate BFF service."
531
+ ],
532
+ "combinations": [
533
+ {
534
+ "with": [
535
+ "react-web-platform",
536
+ "dotnet-backend",
537
+ "visual-theme"
538
+ ],
539
+ "purpose": "An authenticated web application with Lighthouse visual and backend profiles."
540
+ }
541
+ ],
542
+ "consumerFixture": "src/tests/profile-fixtures.test.mjs",
543
+ "upgradeStrategy": "Preserve adopter-owned identity and host code; reconcile only Lighthouse-owned guidance and declared profile projections.",
544
+ "guardrails": [
545
+ {
546
+ "id": "static",
547
+ "level": "required",
548
+ "kind": "hard",
549
+ "verification": "deterministic",
550
+ "command": "npm run verify:dotnet",
551
+ "description": "The host and BFF static checks pass."
552
+ },
553
+ {
554
+ "id": "integration",
555
+ "level": "required",
556
+ "kind": "hard",
557
+ "verification": "deterministic",
558
+ "command": "npm run verify:dotnet",
559
+ "description": "Session, callback and upstream integration checks pass."
560
+ },
561
+ {
562
+ "id": "browser-e2e",
563
+ "level": "required",
564
+ "kind": "hard",
565
+ "verification": "deterministic",
566
+ "command": "npm run test:e2e",
567
+ "description": "Authenticated browser journeys have evidence."
568
+ },
569
+ {
570
+ "id": "functional",
571
+ "level": "required",
572
+ "kind": "soft",
573
+ "verification": "semantic",
574
+ "command": null,
575
+ "description": "Security policy and exception evidence have human review."
576
+ },
577
+ {
578
+ "id": "operational",
579
+ "level": "recommended",
580
+ "kind": "hard",
581
+ "verification": "deterministic",
582
+ "command": null,
583
+ "description": "Correlation, rate limiting and observability checks are configured."
584
+ }
585
+ ],
586
+ "verification": {
587
+ "layers": [
588
+ {
589
+ "id": "static",
590
+ "level": "required",
591
+ "kind": "hard",
592
+ "verification": "deterministic",
593
+ "command": "npm run verify:dotnet"
594
+ },
595
+ {
596
+ "id": "integration",
597
+ "level": "required",
598
+ "kind": "hard",
599
+ "verification": "deterministic",
600
+ "command": "npm run verify:dotnet"
601
+ },
602
+ {
603
+ "id": "browser-e2e",
604
+ "level": "required",
605
+ "kind": "hard",
606
+ "verification": "deterministic",
607
+ "command": "npm run test:e2e"
608
+ },
609
+ {
610
+ "id": "functional",
611
+ "level": "required",
612
+ "kind": "soft",
613
+ "verification": "semantic",
614
+ "command": null
615
+ },
616
+ {
617
+ "id": "operational",
618
+ "level": "recommended",
619
+ "kind": "hard",
620
+ "verification": "deterministic",
621
+ "command": null
622
+ }
623
+ ]
624
+ }
625
+ },
626
+ {
627
+ "id": "pwa-capability",
628
+ "owner": "@juangcarmona/lighthouse",
629
+ "purpose": "An optional installability and offline capability for a React web application.",
630
+ "appliesTo": {
631
+ "shapes": [
632
+ "frontend",
633
+ "full-stack"
634
+ ],
635
+ "stacks": [
636
+ "react"
637
+ ]
638
+ },
639
+ "surfaces": [
640
+ "manifest",
641
+ "icons",
642
+ "service worker",
643
+ "asset cache",
644
+ "update strategy",
645
+ "offline policy"
646
+ ],
647
+ "prerequisites": [
648
+ "The react-web-platform profile",
649
+ "A product requirement for installability or offline behavior"
650
+ ],
651
+ "dependencies": [
652
+ "react-web-platform"
653
+ ],
654
+ "incompatibleWith": [],
655
+ "libraries": [
656
+ "Web App Manifest",
657
+ "Service Worker"
658
+ ],
659
+ "structure": [
660
+ "public/manifest.webmanifest",
661
+ "public/icons/",
662
+ "src/service-worker.*"
663
+ ],
664
+ "commands": [
665
+ "npm run typecheck",
666
+ "npm run build",
667
+ "npm run test:e2e"
668
+ ],
669
+ "failureConsequence": "The PWA capability is not ready for delivery while installability, update, offline or session evidence is missing.",
670
+ "repairHints": [
671
+ "Declare the offline bounded contexts and cache policy.",
672
+ "Run fresh-install, update, logout, expiry and user-change journeys.",
673
+ "Select web-bff for authenticated sessions."
674
+ ],
675
+ "exceptions": [
676
+ "Record an explicit product decision for any online-only or push exception."
677
+ ],
678
+ "combinations": [
679
+ {
680
+ "with": [
681
+ "visual-theme",
682
+ "react-web-platform"
683
+ ],
684
+ "purpose": "A public installable React web application."
685
+ },
686
+ {
687
+ "with": [
688
+ "visual-theme",
689
+ "react-web-platform",
690
+ "web-bff",
691
+ "dotnet-backend"
692
+ ],
693
+ "purpose": "An authenticated installable React web application."
694
+ }
695
+ ],
696
+ "consumerFixture": "src/tests/profile-fixtures.test.mjs",
697
+ "upgradeStrategy": "Preserve adopter-owned manifest, icons and service-worker code; reconcile only Lighthouse-owned guidance and profile metadata.",
698
+ "guardrails": [
699
+ {
700
+ "id": "static",
701
+ "level": "required",
702
+ "kind": "hard",
703
+ "verification": "deterministic",
704
+ "command": "npm run build",
705
+ "description": "Manifest and service-worker assets are included in the reproducible build."
706
+ },
707
+ {
708
+ "id": "browser-e2e",
709
+ "level": "required",
710
+ "kind": "hard",
711
+ "verification": "deterministic",
712
+ "command": "npm run test:e2e",
713
+ "description": "Install, update and declared offline journeys have browser evidence."
714
+ },
715
+ {
716
+ "id": "functional",
717
+ "level": "required",
718
+ "kind": "soft",
719
+ "verification": "semantic",
720
+ "command": null,
721
+ "description": "Offline scope, private-data policy and recovery behavior have human review."
722
+ },
723
+ {
724
+ "id": "operational",
725
+ "level": "recommended",
726
+ "kind": "hard",
727
+ "verification": "deterministic",
728
+ "command": null,
729
+ "description": "Cache invalidation and update telemetry are checked when selected."
730
+ }
731
+ ],
732
+ "verification": {
733
+ "layers": [
734
+ {
735
+ "id": "static",
736
+ "level": "required",
737
+ "kind": "hard",
738
+ "verification": "deterministic",
739
+ "command": "npm run build"
740
+ },
741
+ {
742
+ "id": "browser-e2e",
743
+ "level": "required",
744
+ "kind": "hard",
745
+ "verification": "deterministic",
746
+ "command": "npm run test:e2e"
747
+ },
748
+ {
749
+ "id": "functional",
750
+ "level": "required",
751
+ "kind": "soft",
752
+ "verification": "semantic",
753
+ "command": null
754
+ },
755
+ {
756
+ "id": "operational",
757
+ "level": "recommended",
758
+ "kind": "hard",
759
+ "verification": "deterministic",
760
+ "command": null
761
+ }
762
+ ]
763
+ }
764
+ },
765
+ {
766
+ "id": "mobile-expo",
767
+ "owner": "@juangcarmona/lighthouse",
768
+ "purpose": "An Expo and React Native profile for products with real Android or iOS requirements.",
769
+ "appliesTo": {
770
+ "shapes": [
771
+ "mobile",
772
+ "full-stack"
773
+ ],
774
+ "stacks": [
775
+ "expo",
776
+ "react-native"
777
+ ]
778
+ },
779
+ "surfaces": [
780
+ "Expo application",
781
+ "native navigation",
782
+ "secure storage",
783
+ "deep links",
784
+ "permissions",
785
+ "push notifications",
786
+ "native builds"
787
+ ],
788
+ "prerequisites": [
789
+ "Android or iOS is a product requirement",
790
+ "Expo tooling and a selected emulator or device target"
791
+ ],
792
+ "dependencies": [],
793
+ "incompatibleWith": [
794
+ "mobile-maui"
795
+ ],
796
+ "libraries": [
797
+ "Expo",
798
+ "React Native",
799
+ "Expo Router",
800
+ "TypeScript",
801
+ "TanStack Query",
802
+ "Expo SecureStore"
803
+ ],
804
+ "structure": [
805
+ "app/",
806
+ "src/features/",
807
+ "src/shared/",
808
+ "tests/"
809
+ ],
810
+ "commands": [
811
+ "npx expo doctor",
812
+ "npm test",
813
+ "npx expo start"
814
+ ],
815
+ "failureConsequence": "The mobile profile is not ready for delivery while native authentication, storage, permissions or device evidence is missing.",
816
+ "repairHints": [
817
+ "Run npx expo doctor and the selected native test target.",
818
+ "Verify secure storage, logout, expiry and user-change behavior.",
819
+ "Keep optional web export evidence separate."
820
+ ],
821
+ "exceptions": [
822
+ "Record a product decision for each omitted native platform capability or web export."
823
+ ],
824
+ "combinations": [
825
+ {
826
+ "with": [
827
+ "dotnet-backend"
828
+ ],
829
+ "purpose": "A TypeScript mobile application with a Lighthouse backend."
830
+ }
831
+ ],
832
+ "consumerFixture": "src/tests/profile-fixtures.test.mjs",
833
+ "upgradeStrategy": "Preserve adopter-owned Expo source, native configuration and permissions; reconcile only Lighthouse-owned guidance and profile metadata.",
834
+ "guardrails": [
835
+ {
836
+ "id": "static",
837
+ "level": "required",
838
+ "kind": "hard",
839
+ "verification": "deterministic",
840
+ "command": "npx expo doctor",
841
+ "description": "Expo configuration and static checks pass."
842
+ },
843
+ {
844
+ "id": "unit",
845
+ "level": "required",
846
+ "kind": "hard",
847
+ "verification": "deterministic",
848
+ "command": "npm test",
849
+ "description": "Unit and component tests pass."
850
+ },
851
+ {
852
+ "id": "functional",
853
+ "level": "required",
854
+ "kind": "hard",
855
+ "verification": "deterministic",
856
+ "command": "npx expo start",
857
+ "description": "Authentication, secure storage and native interaction evidence passes on the selected target."
858
+ },
859
+ {
860
+ "id": "browser-e2e",
861
+ "level": "optional",
862
+ "kind": "hard",
863
+ "verification": "deterministic",
864
+ "command": "npx expo export --platform web",
865
+ "description": "Selected web export has separate browser evidence."
866
+ },
867
+ {
868
+ "id": "operational",
869
+ "level": "recommended",
870
+ "kind": "soft",
871
+ "verification": "human",
872
+ "command": null,
873
+ "description": "Permissions, push and signing decisions have human review."
874
+ }
875
+ ],
876
+ "verification": {
877
+ "layers": [
878
+ {
879
+ "id": "static",
880
+ "level": "required",
881
+ "kind": "hard",
882
+ "verification": "deterministic",
883
+ "command": "npx expo doctor"
884
+ },
885
+ {
886
+ "id": "unit",
887
+ "level": "required",
888
+ "kind": "hard",
889
+ "verification": "deterministic",
890
+ "command": "npm test"
891
+ },
892
+ {
893
+ "id": "functional",
894
+ "level": "required",
895
+ "kind": "hard",
896
+ "verification": "deterministic",
897
+ "command": "npx expo start"
898
+ },
899
+ {
900
+ "id": "browser-e2e",
901
+ "level": "optional",
902
+ "kind": "hard",
903
+ "verification": "deterministic",
904
+ "command": "npx expo export --platform web"
905
+ },
906
+ {
907
+ "id": "operational",
908
+ "level": "recommended",
909
+ "kind": "soft",
910
+ "verification": "human",
911
+ "command": null
912
+ }
913
+ ]
914
+ }
915
+ },
916
+ {
917
+ "id": "mobile-maui",
918
+ "owner": "@juangcarmona/lighthouse",
919
+ "purpose": "A native .NET MAUI profile for products with real Android or iOS requirements.",
920
+ "appliesTo": {
921
+ "shapes": [
922
+ "mobile",
923
+ "full-stack"
924
+ ],
925
+ "stacks": [
926
+ "maui",
927
+ "dotnet"
928
+ ]
929
+ },
930
+ "surfaces": [
931
+ ".NET MAUI application",
932
+ "native lifecycle",
933
+ "secure storage",
934
+ "deep links",
935
+ "permissions",
936
+ "device capabilities",
937
+ "native builds"
938
+ ],
939
+ "prerequisites": [
940
+ "Android or iOS is a product requirement",
941
+ ".NET SDK and a selected emulator or device target"
942
+ ],
943
+ "dependencies": [],
944
+ "incompatibleWith": [
945
+ "mobile-expo"
946
+ ],
947
+ "libraries": [
948
+ ".NET MAUI",
949
+ "C#",
950
+ "XAML",
951
+ "OIDC Authorization Code with PKCE"
952
+ ],
953
+ "structure": [
954
+ "src/",
955
+ "tests/",
956
+ "platforms/"
957
+ ],
958
+ "commands": [
959
+ "dotnet restore --locked-mode",
960
+ "dotnet build",
961
+ "dotnet test"
962
+ ],
963
+ "failureConsequence": "The mobile profile is not ready for delivery while native authentication, storage, permissions or device evidence is missing.",
964
+ "repairHints": [
965
+ "Run locked restore, analyzers and the selected device test.",
966
+ "Verify secure storage, logout, expiry and user-change behavior.",
967
+ "Select exactly one native mobile profile unless a product decision says otherwise."
968
+ ],
969
+ "exceptions": [
970
+ "Record a product decision for each omitted target, device capability or signing step."
971
+ ],
972
+ "combinations": [
973
+ {
974
+ "with": [
975
+ "dotnet-backend"
976
+ ],
977
+ "purpose": "A native .NET mobile application with a Lighthouse backend."
978
+ }
979
+ ],
980
+ "consumerFixture": "src/tests/profile-fixtures.test.mjs",
981
+ "upgradeStrategy": "Preserve adopter-owned MAUI source, platform configuration and permissions; reconcile only Lighthouse-owned guidance and profile metadata.",
982
+ "guardrails": [
983
+ {
984
+ "id": "static",
985
+ "level": "required",
986
+ "kind": "hard",
987
+ "verification": "deterministic",
988
+ "command": "dotnet build",
989
+ "description": "Locked restore, analyzers and build checks pass."
990
+ },
991
+ {
992
+ "id": "unit",
993
+ "level": "required",
994
+ "kind": "hard",
995
+ "verification": "deterministic",
996
+ "command": "dotnet test",
997
+ "description": "Unit and client tests pass."
998
+ },
999
+ {
1000
+ "id": "functional",
1001
+ "level": "required",
1002
+ "kind": "hard",
1003
+ "verification": "deterministic",
1004
+ "command": "dotnet test",
1005
+ "description": "Authentication, secure storage and native interaction evidence passes on the selected target."
1006
+ },
1007
+ {
1008
+ "id": "operational",
1009
+ "level": "recommended",
1010
+ "kind": "soft",
1011
+ "verification": "human",
1012
+ "command": null,
1013
+ "description": "Permissions, device capabilities and signing decisions have human review."
1014
+ }
1015
+ ],
40
1016
  "verification": {
41
1017
  "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 }
1018
+ {
1019
+ "id": "static",
1020
+ "level": "required",
1021
+ "kind": "hard",
1022
+ "verification": "deterministic",
1023
+ "command": "dotnet build"
1024
+ },
1025
+ {
1026
+ "id": "unit",
1027
+ "level": "required",
1028
+ "kind": "hard",
1029
+ "verification": "deterministic",
1030
+ "command": "dotnet test"
1031
+ },
1032
+ {
1033
+ "id": "functional",
1034
+ "level": "required",
1035
+ "kind": "hard",
1036
+ "verification": "deterministic",
1037
+ "command": "dotnet test"
1038
+ },
1039
+ {
1040
+ "id": "operational",
1041
+ "level": "recommended",
1042
+ "kind": "soft",
1043
+ "verification": "human",
1044
+ "command": null
1045
+ }
44
1046
  ]
45
1047
  }
46
1048
  }