@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,196 @@
1
+ /**
2
+ * Unit tests for the require-memo-in-view ESLint rule
3
+ *
4
+ * Tests that View components are properly wrapped with React.memo() and have displayName.
5
+ * Ensures components/ui/** directory is excluded from the rule.
6
+ * @module eslint-plugin-component-structure/tests
7
+ */
8
+
9
+ const { RuleTester } = require("eslint");
10
+
11
+ const rule = require("../rules/require-memo-in-view");
12
+
13
+ const FEATURE_EXAMPLE_COMPONENTS_PATH = "features/example/components";
14
+
15
+ const ruleTester = new RuleTester({
16
+ languageOptions: {
17
+ ecmaVersion: 2020,
18
+ sourceType: "module",
19
+ parserOptions: {
20
+ ecmaFeatures: {
21
+ jsx: true,
22
+ },
23
+ },
24
+ },
25
+ });
26
+
27
+ ruleTester.run("require-memo-in-view", rule, {
28
+ valid: [
29
+ {
30
+ code: `
31
+ import { memo } from "react";
32
+ import { View } from "react-native";
33
+
34
+ const MyView = () => <View />;
35
+
36
+ MyView.displayName = "MyView";
37
+
38
+ export default memo(MyView);
39
+ `,
40
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
41
+ },
42
+ {
43
+ code: `
44
+ import { memo } from "react";
45
+ import { Text } from "react-native";
46
+
47
+ const AnotherView = () => (
48
+ <Text>Hello</Text>
49
+ );
50
+
51
+ AnotherView.displayName = "AnotherView";
52
+
53
+ export default memo(AnotherView);
54
+ `,
55
+ filename: "components/AnotherView.tsx",
56
+ },
57
+ {
58
+ code: `
59
+ // This should be ignored - components/ui/** is excluded
60
+ import { View } from "react-native";
61
+
62
+ const UIComponent = () => <View />;
63
+
64
+ export default UIComponent;
65
+ `,
66
+ filename: "components/ui/Button/ButtonView.tsx",
67
+ },
68
+ {
69
+ code: `
70
+ // This should be ignored - components/custom/ui/** is excluded
71
+ import { View } from "react-native";
72
+
73
+ const CustomUIComponent = () => <View />;
74
+
75
+ export default CustomUIComponent;
76
+ `,
77
+ filename: "components/custom/ui/Input/InputView.tsx",
78
+ },
79
+ {
80
+ code: `
81
+ // Non-View file should be ignored
82
+ import { memo } from "react";
83
+
84
+ const MyContainer = () => null;
85
+
86
+ export default MyContainer;
87
+ `,
88
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyContainer.tsx`,
89
+ },
90
+ {
91
+ code: `
92
+ import React from "react";
93
+ import { View } from "react-native";
94
+
95
+ const MyView = () => <View />;
96
+
97
+ MyView.displayName = "MyView";
98
+
99
+ export default React.memo(MyView);
100
+ `,
101
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
102
+ },
103
+ ],
104
+ invalid: [
105
+ {
106
+ code: `
107
+ import { View } from "react-native";
108
+
109
+ const MyView = () => <View />;
110
+
111
+ MyView.displayName = "MyView";
112
+
113
+ export default MyView;
114
+ `,
115
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
116
+ errors: [
117
+ {
118
+ messageId: "missingMemo",
119
+ data: { componentName: "MyView" },
120
+ },
121
+ ],
122
+ },
123
+ {
124
+ code: `
125
+ import { memo } from "react";
126
+ import { View } from "react-native";
127
+
128
+ const MyView = () => <View />;
129
+
130
+ export default memo(MyView);
131
+ `,
132
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
133
+ errors: [
134
+ {
135
+ messageId: "missingDisplayName",
136
+ data: { componentName: "MyView" },
137
+ },
138
+ ],
139
+ },
140
+ {
141
+ code: `
142
+ import { View } from "react-native";
143
+
144
+ const MyView = () => <View />;
145
+
146
+ export default MyView;
147
+ `,
148
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
149
+ errors: [
150
+ {
151
+ messageId: "missingMemo",
152
+ data: { componentName: "MyView" },
153
+ },
154
+ {
155
+ messageId: "missingDisplayName",
156
+ data: { componentName: "MyView" },
157
+ },
158
+ ],
159
+ },
160
+ {
161
+ code: `
162
+ import React from "react";
163
+ import { View } from "react-native";
164
+
165
+ const MyView = () => <View />;
166
+
167
+ export default React.memo(MyView);
168
+ `,
169
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
170
+ errors: [
171
+ {
172
+ messageId: "missingDisplayName",
173
+ data: { componentName: "MyView" },
174
+ },
175
+ ],
176
+ },
177
+ {
178
+ code: `
179
+ import { View } from "react-native";
180
+
181
+ const TestView = () => <View />;
182
+
183
+ TestView.displayName = "TestView";
184
+
185
+ export default TestView;
186
+ `,
187
+ filename: "features/test/components/TestView.jsx",
188
+ errors: [
189
+ {
190
+ messageId: "missingMemo",
191
+ data: { componentName: "TestView" },
192
+ },
193
+ ],
194
+ },
195
+ ],
196
+ });
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Unit tests for the single-component-per-file ESLint rule
3
+ *
4
+ * Tests that View and Container files contain exactly one React component.
5
+ * Ensures components/ui/** and components/shared/** directories are excluded from the rule.
6
+ * @module eslint-plugin-component-structure/tests
7
+ */
8
+
9
+ const { RuleTester } = require("eslint");
10
+
11
+ const rule = require("../rules/single-component-per-file");
12
+
13
+ const FEATURE_EXAMPLE_COMPONENTS_PATH = "/features/example/components";
14
+ const SHARED_COMPONENTS_PATH = "/components/shared";
15
+ const UI_COMPONENTS_PATH = "/components/ui";
16
+
17
+ const ruleTester = new RuleTester({
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ sourceType: "module",
21
+ parserOptions: {
22
+ ecmaFeatures: {
23
+ jsx: true,
24
+ },
25
+ },
26
+ },
27
+ });
28
+
29
+ ruleTester.run("single-component-per-file", rule, {
30
+ valid: [
31
+ // 1. Single component - arrow function
32
+ {
33
+ code: `
34
+ const MyView = () => <div>Hello</div>;
35
+ MyView.displayName = "MyView";
36
+ export default MyView;
37
+ `,
38
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
39
+ },
40
+ // 2. Single component - memo wrapped
41
+ {
42
+ code: `
43
+ import { memo } from "react";
44
+ const MyView = memo(() => <div>Hello</div>);
45
+ MyView.displayName = "MyView";
46
+ export default MyView;
47
+ `,
48
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
49
+ },
50
+ // 3. Single component - React.memo wrapped
51
+ {
52
+ code: `
53
+ import React from "react";
54
+ const MyView = React.memo(() => <div>Hello</div>);
55
+ MyView.displayName = "MyView";
56
+ export default MyView;
57
+ `,
58
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
59
+ },
60
+ // 4. Single component - function declaration
61
+ {
62
+ code: `
63
+ function MyView() {
64
+ return <div>Hello</div>;
65
+ }
66
+ export default MyView;
67
+ `,
68
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
69
+ },
70
+ // 5. Single component - TypeScript React.FC (parser will handle TypeScript syntax)
71
+ {
72
+ code: `
73
+ const MyView: React.FC = () => <div>Hello</div>;
74
+ MyView.displayName = "MyView";
75
+ export default MyView;
76
+ `,
77
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
78
+ languageOptions: {
79
+ parser: require("@typescript-eslint/parser"),
80
+ },
81
+ },
82
+ // 6. Single component in Container file
83
+ {
84
+ code: `
85
+ const MyContainer = () => {
86
+ return <div>Hello</div>;
87
+ };
88
+ export default MyContainer;
89
+ `,
90
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyContainer.tsx`,
91
+ },
92
+ // 7. PascalCase function that doesn't return JSX (not a component)
93
+ {
94
+ code: `
95
+ const MyView = () => <div>Hello</div>;
96
+ const HelperFunction = () => {
97
+ return "not JSX";
98
+ };
99
+ export default MyView;
100
+ `,
101
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
102
+ },
103
+ // 8. Non-View/Container file (rule should not apply)
104
+ {
105
+ code: `
106
+ const Component1 = () => <div>1</div>;
107
+ const Component2 = () => <div>2</div>;
108
+ export { Component1, Component2 };
109
+ `,
110
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/utils.tsx`,
111
+ },
112
+ // 9. Excluded directory - UI components
113
+ {
114
+ code: `
115
+ const Component1 = () => <div>1</div>;
116
+ const Component2 = () => <div>2</div>;
117
+ export { Component1, Component2 };
118
+ `,
119
+ filename: `${UI_COMPONENTS_PATH}/MyView.tsx`,
120
+ },
121
+ // 10. Excluded directory - Shared components
122
+ {
123
+ code: `
124
+ const Component1 = () => <div>1</div>;
125
+ const Component2 = () => <div>2</div>;
126
+ export { Component1, Component2 };
127
+ `,
128
+ filename: `${SHARED_COMPONENTS_PATH}/MyView.tsx`,
129
+ },
130
+ // 11. Single component - conditional expression
131
+ {
132
+ code: `
133
+ const MyView = ({ show }) => show ? <div>Visible</div> : <div>Hidden</div>;
134
+ export default MyView;
135
+ `,
136
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
137
+ },
138
+ // 12. Single component - logical expression
139
+ {
140
+ code: `
141
+ const MyView = ({ show }) => show && <div>Content</div>;
142
+ export default MyView;
143
+ `,
144
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
145
+ },
146
+ ],
147
+ invalid: [
148
+ // 1. Two arrow function components
149
+ {
150
+ code: `
151
+ const Component1 = () => <div>First</div>;
152
+ const Component2 = () => <div>Second</div>;
153
+ export default Component1;
154
+ `,
155
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
156
+ errors: [
157
+ {
158
+ messageId: "multipleComponents",
159
+ data: {
160
+ componentName: "Component2",
161
+ firstComponentName: "Component1",
162
+ },
163
+ },
164
+ ],
165
+ },
166
+ // 2. Two memo-wrapped components
167
+ {
168
+ code: `
169
+ import { memo } from "react";
170
+ const Component1 = memo(() => <div>First</div>);
171
+ const Component2 = memo(() => <div>Second</div>);
172
+ export default Component1;
173
+ `,
174
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
175
+ errors: [
176
+ {
177
+ messageId: "multipleComponents",
178
+ data: {
179
+ componentName: "Component2",
180
+ firstComponentName: "Component1",
181
+ },
182
+ },
183
+ ],
184
+ },
185
+ // 3. Main component and helper component (realistic violation)
186
+ {
187
+ code: `
188
+ import React from "react";
189
+ const MessageItem = ({ item }) => <div>{item}</div>;
190
+ const MessageListView = ({ messages }) => (
191
+ <div>{messages.map(msg => <MessageItem item={msg} />)}</div>
192
+ );
193
+ export default MessageListView;
194
+ `,
195
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MessageListView.tsx`,
196
+ errors: [
197
+ {
198
+ messageId: "multipleComponents",
199
+ data: {
200
+ componentName: "MessageListView",
201
+ firstComponentName: "MessageItem",
202
+ },
203
+ },
204
+ ],
205
+ },
206
+ // 4. Function declaration and arrow function
207
+ {
208
+ code: `
209
+ function Component1() {
210
+ return <div>First</div>;
211
+ }
212
+ const Component2 = () => <div>Second</div>;
213
+ export default Component1;
214
+ `,
215
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
216
+ errors: [
217
+ {
218
+ messageId: "multipleComponents",
219
+ data: {
220
+ componentName: "Component2",
221
+ firstComponentName: "Component1",
222
+ },
223
+ },
224
+ ],
225
+ },
226
+ // 5. Three components (multiple violations)
227
+ {
228
+ code: `
229
+ const Component1 = () => <div>First</div>;
230
+ const Component2 = () => <div>Second</div>;
231
+ const Component3 = () => <div>Third</div>;
232
+ export default Component1;
233
+ `,
234
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
235
+ errors: [
236
+ {
237
+ messageId: "multipleComponents",
238
+ data: {
239
+ componentName: "Component2",
240
+ firstComponentName: "Component1",
241
+ },
242
+ },
243
+ {
244
+ messageId: "multipleComponents",
245
+ data: {
246
+ componentName: "Component3",
247
+ firstComponentName: "Component1",
248
+ },
249
+ },
250
+ ],
251
+ },
252
+ // 6. Container file with multiple components
253
+ {
254
+ code: `
255
+ const Helper = () => <div>Helper</div>;
256
+ const MyContainer = () => <div><Helper /></div>;
257
+ export default MyContainer;
258
+ `,
259
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyContainer.tsx`,
260
+ errors: [
261
+ {
262
+ messageId: "multipleComponents",
263
+ data: {
264
+ componentName: "MyContainer",
265
+ firstComponentName: "Helper",
266
+ },
267
+ },
268
+ ],
269
+ },
270
+ // 7. Multiple components with conditional expressions
271
+ {
272
+ code: `
273
+ const Component1 = ({ show }) => show ? <div>First</div> : null;
274
+ const Component2 = ({ show }) => show && <div>Second</div>;
275
+ export default Component1;
276
+ `,
277
+ filename: `${FEATURE_EXAMPLE_COMPONENTS_PATH}/MyView.tsx`,
278
+ errors: [
279
+ {
280
+ messageId: "multipleComponents",
281
+ data: {
282
+ componentName: "Component2",
283
+ firstComponentName: "Component1",
284
+ },
285
+ },
286
+ ],
287
+ },
288
+ ],
289
+ });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ESLint plugin for component structure standards
3
+ *
4
+ * This plugin enforces component structure and patterns for React components
5
+ * in the frontend application. Supports ESLint 9 flat config format.
6
+ *
7
+ * Rules:
8
+ * - enforce-component-structure: Ensures components follow the Container/View pattern
9
+ * - no-return-in-view: Disallows return statements in View components
10
+ * - require-memo-in-view: Enforces React.memo usage in View components
11
+ * - single-component-per-file: Ensures only one React component per file
12
+ * @module eslint-plugin-component-structure
13
+ */
14
+ const enforceComponentStructure = require("./rules/enforce-component-structure");
15
+ const noReturnInView = require("./rules/no-return-in-view");
16
+ const requireMemoInView = require("./rules/require-memo-in-view");
17
+ const singleComponentPerFile = require("./rules/single-component-per-file");
18
+
19
+ const plugin = {
20
+ meta: {
21
+ name: "eslint-plugin-component-structure",
22
+ version: "1.0.0",
23
+ },
24
+ rules: {
25
+ "enforce-component-structure": enforceComponentStructure,
26
+ "no-return-in-view": noReturnInView,
27
+ "require-memo-in-view": requireMemoInView,
28
+ "single-component-per-file": singleComponentPerFile,
29
+ },
30
+ };
31
+
32
+ module.exports = plugin;
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "eslint-plugin-component-structure",
3
+ "version": "1.0.0",
4
+ "description": "ESLint plugin for component structure standards",
5
+ "main": "index.js",
6
+ "private": true,
7
+ "peerDependencies": {
8
+ "eslint": ">=9.0.0"
9
+ }
10
+ }