@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,536 @@
1
+ ---
2
+ name: nestjs-rules
3
+ description: Procedural rules and patterns for NestJS backend development. This skill should be used when creating new NestJS modules, services, resolvers, or controllers. It covers component generation with NestJS CLI, TDD patterns, module structure conventions, Lambda handler patterns, and configuration standards. Use this skill alongside nestjs-graphql for GraphQL-specific patterns.
4
+ ---
5
+
6
+ # NestJS Development Rules
7
+
8
+ ## Overview
9
+
10
+ This skill provides procedural rules for working with NestJS in this project. It covers component generation, testing patterns, module structure, and deployment configuration. For GraphQL-specific patterns (resolvers, types, auth decorators), use the `nestjs-graphql` skill.
11
+
12
+ ## Component Generation
13
+
14
+ Always use NestJS CLI to create components rather than manually creating files.
15
+
16
+ ### Module Generation
17
+
18
+ ```bash
19
+ bunx nest g module <name> --no-spec
20
+ ```
21
+
22
+ ### Service Generation
23
+
24
+ ```bash
25
+ bunx nest g service <name> --no-spec
26
+ ```
27
+
28
+ ### Resolver Generation (GraphQL)
29
+
30
+ ```bash
31
+ bunx nest g resolver <name> --no-spec
32
+ ```
33
+
34
+ ### Controller Generation (REST)
35
+
36
+ ```bash
37
+ bunx nest g controller <name> --no-spec
38
+ ```
39
+
40
+ ### Why `--no-spec`
41
+
42
+ The `--no-spec` flag is used because this project follows TDD (Test-Driven Development). Tests are written first with a custom test structure before implementation, not auto-generated by the CLI.
43
+
44
+ ## Database Migrations
45
+
46
+ ### Never Create Migration Files Manually
47
+
48
+ Never create or modify a TypeORM migration file directly. Instead, use `migration:generate` from `package.json`:
49
+
50
+ ```bash
51
+ bun run migration:generate
52
+ ```
53
+
54
+ **Exception**: Direct modification is allowed only for changes that don't break syncing with entity files (e.g., adding indexes, comments, or non-structural changes).
55
+
56
+ ### Why Auto-Generation
57
+
58
+ TypeORM compares your entity definitions against the current database schema to generate migrations. Manual creation can:
59
+ - Introduce drift between entities and migrations
60
+ - Miss important schema changes
61
+ - Create migrations that don't match entity metadata
62
+
63
+ ## Test-Driven Development Pattern
64
+
65
+ ### Write Tests First
66
+
67
+ Create test files before implementation:
68
+
69
+ ```typescript
70
+ // src/feature/feature.service.test.ts
71
+ import { Test, TestingModule } from "@nestjs/testing";
72
+ import { FeatureService } from "./feature.service";
73
+
74
+ describe("FeatureService", () => {
75
+ const service: FeatureService;
76
+
77
+ beforeEach(async () => {
78
+ const module: TestingModule = await Test.createTestingModule({
79
+ providers: [FeatureService],
80
+ }).compile();
81
+
82
+ service = module.get<FeatureService>(FeatureService);
83
+ });
84
+
85
+ describe("methodName", () => {
86
+ it("should do expected behavior", () => {
87
+ expect(service.methodName()).toBe("expected");
88
+ });
89
+ });
90
+ });
91
+ ```
92
+
93
+ ### Test File Naming
94
+
95
+ - Unit tests: `*.test.ts`
96
+ - Integration tests: `*.integration.test.ts`
97
+
98
+ ### Running Tests
99
+
100
+ ```bash
101
+ # Unit tests only
102
+ bun run test:unit
103
+
104
+ # Integration tests only
105
+ bun run test:integration
106
+
107
+ # All tests
108
+ bun run test
109
+ ```
110
+
111
+ ## Module Structure
112
+
113
+ ### Feature Module Pattern
114
+
115
+ ```
116
+ src/
117
+ ├── <feature>/
118
+ │ ├── <feature>.module.ts # Module definition
119
+ │ ├── <feature>.service.ts # Business logic
120
+ │ ├── <feature>.service.test.ts # Service unit tests
121
+ │ ├── <feature>.resolver.ts # GraphQL resolver (if applicable)
122
+ │ ├── <feature>.resolver.test.ts # Resolver unit tests
123
+ │ ├── <feature>.controller.ts # REST controller (if applicable)
124
+ │ ├── <feature>.controller.test.ts
125
+ │ ├── dto/ # Data transfer objects
126
+ │ │ ├── create-<feature>.input.ts
127
+ │ │ └── update-<feature>.input.ts
128
+ │ └── entities/ # Entity definitions
129
+ │ └── <feature>.entity.ts
130
+ ```
131
+
132
+ ### Module Registration
133
+
134
+ Register feature modules in `app.module.ts`:
135
+
136
+ ```typescript
137
+ import { Module } from "@nestjs/common";
138
+ import { FeatureModule } from "./feature/feature.module";
139
+
140
+ @Module({
141
+ imports: [
142
+ // ... other imports
143
+ FeatureModule,
144
+ ],
145
+ })
146
+ export class AppModule {}
147
+ ```
148
+
149
+ ## Lambda Handler Pattern
150
+
151
+ ### Entry Point Structure
152
+
153
+ ```typescript
154
+ // src/main.ts
155
+ import { NestFactory } from "@nestjs/core";
156
+ import { configure as serverlessExpress } from "@vendia/serverless-express";
157
+ import { AppModule } from "./app.module";
158
+
159
+ type ServerlessHandler = ReturnType<typeof serverlessExpress>;
160
+
161
+ /**
162
+ * Creates a lazy-initialized server getter using closure pattern
163
+ * @description Encapsulates mutable cache state for Lambda warm starts
164
+ * @returns Async function that returns the cached or newly created server
165
+ */
166
+ const createServerGetter = (): (() => Promise<ServerlessHandler>) => {
167
+ // eslint-disable-next-line functional/no-let -- Required for Lambda warm start caching
168
+ let cachedServer: ServerlessHandler | null = null;
169
+
170
+ return async (): Promise<ServerlessHandler> => {
171
+ if (cachedServer) {
172
+ return cachedServer;
173
+ }
174
+
175
+ const nestApp = await NestFactory.create(AppModule, {
176
+ cors: {
177
+ origin: "*",
178
+ methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
179
+ preflightContinue: false,
180
+ optionsSuccessStatus: 204,
181
+ },
182
+ });
183
+
184
+ await nestApp.init();
185
+ const app = nestApp.getHttpAdapter().getInstance();
186
+ cachedServer = serverlessExpress({ app });
187
+ return cachedServer;
188
+ };
189
+ };
190
+
191
+ const getServer = createServerGetter();
192
+
193
+ /**
194
+ * Lambda handler function
195
+ * @param event - AWS Lambda event object
196
+ * @param context - AWS Lambda context object
197
+ * @returns Promise resolving to Lambda response
198
+ */
199
+ export const handler = async (
200
+ event: unknown,
201
+ context: unknown
202
+ ): Promise<unknown> => {
203
+ const server = await getServer();
204
+ return server(event, context);
205
+ };
206
+ ```
207
+
208
+ ### Key Lambda Concepts
209
+
210
+ 1. **Warm Start Caching**: Use closure pattern to cache the NestJS application between invocations
211
+ 2. **Serverless Express**: Use `@vendia/serverless-express` for Express adapter compatibility
212
+ 3. **CORS Configuration**: Configure CORS in NestFactory.create(), not in serverless.yml
213
+
214
+ ## Configuration Files
215
+
216
+ ### NestJS CLI Configuration
217
+
218
+ ```json
219
+ // nest-cli.json
220
+ {
221
+ "$schema": "https://json.schemastore.org/nest-cli",
222
+ "collection": "@nestjs/schematics",
223
+ "sourceRoot": "src",
224
+ "compilerOptions": {
225
+ "deleteOutDir": true
226
+ }
227
+ }
228
+ ```
229
+
230
+ ### TypeScript Configuration
231
+
232
+ Required settings for NestJS decorators:
233
+
234
+ ```json
235
+ // tsconfig.json (additions)
236
+ {
237
+ "compilerOptions": {
238
+ "emitDecoratorMetadata": true,
239
+ "experimentalDecorators": true,
240
+ "strictPropertyInitialization": false
241
+ }
242
+ }
243
+ ```
244
+
245
+ ### Serverless Framework Configuration
246
+
247
+ ```yaml
248
+ # serverless.yml
249
+ service: project-name
250
+ frameworkVersion: "^4.0.0"
251
+
252
+ custom:
253
+ esbuild:
254
+ bundle: true
255
+ minify: false
256
+ sourcemap: true
257
+ keepNames: true
258
+ platform: node
259
+ target: node20
260
+ external:
261
+ - "fsevents"
262
+ - "@nestjs/websockets"
263
+ - "@nestjs/microservices"
264
+ - "@apollo/gateway"
265
+ - "@apollo/subgraph"
266
+ - "@as-integrations/fastify"
267
+ - "class-transformer/storage"
268
+
269
+ plugins:
270
+ - serverless-esbuild
271
+ - serverless-offline
272
+
273
+ provider:
274
+ name: aws
275
+ runtime: nodejs20.x
276
+ region: us-east-1
277
+ httpApi:
278
+ cors: true
279
+
280
+ functions:
281
+ main:
282
+ handler: src/main.handler
283
+ timeout: 29
284
+ memorySize: 1024
285
+ events:
286
+ - httpApi:
287
+ method: any
288
+ path: /{proxy+}
289
+ ```
290
+
291
+ ## Documentation Standards
292
+
293
+ ### JSDoc for All Components
294
+
295
+ Every exported function, class, and type must have JSDoc documentation:
296
+
297
+ ```typescript
298
+ /**
299
+ * Service for managing user accounts
300
+ * @description Provides CRUD operations for user entities
301
+ * @remarks
302
+ * - All methods are idempotent
303
+ * - Throws NotFoundException for missing resources
304
+ */
305
+ @Injectable()
306
+ export class UserService {
307
+ /**
308
+ * Retrieves a user by their unique identifier
309
+ * @param id - The unique identifier of the user
310
+ * @returns The user if found, null otherwise
311
+ */
312
+ async findById(id: string): Promise<User | null> {
313
+ return this.repository.findOne({ where: { id } });
314
+ }
315
+ }
316
+ ```
317
+
318
+ ### Module File Preambles
319
+
320
+ Every file should have a preamble comment:
321
+
322
+ ```typescript
323
+ /**
324
+ * @file user.service.ts
325
+ * @description Service providing user account management
326
+ * @module users
327
+ */
328
+ ```
329
+
330
+ ## DataLoader Integration
331
+
332
+ ### Batch Method Pattern
333
+
334
+ Services that support DataLoader must implement batch methods:
335
+
336
+ ```typescript
337
+ /**
338
+ * Batch loads entities by IDs (for DataLoader)
339
+ * @param ids - Array of entity IDs to load
340
+ * @returns Promise resolving to array of entities in same order as input
341
+ * @remarks Used by DataLoader for batching - maintains input order
342
+ */
343
+ async findByIds(ids: readonly string[]): Promise<Entity[]> {
344
+ const entities = await this.repository.findBy({ id: In([...ids]) });
345
+ const entityMap = new Map(entities.map(e => [e.id, e]));
346
+ return ids.map(id => entityMap.get(id) ?? null);
347
+ }
348
+ ```
349
+
350
+ ### Order Preservation
351
+
352
+ Batch functions must return results in the same order as input keys. Always map input IDs to results to maintain order.
353
+
354
+ ## Common Patterns
355
+
356
+ ### Immutable Code
357
+
358
+ Use `const` instead of `let` or `var`:
359
+
360
+ ```typescript
361
+ // Good
362
+ const users = await this.userService.findAll();
363
+ const filtered = users.filter(u => u.active);
364
+
365
+ // Bad
366
+ let users = await this.userService.findAll();
367
+ users = users.filter(u => u.active);
368
+ ```
369
+
370
+ ### Functional Transformations
371
+
372
+ Use `reduce` instead of `push` or `pop`:
373
+
374
+ ```typescript
375
+ // Good
376
+ const userMap = users.reduce(
377
+ (acc, user) => ({ ...acc, [user.id]: user }),
378
+ {} as Record<string, User>
379
+ );
380
+
381
+ // Bad
382
+ const userMap: Record<string, User> = {};
383
+ users.forEach(user => {
384
+ userMap[user.id] = user;
385
+ });
386
+ ```
387
+
388
+ ### Error Handling
389
+
390
+ Use GraphQL errors with codes:
391
+
392
+ ```typescript
393
+ import { GraphQLError } from "graphql";
394
+
395
+ throw new GraphQLError("User not found", {
396
+ extensions: { code: "NOT_FOUND", id },
397
+ });
398
+ ```
399
+
400
+ ## Configuration Management
401
+
402
+ ### Never Use process.env Directly
403
+
404
+ Always use NestJS ConfigService instead of accessing `process.env` directly. This provides:
405
+ - Type safety with full autocomplete
406
+ - Centralized configuration management
407
+ - Easier testing (mock ConfigService instead of environment)
408
+ - Validation at startup
409
+
410
+ ### ConfigService in NestJS Context
411
+
412
+ For services, resolvers, and controllers running within NestJS:
413
+
414
+ ```typescript
415
+ import { Injectable } from "@nestjs/common";
416
+ import { ConfigService } from "@nestjs/config";
417
+ import { Configuration } from "../config/configuration";
418
+
419
+ @Injectable()
420
+ export class MyService {
421
+ constructor(
422
+ private readonly configService: ConfigService<Configuration, true>
423
+ ) {}
424
+
425
+ someMethod(): void {
426
+ // Type-safe configuration access with autocomplete
427
+ const host = this.configService.get("database.host", { infer: true });
428
+ const isOffline = this.configService.get("app.isOffline", { infer: true });
429
+ }
430
+ }
431
+ ```
432
+
433
+ ### ConfigService in Module Factories
434
+
435
+ For dynamic module configuration (e.g., TypeOrmModule.forRootAsync):
436
+
437
+ ```typescript
438
+ import { Module } from "@nestjs/common";
439
+ import { ConfigService } from "@nestjs/config";
440
+ import { TypeOrmModule } from "@nestjs/typeorm";
441
+ import { Configuration } from "../config/configuration";
442
+
443
+ @Module({
444
+ imports: [
445
+ TypeOrmModule.forRootAsync({
446
+ inject: [ConfigService],
447
+ useFactory: (configService: ConfigService<Configuration, true>) =>
448
+ createTypeOrmOptionsFromConfigService(configService),
449
+ }),
450
+ ],
451
+ })
452
+ export class DatabaseModule {}
453
+ ```
454
+
455
+ ### Standalone Configuration (Lambda Handlers)
456
+
457
+ For code running outside NestJS context (Lambda authorizers, WebSocket handlers):
458
+
459
+ ```typescript
460
+ import { getStandaloneConfig } from "../../config/configuration";
461
+
462
+ // Use getStandaloneConfig() for type-safe access outside NestJS
463
+ const config = getStandaloneConfig();
464
+ const host = config.valkey.host;
465
+ const port = config.valkey.port;
466
+ ```
467
+
468
+ ### Configuration Schema
469
+
470
+ All configuration is defined in `src/config/configuration.ts`:
471
+
472
+ ```typescript
473
+ export interface Configuration {
474
+ readonly app: {
475
+ readonly nodeEnv: string;
476
+ readonly isOffline: boolean;
477
+ };
478
+ readonly database: {
479
+ readonly host: string;
480
+ readonly port: number;
481
+ readonly username: string;
482
+ readonly password: string;
483
+ readonly name: string;
484
+ // ... other database config
485
+ };
486
+ readonly valkey: {
487
+ readonly host: string;
488
+ readonly port: number;
489
+ readonly maxRetriesPerRequest: number;
490
+ };
491
+ // ... other configuration namespaces
492
+ }
493
+ ```
494
+
495
+ ### Adding New Configuration
496
+
497
+ 1. Add the new property to the `Configuration` interface
498
+ 2. Add default values in the `configuration()` factory function
499
+ 3. Access via `configService.get("namespace.property", { infer: true })`
500
+
501
+ ### Testing with ConfigService
502
+
503
+ Create mock ConfigService in tests:
504
+
505
+ ```typescript
506
+ const createMockConfigService = (): ConfigService<Configuration, true> => {
507
+ const config = {
508
+ valkey: { host: "localhost", port: 6379, maxRetriesPerRequest: 3 },
509
+ };
510
+
511
+ return {
512
+ get: jest.fn((key: string) => {
513
+ const keys = key.split(".");
514
+ return keys.reduce((obj, k) => obj?.[k], config);
515
+ }),
516
+ } as unknown as ConfigService<Configuration, true>;
517
+ };
518
+
519
+ // In test setup
520
+ const module = await Test.createTestingModule({
521
+ providers: [
522
+ MyService,
523
+ { provide: ConfigService, useValue: createMockConfigService() },
524
+ ],
525
+ }).compile();
526
+ ```
527
+
528
+ ## Verification Checklist
529
+
530
+ After creating or modifying NestJS components:
531
+
532
+ 1. **Unit tests pass**: `bun run test:unit`
533
+ 2. **Integration tests pass**: `bun run test:integration`
534
+ 3. **Linting passes**: `bun run lint`
535
+ 4. **Type check passes**: `bun run build`
536
+ 5. **Local server starts**: `bun run start:local`