@codyswann/lisa 1.0.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 (322) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +867 -0
  3. package/all/copy-overwrite/.claude/README.md +205 -0
  4. package/all/copy-overwrite/.claude/agents/agent-architect.md +311 -0
  5. package/all/copy-overwrite/.claude/agents/codebase-analyzer.md +146 -0
  6. package/all/copy-overwrite/.claude/agents/codebase-locator.md +125 -0
  7. package/all/copy-overwrite/.claude/agents/codebase-pattern-finder.md +237 -0
  8. package/all/copy-overwrite/.claude/agents/git-history-analyzer.md +183 -0
  9. package/all/copy-overwrite/.claude/agents/hooks-expert.md +74 -0
  10. package/all/copy-overwrite/.claude/agents/skill-evaluator.md +246 -0
  11. package/all/copy-overwrite/.claude/agents/slash-command-architect.md +87 -0
  12. package/all/copy-overwrite/.claude/agents/web-search-researcher.md +112 -0
  13. package/all/copy-overwrite/.claude/commands/git/commit-and-submit-pr.md +8 -0
  14. package/all/copy-overwrite/.claude/commands/git/commit.md +44 -0
  15. package/all/copy-overwrite/.claude/commands/git/prune.md +34 -0
  16. package/all/copy-overwrite/.claude/commands/git/submit-pr.md +50 -0
  17. package/all/copy-overwrite/.claude/commands/jira/create.md +50 -0
  18. package/all/copy-overwrite/.claude/commands/jira/verify.md +34 -0
  19. package/all/copy-overwrite/.claude/commands/project/archive.md +8 -0
  20. package/all/copy-overwrite/.claude/commands/project/bootstrap.md +49 -0
  21. package/all/copy-overwrite/.claude/commands/project/complete-task.md +7 -0
  22. package/all/copy-overwrite/.claude/commands/project/debrief.md +65 -0
  23. package/all/copy-overwrite/.claude/commands/project/execute.md +94 -0
  24. package/all/copy-overwrite/.claude/commands/project/implement.md +42 -0
  25. package/all/copy-overwrite/.claude/commands/project/local-code-review.md +88 -0
  26. package/all/copy-overwrite/.claude/commands/project/lower-code-complexity.md +74 -0
  27. package/all/copy-overwrite/.claude/commands/project/plan.md +314 -0
  28. package/all/copy-overwrite/.claude/commands/project/research.md +248 -0
  29. package/all/copy-overwrite/.claude/commands/project/review.md +63 -0
  30. package/all/copy-overwrite/.claude/commands/project/setup.md +19 -0
  31. package/all/copy-overwrite/.claude/commands/project/verify.md +38 -0
  32. package/all/copy-overwrite/.claude/commands/pull-request/review.md +12 -0
  33. package/all/copy-overwrite/.claude/commands/rules/format-md.md +72 -0
  34. package/all/copy-overwrite/.claude/commands/sonarqube/check.md +6 -0
  35. package/all/copy-overwrite/.claude/commands/sonarqube/fix.md +3 -0
  36. package/all/copy-overwrite/.claude/hooks/README.md +301 -0
  37. package/all/copy-overwrite/.claude/hooks/notify-ntfy.sh +181 -0
  38. package/all/copy-overwrite/.claude/settings.json +41 -0
  39. package/all/copy-overwrite/.claude/settings.local.json.example +14 -0
  40. package/all/copy-overwrite/.claude/skills/coding-philosophy/SKILL.md +405 -0
  41. package/all/copy-overwrite/.claude/skills/coding-philosophy/references/function-structure.md +416 -0
  42. package/all/copy-overwrite/.claude/skills/coding-philosophy/references/immutable-patterns.md +316 -0
  43. package/all/copy-overwrite/.claude/skills/prompt-complexity-scorer/SKILL.md +118 -0
  44. package/all/copy-overwrite/.claude/skills/skill-creator/LICENSE.txt +202 -0
  45. package/all/copy-overwrite/.claude/skills/skill-creator/SKILL.md +210 -0
  46. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-312.pyc +0 -0
  47. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
  48. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  49. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/quick_validate.py +65 -0
  50. package/all/copy-overwrite/CLAUDE.md +77 -0
  51. package/all/copy-overwrite/HUMAN.md +17 -0
  52. package/all/copy-overwrite/specs/.keep +0 -0
  53. package/all/create-only/PROJECT_RULES.md +0 -0
  54. package/cdk/merge/package.json +20 -0
  55. package/dist/cli/index.d.ts +7 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +107 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/prompts.d.ts +45 -0
  60. package/dist/cli/prompts.d.ts.map +1 -0
  61. package/dist/cli/prompts.js +58 -0
  62. package/dist/cli/prompts.js.map +1 -0
  63. package/dist/core/config.d.ts +73 -0
  64. package/dist/core/config.d.ts.map +1 -0
  65. package/dist/core/config.js +36 -0
  66. package/dist/core/config.js.map +1 -0
  67. package/dist/core/index.d.ts +4 -0
  68. package/dist/core/index.d.ts.map +1 -0
  69. package/dist/core/index.js +4 -0
  70. package/dist/core/index.js.map +1 -0
  71. package/dist/core/lisa.d.ts +81 -0
  72. package/dist/core/lisa.d.ts.map +1 -0
  73. package/dist/core/lisa.js +459 -0
  74. package/dist/core/lisa.js.map +1 -0
  75. package/dist/core/manifest.d.ts +58 -0
  76. package/dist/core/manifest.d.ts.map +1 -0
  77. package/dist/core/manifest.js +104 -0
  78. package/dist/core/manifest.js.map +1 -0
  79. package/dist/detection/detector.interface.d.ts +15 -0
  80. package/dist/detection/detector.interface.d.ts.map +1 -0
  81. package/dist/detection/detector.interface.js +2 -0
  82. package/dist/detection/detector.interface.js.map +1 -0
  83. package/dist/detection/detectors/cdk.d.ts +10 -0
  84. package/dist/detection/detectors/cdk.d.ts.map +1 -0
  85. package/dist/detection/detectors/cdk.js +34 -0
  86. package/dist/detection/detectors/cdk.js.map +1 -0
  87. package/dist/detection/detectors/expo.d.ts +10 -0
  88. package/dist/detection/detectors/expo.d.ts.map +1 -0
  89. package/dist/detection/detectors/expo.js +30 -0
  90. package/dist/detection/detectors/expo.js.map +1 -0
  91. package/dist/detection/detectors/nestjs.d.ts +10 -0
  92. package/dist/detection/detectors/nestjs.d.ts.map +1 -0
  93. package/dist/detection/detectors/nestjs.js +34 -0
  94. package/dist/detection/detectors/nestjs.js.map +1 -0
  95. package/dist/detection/detectors/npm-package.d.ts +13 -0
  96. package/dist/detection/detectors/npm-package.d.ts.map +1 -0
  97. package/dist/detection/detectors/npm-package.js +30 -0
  98. package/dist/detection/detectors/npm-package.js.map +1 -0
  99. package/dist/detection/detectors/typescript.d.ts +10 -0
  100. package/dist/detection/detectors/typescript.d.ts.map +1 -0
  101. package/dist/detection/detectors/typescript.js +25 -0
  102. package/dist/detection/detectors/typescript.js.map +1 -0
  103. package/dist/detection/index.d.ts +24 -0
  104. package/dist/detection/index.d.ts.map +1 -0
  105. package/dist/detection/index.js +57 -0
  106. package/dist/detection/index.js.map +1 -0
  107. package/dist/errors/index.d.ts +69 -0
  108. package/dist/errors/index.d.ts.map +1 -0
  109. package/dist/errors/index.js +110 -0
  110. package/dist/errors/index.js.map +1 -0
  111. package/dist/index.d.ts +3 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +8 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/logging/console-logger.d.ts +12 -0
  116. package/dist/logging/console-logger.d.ts.map +1 -0
  117. package/dist/logging/console-logger.js +22 -0
  118. package/dist/logging/console-logger.js.map +1 -0
  119. package/dist/logging/index.d.ts +4 -0
  120. package/dist/logging/index.d.ts.map +1 -0
  121. package/dist/logging/index.js +3 -0
  122. package/dist/logging/index.js.map +1 -0
  123. package/dist/logging/logger.interface.d.ts +20 -0
  124. package/dist/logging/logger.interface.d.ts.map +1 -0
  125. package/dist/logging/logger.interface.js +2 -0
  126. package/dist/logging/logger.interface.js.map +1 -0
  127. package/dist/logging/silent-logger.d.ts +12 -0
  128. package/dist/logging/silent-logger.d.ts.map +1 -0
  129. package/dist/logging/silent-logger.js +21 -0
  130. package/dist/logging/silent-logger.js.map +1 -0
  131. package/dist/strategies/copy-contents.d.ts +14 -0
  132. package/dist/strategies/copy-contents.d.ts.map +1 -0
  133. package/dist/strategies/copy-contents.js +69 -0
  134. package/dist/strategies/copy-contents.js.map +1 -0
  135. package/dist/strategies/copy-overwrite.d.ts +14 -0
  136. package/dist/strategies/copy-overwrite.d.ts.map +1 -0
  137. package/dist/strategies/copy-overwrite.js +47 -0
  138. package/dist/strategies/copy-overwrite.js.map +1 -0
  139. package/dist/strategies/create-only.d.ts +13 -0
  140. package/dist/strategies/create-only.d.ts.map +1 -0
  141. package/dist/strategies/create-only.js +30 -0
  142. package/dist/strategies/create-only.js.map +1 -0
  143. package/dist/strategies/index.d.ts +31 -0
  144. package/dist/strategies/index.d.ts.map +1 -0
  145. package/dist/strategies/index.js +52 -0
  146. package/dist/strategies/index.js.map +1 -0
  147. package/dist/strategies/merge.d.ts +13 -0
  148. package/dist/strategies/merge.d.ts.map +1 -0
  149. package/dist/strategies/merge.js +60 -0
  150. package/dist/strategies/merge.js.map +1 -0
  151. package/dist/strategies/strategy.interface.d.ts +31 -0
  152. package/dist/strategies/strategy.interface.d.ts.map +1 -0
  153. package/dist/strategies/strategy.interface.js +2 -0
  154. package/dist/strategies/strategy.interface.js.map +1 -0
  155. package/dist/transaction/backup.d.ts +38 -0
  156. package/dist/transaction/backup.d.ts.map +1 -0
  157. package/dist/transaction/backup.js +97 -0
  158. package/dist/transaction/backup.js.map +1 -0
  159. package/dist/transaction/index.d.ts +4 -0
  160. package/dist/transaction/index.d.ts.map +1 -0
  161. package/dist/transaction/index.js +3 -0
  162. package/dist/transaction/index.js.map +1 -0
  163. package/dist/transaction/transaction.d.ts +34 -0
  164. package/dist/transaction/transaction.d.ts.map +1 -0
  165. package/dist/transaction/transaction.js +68 -0
  166. package/dist/transaction/transaction.js.map +1 -0
  167. package/dist/utils/file-operations.d.ts +29 -0
  168. package/dist/utils/file-operations.d.ts.map +1 -0
  169. package/dist/utils/file-operations.js +84 -0
  170. package/dist/utils/file-operations.js.map +1 -0
  171. package/dist/utils/index.d.ts +4 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +4 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/json-utils.d.ts +22 -0
  176. package/dist/utils/json-utils.d.ts.map +1 -0
  177. package/dist/utils/json-utils.js +57 -0
  178. package/dist/utils/json-utils.js.map +1 -0
  179. package/dist/utils/path-utils.d.ts +21 -0
  180. package/dist/utils/path-utils.d.ts.map +1 -0
  181. package/dist/utils/path-utils.js +35 -0
  182. package/dist/utils/path-utils.js.map +1 -0
  183. package/eslint-plugin-code-organization/README.md +149 -0
  184. package/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +468 -0
  185. package/eslint-plugin-code-organization/index.js +23 -0
  186. package/eslint-plugin-code-organization/package.json +10 -0
  187. package/eslint-plugin-code-organization/rules/enforce-statement-order.js +157 -0
  188. package/expo/copy-overwrite/.claude/skills/apollo-client/SKILL.md +238 -0
  189. package/expo/copy-overwrite/.claude/skills/apollo-client/references/mutation-patterns.md +360 -0
  190. package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/SKILL.md +360 -0
  191. package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
  192. package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
  193. package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
  194. package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +327 -0
  195. package/expo/copy-overwrite/.claude/skills/container-view-pattern/SKILL.md +299 -0
  196. package/expo/copy-overwrite/.claude/skills/container-view-pattern/references/examples.md +749 -0
  197. package/expo/copy-overwrite/.claude/skills/container-view-pattern/references/patterns.md +318 -0
  198. package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/create_component.py +198 -0
  199. package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/validate_component.py +207 -0
  200. package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/SKILL.md +268 -0
  201. package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/common-issues.md +619 -0
  202. package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
  203. package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/platform-api.md +276 -0
  204. package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +414 -0
  205. package/expo/copy-overwrite/.claude/skills/directory-structure/SKILL.md +202 -0
  206. package/expo/copy-overwrite/.claude/skills/directory-structure/scripts/validate_structure.py +443 -0
  207. package/expo/copy-overwrite/.claude/skills/expo-env-config/SKILL.md +309 -0
  208. package/expo/copy-overwrite/.claude/skills/expo-env-config/references/validation-patterns.md +417 -0
  209. package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/SKILL.md +431 -0
  210. package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/references/official-docs.md +290 -0
  211. package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/scripts/generate-route.py +169 -0
  212. package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/SKILL.md +411 -0
  213. package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/color-tokens.md +343 -0
  214. package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/component-mapping.md +307 -0
  215. package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
  216. package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/scripts/validate_styling.py +354 -0
  217. package/expo/copy-overwrite/.claude/skills/local-state/SKILL.md +362 -0
  218. package/expo/copy-overwrite/.claude/skills/local-state/references/async-storage.md +505 -0
  219. package/expo/copy-overwrite/.claude/skills/local-state/references/persistence-patterns.md +711 -0
  220. package/expo/copy-overwrite/.claude/skills/local-state/references/reactive-variables.md +446 -0
  221. package/expo/copy-overwrite/.claude/skills/playwright-selectors/SKILL.md +223 -0
  222. package/expo/copy-overwrite/.claude/skills/testing-library/SKILL.md +319 -0
  223. package/expo/copy-overwrite/.claude/skills/testing-library/references/async-patterns.md +420 -0
  224. package/expo/copy-overwrite/.claude/skills/testing-library/references/expo-router-testing.md +556 -0
  225. package/expo/copy-overwrite/.claude/skills/testing-library/references/mocking-patterns.md +590 -0
  226. package/expo/copy-overwrite/.claude/skills/testing-library/references/query-priority.md +291 -0
  227. package/expo/copy-overwrite/.easignore.extra +2 -0
  228. package/expo/copy-overwrite/.mcp.json +33 -0
  229. package/expo/copy-overwrite/eslint-plugin-component-structure/README.md +234 -0
  230. package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/plugin-index.test.js +84 -0
  231. package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/require-memo-in-view.test.js +196 -0
  232. package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/single-component-per-file.test.js +289 -0
  233. package/expo/copy-overwrite/eslint-plugin-component-structure/index.js +32 -0
  234. package/expo/copy-overwrite/eslint-plugin-component-structure/package.json +10 -0
  235. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/enforce-component-structure.js +230 -0
  236. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/no-return-in-view.js +91 -0
  237. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/require-memo-in-view.js +178 -0
  238. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/single-component-per-file.js +238 -0
  239. package/expo/copy-overwrite/eslint-plugin-ui-standards/README.md +260 -0
  240. package/expo/copy-overwrite/eslint-plugin-ui-standards/index.js +29 -0
  241. package/expo/copy-overwrite/eslint-plugin-ui-standards/package.json +10 -0
  242. package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-classname-outside-ui.js +51 -0
  243. package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-direct-rn-imports.js +55 -0
  244. package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-inline-styles.js +73 -0
  245. package/expo/copy-overwrite/eslint.config.mjs +560 -0
  246. package/expo/copy-overwrite/lighthouserc.js +194 -0
  247. package/expo/create-only/lighthouserc-config.json +28 -0
  248. package/expo/merge/package.json +132 -0
  249. package/lisa.sh +35 -0
  250. package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/SKILL.md +176 -0
  251. package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/advanced-features.md +527 -0
  252. package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/project-patterns.md +483 -0
  253. package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/quick-start.md +257 -0
  254. package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
  255. package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/types-scalars.md +513 -0
  256. package/nestjs/copy-overwrite/.claude/skills/nestjs-rules/SKILL.md +536 -0
  257. package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/SKILL.md +275 -0
  258. package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
  259. package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/entity-patterns.md +450 -0
  260. package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/observability-patterns.md +536 -0
  261. package/nestjs/merge/package.json +75 -0
  262. package/package.json +124 -0
  263. package/typescript/copy-contents/.husky/commit-msg +91 -0
  264. package/typescript/copy-contents/.husky/pre-commit +96 -0
  265. package/typescript/copy-contents/.husky/pre-push +211 -0
  266. package/typescript/copy-overwrite/.claude/hooks/format-on-edit.sh +74 -0
  267. package/typescript/copy-overwrite/.claude/hooks/install_pkgs.sh +59 -0
  268. package/typescript/copy-overwrite/.claude/hooks/lint-on-edit.sh +103 -0
  269. package/typescript/copy-overwrite/.claude/skills/jsdoc-best-practices/SKILL.md +388 -0
  270. package/typescript/copy-overwrite/.github/README.md +455 -0
  271. package/typescript/copy-overwrite/.github/dependabot.yml +40 -0
  272. package/typescript/copy-overwrite/.github/k6/BROWSER_TESTING_NOTE.md +129 -0
  273. package/typescript/copy-overwrite/.github/k6/INTEGRATION_GUIDE.md +354 -0
  274. package/typescript/copy-overwrite/.github/k6/README.md +386 -0
  275. package/typescript/copy-overwrite/.github/k6/SCENARIO_SELECTION_GUIDE.md +264 -0
  276. package/typescript/copy-overwrite/.github/k6/examples/customer-deploy-integration.yml +115 -0
  277. package/typescript/copy-overwrite/.github/k6/examples/data-driven-test.js +268 -0
  278. package/typescript/copy-overwrite/.github/k6/scenarios/load.js +142 -0
  279. package/typescript/copy-overwrite/.github/k6/scenarios/load.json +27 -0
  280. package/typescript/copy-overwrite/.github/k6/scenarios/smoke.js +26 -0
  281. package/typescript/copy-overwrite/.github/k6/scenarios/smoke.json +20 -0
  282. package/typescript/copy-overwrite/.github/k6/scenarios/soak.js +244 -0
  283. package/typescript/copy-overwrite/.github/k6/scenarios/soak.json +29 -0
  284. package/typescript/copy-overwrite/.github/k6/scenarios/spike.js +180 -0
  285. package/typescript/copy-overwrite/.github/k6/scenarios/spike.json +32 -0
  286. package/typescript/copy-overwrite/.github/k6/scenarios/stress.js +206 -0
  287. package/typescript/copy-overwrite/.github/k6/scenarios/stress.json +38 -0
  288. package/typescript/copy-overwrite/.github/k6/scripts/api-test.js +452 -0
  289. package/typescript/copy-overwrite/.github/k6/scripts/default-test.js +185 -0
  290. package/typescript/copy-overwrite/.github/k6/thresholds/normal.json +30 -0
  291. package/typescript/copy-overwrite/.github/k6/thresholds/relaxed.json +21 -0
  292. package/typescript/copy-overwrite/.github/k6/thresholds/strict.json +29 -0
  293. package/typescript/copy-overwrite/.github/workflows/build.yml +72 -0
  294. package/typescript/copy-overwrite/.github/workflows/ci.yml +49 -0
  295. package/typescript/copy-overwrite/.github/workflows/claude.yml +51 -0
  296. package/typescript/copy-overwrite/.github/workflows/create-github-issue-on-failure.yml +113 -0
  297. package/typescript/copy-overwrite/.github/workflows/create-jira-issue-on-failure.yml +195 -0
  298. package/typescript/copy-overwrite/.github/workflows/create-sentry-issue-on-failure.yml +267 -0
  299. package/typescript/copy-overwrite/.github/workflows/deploy.yml +228 -0
  300. package/typescript/copy-overwrite/.github/workflows/k6-load-test-README.md +230 -0
  301. package/typescript/copy-overwrite/.github/workflows/lighthouse.yml +68 -0
  302. package/typescript/copy-overwrite/.github/workflows/load-test.yml +282 -0
  303. package/typescript/copy-overwrite/.github/workflows/quality.yml +1737 -0
  304. package/typescript/copy-overwrite/.github/workflows/release.yml +1599 -0
  305. package/typescript/copy-overwrite/.gitleaksignore +28 -0
  306. package/typescript/copy-overwrite/.nvmrc +1 -0
  307. package/typescript/copy-overwrite/.prettierignore +23 -0
  308. package/typescript/copy-overwrite/.prettierrc.json +22 -0
  309. package/typescript/copy-overwrite/.versionrc +42 -0
  310. package/typescript/copy-overwrite/.yamllint +20 -0
  311. package/typescript/copy-overwrite/commitlint.config.js +11 -0
  312. package/typescript/copy-overwrite/eslint-plugin-code-organization/README.md +149 -0
  313. package/typescript/copy-overwrite/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +468 -0
  314. package/typescript/copy-overwrite/eslint-plugin-code-organization/index.js +23 -0
  315. package/typescript/copy-overwrite/eslint-plugin-code-organization/package.json +10 -0
  316. package/typescript/copy-overwrite/eslint-plugin-code-organization/rules/enforce-statement-order.js +157 -0
  317. package/typescript/copy-overwrite/eslint.config.mjs +390 -0
  318. package/typescript/copy-overwrite/eslint.ignore.config.json +57 -0
  319. package/typescript/copy-overwrite/eslint.thresholds.config.json +5 -0
  320. package/typescript/github-rulesets/base.json +106 -0
  321. package/typescript/merge/.claude/settings.json +28 -0
  322. package/typescript/merge/package.json +71 -0
@@ -0,0 +1,455 @@
1
+ # GitHub Actions Configuration
2
+
3
+ This directory contains the CI/CD workflows and automation for the project. This document explains how to configure and use the GitHub Actions workflows.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Overview](#overview)
8
+ - [Quick Start](#quick-start)
9
+ - [Workflows](#workflows)
10
+ - [Secrets Configuration](#secrets-configuration)
11
+ - [Repository Variables](#repository-variables)
12
+ - [External Service Setup](#external-service-setup)
13
+ - [Customization](#customization)
14
+
15
+ ## Overview
16
+
17
+ The CI/CD system provides:
18
+
19
+ - **Quality Gates**: Linting, type checking, formatting, and testing
20
+ - **Security Scanning**: Vulnerability detection, secret scanning, license compliance
21
+ - **Release Management**: Automated versioning, changelogs, and GitHub releases
22
+ - **Mobile Builds**: Expo EAS builds for iOS and Android
23
+ - **OTA Updates**: Expo EAS Update deployments
24
+ - **Performance Testing**: Lighthouse CI for web, k6 load testing
25
+ - **AI Integration**: Claude Code for automated code review and assistance
26
+
27
+ ## Quick Start
28
+
29
+ ### Minimum Configuration
30
+
31
+ To get started with basic CI, add these secrets to your repository:
32
+
33
+ ```bash
34
+ # No secrets required for basic quality checks (lint, typecheck, build, format)
35
+ ```
36
+
37
+ ### Recommended Configuration
38
+
39
+ For full functionality, configure the following secrets:
40
+
41
+ | Secret | Purpose | Required For |
42
+ |--------|---------|--------------|
43
+ | `EXPO_TOKEN` | EAS builds and updates | Mobile deployment |
44
+ | `SENTRY_AUTH_TOKEN` | Error tracking | Release monitoring |
45
+ | `SONAR_TOKEN` | Code quality analysis | Security scanning |
46
+ | `SNYK_TOKEN` | Vulnerability scanning | Security scanning |
47
+
48
+ ## Workflows
49
+
50
+ ### CI Quality Checks (`ci.yml`)
51
+
52
+ **Triggers**: Pull requests, manual dispatch
53
+
54
+ Runs on every pull request to validate code quality:
55
+
56
+ - Lint (ESLint)
57
+ - Type checking (TypeScript)
58
+ - Formatting (Prettier)
59
+ - Build verification
60
+ - Security scans (when configured)
61
+ - Lighthouse CI (web performance)
62
+
63
+ **Configuration**:
64
+ ```yaml
65
+ # In ci.yml, modify these inputs:
66
+ node_version: '22.21.1'
67
+ package_manager: 'bun'
68
+ skip_jobs: 'test,test:integration,test:e2e' # Comma-separated list
69
+ ```
70
+
71
+ ### Release and Deploy (`deploy.yml`)
72
+
73
+ **Triggers**: Push to `main`, `staging`, or `dev` branches; manual dispatch
74
+
75
+ Handles the complete release lifecycle:
76
+
77
+ 1. Creates a new release with version bump
78
+ 2. Generates changelog from commits
79
+ 3. Triggers EAS build (if `app.config.ts` changed)
80
+ 4. Publishes OTA update via EAS Update
81
+ 5. Creates Sentry release (if configured)
82
+
83
+ **Environment Mapping**:
84
+ | Branch | Environment | EAS Channel |
85
+ |--------|-------------|-------------|
86
+ | `dev` | development | dev |
87
+ | `staging` | staging | staging |
88
+ | `main` | production | production |
89
+
90
+ ### EAS Build (`build.yml`)
91
+
92
+ **Triggers**: Changes to `app.config.ts`, manual dispatch, workflow call
93
+
94
+ Builds native app binaries via Expo Application Services:
95
+
96
+ - **dev**: Development preview builds
97
+ - **staging**: Staging builds with auto-submit to TestFlight/Play Console
98
+ - **production**: Production builds with auto-submit
99
+
100
+ ### Quality Checks (`quality.yml`)
101
+
102
+ **Type**: Reusable workflow
103
+
104
+ Comprehensive quality validation with 20+ configurable jobs. Called by other workflows.
105
+
106
+ **Skippable Jobs**:
107
+ ```
108
+ lint, typecheck, test, test:unit, test:integration, test:e2e,
109
+ maestro_e2e, playwright_e2e, format, build, npm_security_scan,
110
+ sonarcloud, snyk, secret_scanning, license_compliance
111
+ ```
112
+
113
+ ### Release (`release.yml`)
114
+
115
+ **Type**: Reusable workflow
116
+
117
+ Enterprise-grade release management:
118
+
119
+ - Version strategies: `standard-version`, `semantic`, `calendar`, `custom`
120
+ - Changelog generation
121
+ - GPG signing (optional)
122
+ - SBOM generation
123
+ - Sentry release creation
124
+ - Jira release creation
125
+ - Compliance validation (SOC2, ISO27001, HIPAA, PCI-DSS)
126
+
127
+ **Blackout Periods** (configurable):
128
+ - Production: No weekends, no late nights (10 PM - 6 AM)
129
+ - Holiday blackouts: Dec 24 - Jan 2, Jul 3-5, Nov 27-29
130
+
131
+ ### Lighthouse CI (`lighthouse.yml`)
132
+
133
+ **Type**: Reusable workflow
134
+
135
+ Web performance budget validation using Google Lighthouse.
136
+
137
+ ### Claude Code (`claude.yml`)
138
+
139
+ **Triggers**: Comments/reviews mentioning `@claude`
140
+
141
+ AI-powered code assistance that can:
142
+ - Review code changes
143
+ - Suggest improvements
144
+ - Run tests and builds
145
+ - Answer questions about the codebase
146
+
147
+ ### Load Testing (`load-test.yml`)
148
+
149
+ **Type**: Reusable workflow
150
+
151
+ Performance load testing using k6:
152
+
153
+ - Scenarios: `smoke`, `load`, `stress`, `spike`, `soak`
154
+ - Configurable thresholds
155
+ - Result artifact uploads
156
+
157
+ ## Secrets Configuration
158
+
159
+ ### How to Add Secrets
160
+
161
+ 1. Go to **Settings** > **Secrets and variables** > **Actions**
162
+ 2. Click **New repository secret**
163
+ 3. Enter the secret name and value
164
+
165
+ Or use the GitHub CLI:
166
+ ```bash
167
+ gh secret set SECRET_NAME --body "secret-value"
168
+ ```
169
+
170
+ For bulk setup, copy `.github/workflows/.env.example` and run:
171
+ ```bash
172
+ gh secret set --env-file .env
173
+ ```
174
+
175
+ ### Core Secrets
176
+
177
+ #### EXPO_TOKEN
178
+ **Purpose**: Authenticate with Expo/EAS for builds and updates
179
+
180
+ **How to get it**:
181
+ 1. Go to [expo.dev/settings/access-tokens](https://expo.dev/settings/access-tokens)
182
+ 2. Click **Create Token**
183
+ 3. Name it (e.g., "GitHub Actions")
184
+ 4. Copy the token (starts with `expo_`)
185
+
186
+ **Required for**: EAS Build, EAS Update
187
+
188
+ ---
189
+
190
+ #### SENTRY_AUTH_TOKEN
191
+ **Purpose**: Create releases and upload sourcemaps to Sentry
192
+
193
+ **How to get it**:
194
+ 1. Go to [sentry.io/settings/account/api/auth-tokens/](https://sentry.io/settings/account/api/auth-tokens/)
195
+ 2. Click **Create New Token**
196
+ 3. Select scopes: `project:releases`, `project:write`
197
+ 4. Copy the token
198
+
199
+ **Required for**: Error tracking, release monitoring
200
+
201
+ ---
202
+
203
+ #### SONAR_TOKEN
204
+ **Purpose**: Authenticate with SonarCloud for code quality analysis
205
+
206
+ **How to get it**:
207
+ 1. Go to [sonarcloud.io/account/security](https://sonarcloud.io/account/security)
208
+ 2. Click **Generate Tokens**
209
+ 3. Name your token and generate
210
+ 4. Copy the token
211
+
212
+ **Required for**: Static code analysis (SAST)
213
+
214
+ **Additional Setup**:
215
+ Create `sonar-project.properties` in your repo root:
216
+ ```properties
217
+ sonar.projectKey=your-org_your-project
218
+ sonar.organization=your-org
219
+ ```
220
+
221
+ ---
222
+
223
+ #### SNYK_TOKEN
224
+ **Purpose**: Scan dependencies for known vulnerabilities
225
+
226
+ **How to get it**:
227
+ 1. Go to [app.snyk.io/account](https://app.snyk.io/account)
228
+ 2. Find **Auth Token** section
229
+ 3. Click **click to show** and copy
230
+
231
+ **Required for**: Dependency vulnerability scanning
232
+
233
+ ---
234
+
235
+ #### GITGUARDIAN_API_KEY
236
+ **Purpose**: Detect hardcoded secrets in code
237
+
238
+ **How to get it**:
239
+ 1. Go to [dashboard.gitguardian.com/api/personal-access-tokens](https://dashboard.gitguardian.com/api/personal-access-tokens)
240
+ 2. Click **Create new token**
241
+ 3. Select scope: `scan`
242
+ 4. Copy the token
243
+
244
+ **Required for**: Secret detection
245
+
246
+ ---
247
+
248
+ #### FOSSA_API_KEY
249
+ **Purpose**: License compliance checking for dependencies
250
+
251
+ **How to get it**:
252
+ 1. Go to [app.fossa.com/account/settings/integrations/api_tokens](https://app.fossa.com/account/settings/integrations/api_tokens)
253
+ 2. Click **Add API Token**
254
+ 3. Copy the token
255
+
256
+ **Required for**: License compliance
257
+
258
+ ---
259
+
260
+ #### CLAUDE_CODE_OAUTH_TOKEN
261
+ **Purpose**: Enable Claude AI code assistance in issues and PRs
262
+
263
+ **How to get it**:
264
+ 1. Visit [claude.ai/code](https://claude.ai/code) or your Anthropic Console
265
+ 2. Generate an OAuth token for GitHub integration
266
+ 3. Copy the token
267
+
268
+ **Required for**: `@claude` mentions in issues/PRs
269
+
270
+ ---
271
+
272
+ #### K6_CLOUD_TOKEN
273
+ **Purpose**: Run load tests on k6 Cloud infrastructure
274
+
275
+ **How to get it**:
276
+ 1. Go to [app.k6.io/account/api-token](https://app.k6.io/account/api-token)
277
+ 2. Copy your API token
278
+
279
+ **Required for**: Cloud-based load testing
280
+
281
+ ---
282
+
283
+ ### Release Signing Secrets (Optional)
284
+
285
+ For GPG-signed releases:
286
+
287
+ | Secret | Description |
288
+ |--------|-------------|
289
+ | `RELEASE_SIGNING_KEY` | Base64-encoded GPG private key |
290
+ | `SIGNING_KEY_ID` | GPG key ID |
291
+ | `SIGNING_KEY_PASSPHRASE` | GPG key passphrase |
292
+ | `DEPLOY_KEY` | SSH key for pushing to protected branches |
293
+
294
+ To generate:
295
+ ```bash
296
+ # Generate GPG key
297
+ gpg --full-generate-key
298
+
299
+ # Export and base64 encode
300
+ gpg --export-secret-keys YOUR_KEY_ID | base64 > signing-key.txt
301
+ ```
302
+
303
+ ---
304
+
305
+ ### Jira Integration Secrets (Optional)
306
+
307
+ | Secret | Description |
308
+ |--------|-------------|
309
+ | `JIRA_API_TOKEN` | API token from Atlassian |
310
+ | `JIRA_BASE_URL` | Your Jira instance URL (e.g., `https://company.atlassian.net`) |
311
+ | `JIRA_USER_EMAIL` | Email associated with the API token |
312
+ | `JIRA_AUTOMATION_WEBHOOK` | Webhook URL for Jira automation |
313
+
314
+ **How to get JIRA_API_TOKEN**:
315
+ 1. Go to [id.atlassian.com/manage-profile/security/api-tokens](https://id.atlassian.com/manage-profile/security/api-tokens)
316
+ 2. Click **Create API token**
317
+ 3. Copy the token
318
+
319
+ ## Repository Variables
320
+
321
+ Variables are non-sensitive configuration values. Set them in **Settings** > **Secrets and variables** > **Actions** > **Variables**.
322
+
323
+ | Variable | Description | Example |
324
+ |----------|-------------|---------|
325
+ | `SENTRY_ORG` | Sentry organization slug | `my-company` |
326
+ | `SENTRY_PROJECT` | Sentry project slug | `frontend-app` |
327
+
328
+ ## External Service Setup
329
+
330
+ ### SonarCloud
331
+
332
+ 1. Sign in at [sonarcloud.io](https://sonarcloud.io)
333
+ 2. Import your GitHub repository
334
+ 3. Create `sonar-project.properties`:
335
+ ```properties
336
+ sonar.projectKey=org_project
337
+ sonar.organization=org
338
+ sonar.sources=src
339
+ sonar.exclusions=**/node_modules/**,**/*.test.*
340
+ ```
341
+
342
+ ### Expo/EAS
343
+
344
+ 1. Install EAS CLI: `npm install -g eas-cli`
345
+ 2. Login: `eas login`
346
+ 3. Configure project: `eas init`
347
+ 4. Create `eas.json` with build profiles
348
+
349
+ ### Sentry
350
+
351
+ 1. Create a project at [sentry.io](https://sentry.io)
352
+ 2. Note your organization and project slugs
353
+ 3. Configure Sentry in your app (see Sentry React Native docs)
354
+
355
+ ### Maestro Cloud (Mobile E2E)
356
+
357
+ 1. Sign up at [cloud.mobile.dev](https://cloud.mobile.dev)
358
+ 2. Create a project and note the project ID
359
+ 3. Generate an API key
360
+ 4. Add `MAESTRO_API_KEY` secret
361
+ 5. Pass `maestro_project_id` input to quality workflow
362
+
363
+ ## Customization
364
+
365
+ ### Skipping Jobs
366
+
367
+ Add to your workflow call:
368
+ ```yaml
369
+ uses: ./.github/workflows/quality.yml
370
+ with:
371
+ skip_jobs: 'test:e2e,maestro_e2e,playwright_e2e'
372
+ ```
373
+
374
+ ### Compliance Frameworks
375
+
376
+ Enable compliance validation:
377
+ ```yaml
378
+ uses: ./.github/workflows/quality.yml
379
+ with:
380
+ compliance_framework: 'soc2' # or iso27001, hipaa, pci-dss
381
+ require_approval: true
382
+ approval_environment: 'production'
383
+ ```
384
+
385
+ **Note**: Create the environment in **Settings** > **Environments** first.
386
+
387
+ ### Custom Node Version
388
+
389
+ ```yaml
390
+ uses: ./.github/workflows/quality.yml
391
+ with:
392
+ node_version: '22.21.1'
393
+ package_manager: 'bun' # or npm, yarn
394
+ ```
395
+
396
+ ### Load Test Scenarios
397
+
398
+ ```yaml
399
+ uses: ./.github/workflows/load-test.yml
400
+ with:
401
+ test_scenario: 'stress' # smoke, load, stress, spike, soak
402
+ base_url: 'https://api.example.com'
403
+ virtual_users: 100
404
+ test_duration: '10m'
405
+ ```
406
+
407
+ ## Directory Structure
408
+
409
+ ```
410
+ .github/
411
+ ├── workflows/
412
+ │ ├── ci.yml # PR quality checks
413
+ │ ├── deploy.yml # Release and deploy
414
+ │ ├── build.yml # EAS builds
415
+ │ ├── quality.yml # Reusable quality checks
416
+ │ ├── release.yml # Reusable release workflow
417
+ │ ├── lighthouse.yml # Web performance
418
+ │ ├── load-test.yml # k6 load testing
419
+ │ ├── claude.yml # AI assistance
420
+ │ ├── create-sentry-issue-on-failure.yml # Error tracking
421
+ │ ├── create-github-issue-on-failure.yml # Issue creation
422
+ │ ├── create-jira-issue-on-failure.yml # Jira integration
423
+ │ └── .env.example # Secrets template
424
+ ├── k6/
425
+ │ ├── scripts/ # Test scripts
426
+ │ ├── scenarios/ # Test configurations
427
+ │ ├── thresholds/ # Performance thresholds
428
+ │ └── README.md # K6 documentation
429
+ └── dependabot.yml # Dependency updates
430
+ ```
431
+
432
+ ## Troubleshooting
433
+
434
+ ### "Secret not found" errors
435
+ Ensure the secret is added to the repository, not just your local environment.
436
+
437
+ ### SonarCloud scan fails
438
+ Verify `sonar-project.properties` exists and `SONAR_TOKEN` is set.
439
+
440
+ ### EAS builds fail
441
+ Check `EXPO_TOKEN` is valid and has necessary permissions.
442
+
443
+ ### Deployment fails on protected branches
444
+ Add `DEPLOY_KEY` (SSH deploy key) for pushing version bumps.
445
+
446
+ ### Claude doesn't respond
447
+ Ensure `CLAUDE_CODE_OAUTH_TOKEN` is set and the comment includes `@claude`.
448
+
449
+ ## Related Documentation
450
+
451
+ - [K6 Load Testing Guide](.github/k6/README.md)
452
+ - [K6 Scenario Selection Guide](.github/k6/SCENARIO_SELECTION_GUIDE.md)
453
+ - [Expo EAS Documentation](https://docs.expo.dev/eas/)
454
+ - [SonarCloud Documentation](https://docs.sonarcloud.io/)
455
+ - [Sentry React Native](https://docs.sentry.io/platforms/react-native/)
@@ -0,0 +1,40 @@
1
+ version: 2
2
+ updates:
3
+ # JavaScript/Node.js dependencies
4
+ - package-ecosystem: npm
5
+ directory: /
6
+ schedule:
7
+ interval: weekly
8
+ day: monday
9
+ target-branch: dev
10
+ open-pull-requests-limit: 10
11
+ groups:
12
+ production-dependencies:
13
+ dependency-type: production
14
+ update-types:
15
+ - minor
16
+ - patch
17
+ development-dependencies:
18
+ dependency-type: development
19
+ update-types:
20
+ - minor
21
+ - patch
22
+ labels:
23
+ - dependencies
24
+ commit-message:
25
+ prefix: 'chore(deps)'
26
+ prefix-development: 'chore(deps-dev)'
27
+
28
+ # GitHub Actions
29
+ - package-ecosystem: github-actions
30
+ directory: /
31
+ schedule:
32
+ interval: weekly
33
+ day: monday
34
+ target-branch: dev
35
+ open-pull-requests-limit: 5
36
+ labels:
37
+ - dependencies
38
+ - github-actions
39
+ commit-message:
40
+ prefix: 'ci(deps)'
@@ -0,0 +1,129 @@
1
+ # K6 Browser Testing - Future Enhancement
2
+
3
+ ## Overview
4
+ K6 browser testing was deferred in Phase 3 due to additional complexity and dependencies. This document outlines what would be needed to add browser testing support in the future.
5
+
6
+ ## Requirements for Browser Testing
7
+
8
+ ### 1. Additional Dependencies
9
+ - Chromium or Chrome browser installation
10
+ - k6 browser module (experimental)
11
+ - Additional GitHub Actions setup for headless browser
12
+
13
+ ### 2. Workflow Changes Needed
14
+ ```yaml
15
+ - name: Setup Chrome
16
+ uses: browser-actions/setup-chrome@latest
17
+
18
+ - name: Install k6 with browser support
19
+ run: |
20
+ # k6 browser requires different installation
21
+ xk6 build --with github.com/grafana/xk6-browser
22
+ ```
23
+
24
+ ### 3. Example Browser Test Structure
25
+ ```javascript
26
+ // .github/k6/scripts/browser-test.js
27
+ import { chromium } from 'k6/experimental/browser';
28
+ import { check, sleep } from 'k6';
29
+
30
+ export const options = {
31
+ scenarios: {
32
+ browser: {
33
+ executor: 'shared-iterations',
34
+ vus: 1,
35
+ iterations: 10,
36
+ options: {
37
+ browser: {
38
+ type: 'chromium',
39
+ },
40
+ },
41
+ },
42
+ },
43
+ thresholds: {
44
+ browser_web_vital_lcp: ['p(90) < 2500'],
45
+ browser_web_vital_fid: ['p(90) < 100'],
46
+ browser_web_vital_cls: ['p(90) < 0.1'],
47
+ },
48
+ };
49
+
50
+ export default async function () {
51
+ const browser = chromium.launch({
52
+ headless: true,
53
+ timeout: '60s',
54
+ });
55
+
56
+ const context = browser.newContext();
57
+ const page = context.newPage();
58
+
59
+ try {
60
+ // Navigate and measure
61
+ await page.goto(__ENV.K6_BASE_URL, { waitUntil: 'networkidle' });
62
+
63
+ // Capture Core Web Vitals
64
+ const metrics = await page.evaluate(() => ({
65
+ lcp: performance.getEntriesByType('largest-contentful-paint')[0]?.startTime,
66
+ fid: performance.getEntriesByType('first-input')[0]?.processingStart,
67
+ cls: performance.getEntriesByType('layout-shift')
68
+ .reduce((sum, entry) => sum + entry.value, 0),
69
+ }));
70
+
71
+ check(metrics, {
72
+ 'LCP under 2.5s': (m) => m.lcp < 2500,
73
+ 'FID under 100ms': (m) => !m.fid || m.fid < 100,
74
+ 'CLS under 0.1': (m) => m.cls < 0.1,
75
+ });
76
+
77
+ // User journey testing
78
+ await page.click('text=Login');
79
+ await page.fill('input[name="username"]', 'testuser');
80
+ await page.fill('input[name="password"]', 'testpass');
81
+ await page.click('button[type="submit"]');
82
+
83
+ // Wait for navigation
84
+ await page.waitForSelector('.dashboard', { timeout: 5000 });
85
+
86
+ } finally {
87
+ page.close();
88
+ browser.close();
89
+ }
90
+ }
91
+ ```
92
+
93
+ ## Benefits of Adding Browser Testing
94
+
95
+ 1. **Real User Experience**: Test actual page load and interaction performance
96
+ 2. **Core Web Vitals**: Measure Google's key metrics (LCP, FID, CLS)
97
+ 3. **JavaScript Performance**: Test client-side rendering and SPA performance
98
+ 4. **Visual Testing**: Capture screenshots and visual regressions
99
+ 5. **User Journey Testing**: Test complete workflows including JS interactions
100
+
101
+ ## Implementation Considerations
102
+
103
+ 1. **Resource Usage**: Browser tests use significantly more resources than HTTP tests
104
+ 2. **Execution Time**: Browser tests are slower than API tests
105
+ 3. **Parallelization**: Limited VUs due to browser overhead
106
+ 4. **Debugging**: More complex to debug in CI/CD environments
107
+
108
+ ## When to Add Browser Testing
109
+
110
+ Consider adding browser testing when:
111
+ - Frontend performance is critical
112
+ - You need to measure Core Web Vitals
113
+ - Testing SPAs or heavily JavaScript-dependent applications
114
+ - User experience metrics are KPIs
115
+ - Visual regression testing is needed
116
+
117
+ ## Alternative Approaches
118
+
119
+ If full browser testing is too heavy, consider:
120
+ 1. **Synthetic monitoring** - Use external services for browser testing
121
+ 2. **Lighthouse CI** - Automated Lighthouse tests in CI/CD
122
+ 3. **Puppeteer/Playwright** - Separate browser testing pipeline
123
+ 4. **WebPageTest API** - Integration with WebPageTest for detailed metrics
124
+
125
+ ## References
126
+
127
+ - [k6 Browser Documentation](https://k6.io/docs/using-k6-browser/)
128
+ - [k6 Browser Examples](https://github.com/grafana/k6-browser-examples)
129
+ - [Core Web Vitals](https://web.dev/vitals/)