@codyswann/lisa 1.0.0 → 1.0.5

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 (280) hide show
  1. package/README.md +244 -36
  2. package/all/copy-overwrite/.claude/README.md +1 -3
  3. package/all/copy-overwrite/.claude/REFERENCE.md +519 -0
  4. package/all/copy-overwrite/.claude/agents/skill-evaluator.md +7 -7
  5. package/all/copy-overwrite/.claude/agents/test-coverage-agent.md +17 -0
  6. package/all/copy-overwrite/.claude/commands/git/commit.md +9 -5
  7. package/all/copy-overwrite/.claude/commands/git/submit-pr.md +1 -1
  8. package/all/copy-overwrite/.claude/commands/lisa/review-implementation.md +209 -0
  9. package/all/copy-overwrite/.claude/commands/project/add-test-coverage.md +58 -0
  10. package/all/copy-overwrite/.claude/commands/project/archive.md +1 -1
  11. package/all/copy-overwrite/.claude/commands/project/complete-task.md +53 -1
  12. package/all/copy-overwrite/.claude/commands/project/debrief.md +12 -23
  13. package/all/copy-overwrite/.claude/commands/project/execute.md +33 -77
  14. package/all/copy-overwrite/.claude/commands/project/fix-linter-error.md +87 -0
  15. package/all/copy-overwrite/.claude/commands/project/implement.md +24 -28
  16. package/all/copy-overwrite/.claude/commands/project/lower-code-complexity.md +30 -55
  17. package/all/copy-overwrite/.claude/commands/project/plan.md +87 -242
  18. package/all/copy-overwrite/.claude/commands/project/reduce-max-lines-per-function.md +76 -0
  19. package/all/copy-overwrite/.claude/commands/project/reduce-max-lines.md +75 -0
  20. package/all/copy-overwrite/.claude/commands/project/research.md +86 -188
  21. package/all/copy-overwrite/.claude/commands/project/review.md +19 -38
  22. package/all/copy-overwrite/.claude/commands/project/setup.md +1 -1
  23. package/all/copy-overwrite/.claude/commands/project/verify.md +62 -25
  24. package/all/copy-overwrite/.claude/commands/pull-request/review.md +25 -7
  25. package/all/copy-overwrite/.claude/commands/tasks/load.md +63 -0
  26. package/all/copy-overwrite/.claude/commands/tasks/sync.md +84 -0
  27. package/all/copy-overwrite/.claude/hooks/README.md +75 -0
  28. package/all/copy-overwrite/.claude/hooks/check-tired-boss.sh +61 -0
  29. package/all/copy-overwrite/.claude/hooks/debug-hook.sh +47 -0
  30. package/all/copy-overwrite/.claude/hooks/notify-ntfy.sh +2 -0
  31. package/all/copy-overwrite/.claude/hooks/sync-tasks.sh +95 -0
  32. package/all/copy-overwrite/.claude/{skills/coding-philosophy/SKILL.md → rules/coding-philosophy.md} +93 -70
  33. package/all/copy-overwrite/.claude/settings.json +35 -14
  34. package/all/copy-overwrite/.claude/skills/prompt-complexity-scorer/SKILL.md +41 -9
  35. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/init_skill.py +2 -0
  36. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/package_skill.py +2 -0
  37. package/all/copy-overwrite/.claude/skills/skill-creator/scripts/quick_validate.py +2 -0
  38. package/all/copy-overwrite/.safety-net.json +25 -0
  39. package/all/copy-overwrite/CLAUDE.md +8 -30
  40. package/all/copy-overwrite/HUMAN.md +517 -17
  41. package/all/create-only/.claude/rules/PROJECT_RULES.md +9 -0
  42. package/all/create-only/scripts/setup-deploy-key.sh +190 -0
  43. package/all/deletions.json +5 -0
  44. package/cdk/copy-overwrite/.github/workflows/ci.yml +142 -0
  45. package/cdk/copy-overwrite/.github/workflows/deploy.yml +59 -0
  46. package/cdk/copy-overwrite/eslint.cdk.ts +175 -0
  47. package/cdk/copy-overwrite/eslint.config.ts +51 -0
  48. package/cdk/copy-overwrite/eslint.slow.config.ts +80 -0
  49. package/cdk/copy-overwrite/knip.json +53 -0
  50. package/cdk/copy-overwrite/tsconfig.eslint.json +11 -0
  51. package/cdk/merge/package.json +17 -1
  52. package/dist/cli/index.d.ts +3 -2
  53. package/dist/cli/index.d.ts.map +1 -1
  54. package/dist/cli/index.js +83 -64
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/prompts.d.ts +17 -3
  57. package/dist/cli/prompts.d.ts.map +1 -1
  58. package/dist/cli/prompts.js +52 -16
  59. package/dist/cli/prompts.js.map +1 -1
  60. package/dist/core/config.d.ts +13 -4
  61. package/dist/core/config.d.ts.map +1 -1
  62. package/dist/core/config.js +17 -9
  63. package/dist/core/config.js.map +1 -1
  64. package/dist/core/git-service.d.ts +40 -0
  65. package/dist/core/git-service.d.ts.map +1 -0
  66. package/dist/core/git-service.js +52 -0
  67. package/dist/core/git-service.js.map +1 -0
  68. package/dist/core/index.d.ts +3 -3
  69. package/dist/core/index.js +3 -3
  70. package/dist/core/lisa.d.ts +124 -7
  71. package/dist/core/lisa.d.ts.map +1 -1
  72. package/dist/core/lisa.js +423 -221
  73. package/dist/core/lisa.js.map +1 -1
  74. package/dist/core/manifest.d.ts +5 -1
  75. package/dist/core/manifest.d.ts.map +1 -1
  76. package/dist/core/manifest.js +22 -16
  77. package/dist/core/manifest.js.map +1 -1
  78. package/dist/detection/detector.interface.d.ts +1 -1
  79. package/dist/detection/detectors/cdk.d.ts +6 -1
  80. package/dist/detection/detectors/cdk.d.ts.map +1 -1
  81. package/dist/detection/detectors/cdk.js +16 -8
  82. package/dist/detection/detectors/cdk.js.map +1 -1
  83. package/dist/detection/detectors/expo.d.ts +6 -1
  84. package/dist/detection/detectors/expo.d.ts.map +1 -1
  85. package/dist/detection/detectors/expo.js +13 -8
  86. package/dist/detection/detectors/expo.js.map +1 -1
  87. package/dist/detection/detectors/nestjs.d.ts +7 -2
  88. package/dist/detection/detectors/nestjs.d.ts.map +1 -1
  89. package/dist/detection/detectors/nestjs.js +17 -9
  90. package/dist/detection/detectors/nestjs.js.map +1 -1
  91. package/dist/detection/detectors/npm-package.d.ts +6 -1
  92. package/dist/detection/detectors/npm-package.d.ts.map +1 -1
  93. package/dist/detection/detectors/npm-package.js +9 -4
  94. package/dist/detection/detectors/npm-package.js.map +1 -1
  95. package/dist/detection/detectors/typescript.d.ts +6 -1
  96. package/dist/detection/detectors/typescript.d.ts.map +1 -1
  97. package/dist/detection/detectors/typescript.js +12 -7
  98. package/dist/detection/detectors/typescript.js.map +1 -1
  99. package/dist/detection/index.d.ts +13 -3
  100. package/dist/detection/index.d.ts.map +1 -1
  101. package/dist/detection/index.js +17 -7
  102. package/dist/detection/index.js.map +1 -1
  103. package/dist/errors/index.d.ts +66 -2
  104. package/dist/errors/index.d.ts.map +1 -1
  105. package/dist/errors/index.js +89 -17
  106. package/dist/errors/index.js.map +1 -1
  107. package/dist/index.js +3 -3
  108. package/dist/index.js.map +1 -1
  109. package/dist/logging/console-logger.d.ts +21 -1
  110. package/dist/logging/console-logger.d.ts.map +1 -1
  111. package/dist/logging/console-logger.js +26 -6
  112. package/dist/logging/console-logger.js.map +1 -1
  113. package/dist/logging/index.d.ts +3 -3
  114. package/dist/logging/index.js +2 -2
  115. package/dist/logging/logger.interface.d.ts +1 -1
  116. package/dist/logging/silent-logger.d.ts +21 -1
  117. package/dist/logging/silent-logger.d.ts.map +1 -1
  118. package/dist/logging/silent-logger.js +20 -0
  119. package/dist/logging/silent-logger.js.map +1 -1
  120. package/dist/strategies/copy-contents.d.ts +47 -6
  121. package/dist/strategies/copy-contents.d.ts.map +1 -1
  122. package/dist/strategies/copy-contents.js +99 -49
  123. package/dist/strategies/copy-contents.js.map +1 -1
  124. package/dist/strategies/copy-overwrite.d.ts +10 -2
  125. package/dist/strategies/copy-overwrite.d.ts.map +1 -1
  126. package/dist/strategies/copy-overwrite.js +17 -9
  127. package/dist/strategies/copy-overwrite.js.map +1 -1
  128. package/dist/strategies/create-only.d.ts +10 -2
  129. package/dist/strategies/create-only.d.ts.map +1 -1
  130. package/dist/strategies/create-only.js +14 -6
  131. package/dist/strategies/create-only.js.map +1 -1
  132. package/dist/strategies/index.d.ts +17 -7
  133. package/dist/strategies/index.d.ts.map +1 -1
  134. package/dist/strategies/index.js +19 -9
  135. package/dist/strategies/index.js.map +1 -1
  136. package/dist/strategies/merge.d.ts +10 -2
  137. package/dist/strategies/merge.d.ts.map +1 -1
  138. package/dist/strategies/merge.js +21 -21
  139. package/dist/strategies/merge.js.map +1 -1
  140. package/dist/strategies/strategy.interface.d.ts +1 -1
  141. package/dist/strategies/strategy.interface.d.ts.map +1 -1
  142. package/dist/transaction/backup.d.ts +15 -1
  143. package/dist/transaction/backup.d.ts.map +1 -1
  144. package/dist/transaction/backup.js +47 -12
  145. package/dist/transaction/backup.js.map +1 -1
  146. package/dist/transaction/index.d.ts +3 -3
  147. package/dist/transaction/index.js +2 -2
  148. package/dist/transaction/transaction.d.ts +25 -2
  149. package/dist/transaction/transaction.d.ts.map +1 -1
  150. package/dist/transaction/transaction.js +25 -2
  151. package/dist/transaction/transaction.js.map +1 -1
  152. package/dist/utils/file-operations.d.ts +21 -0
  153. package/dist/utils/file-operations.d.ts.map +1 -1
  154. package/dist/utils/file-operations.js +48 -12
  155. package/dist/utils/file-operations.js.map +1 -1
  156. package/dist/utils/index.d.ts +3 -3
  157. package/dist/utils/index.js +3 -3
  158. package/dist/utils/json-utils.d.ts +12 -0
  159. package/dist/utils/json-utils.d.ts.map +1 -1
  160. package/dist/utils/json-utils.js +17 -5
  161. package/dist/utils/json-utils.js.map +1 -1
  162. package/dist/utils/path-utils.d.ts +11 -0
  163. package/dist/utils/path-utils.d.ts.map +1 -1
  164. package/dist/utils/path-utils.js +12 -1
  165. package/dist/utils/path-utils.js.map +1 -1
  166. package/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +5 -0
  167. package/eslint-plugin-code-organization/index.js +5 -0
  168. package/eslint-plugin-code-organization/rules/enforce-statement-order.js +5 -0
  169. package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +2 -0
  170. package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/create_component.py +2 -0
  171. package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/validate_component.py +2 -0
  172. package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +2 -0
  173. package/expo/copy-overwrite/.claude/skills/directory-structure/scripts/validate_structure.py +2 -0
  174. package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/scripts/generate-route.py +2 -0
  175. package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/scripts/validate_styling.py +2 -41
  176. package/{typescript → expo}/copy-overwrite/.github/workflows/build.yml +3 -0
  177. package/expo/copy-overwrite/.github/workflows/ci.yml +36 -0
  178. package/{typescript → expo}/copy-overwrite/.github/workflows/deploy.yml +22 -26
  179. package/{typescript → expo}/copy-overwrite/.github/workflows/lighthouse.yml +4 -1
  180. package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/plugin-index.test.js +5 -0
  181. package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/require-memo-in-view.test.js +5 -0
  182. package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/single-component-per-file.test.js +5 -0
  183. package/expo/copy-overwrite/eslint-plugin-component-structure/index.js +5 -0
  184. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/enforce-component-structure.js +5 -0
  185. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/no-return-in-view.js +6 -1
  186. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/require-memo-in-view.js +5 -0
  187. package/expo/copy-overwrite/eslint-plugin-component-structure/rules/single-component-per-file.js +5 -0
  188. package/expo/copy-overwrite/eslint-plugin-ui-standards/README.md +0 -68
  189. package/expo/copy-overwrite/eslint-plugin-ui-standards/index.js +5 -3
  190. package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-classname-outside-ui.js +5 -0
  191. package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-direct-rn-imports.js +5 -0
  192. package/expo/copy-overwrite/eslint.config.ts +53 -0
  193. package/expo/copy-overwrite/eslint.expo.ts +330 -0
  194. package/expo/copy-overwrite/eslint.slow.config.ts +86 -0
  195. package/expo/copy-overwrite/knip.json +132 -0
  196. package/expo/copy-overwrite/lighthouserc.js +27 -0
  197. package/expo/copy-overwrite/tsconfig.eslint.json +25 -0
  198. package/expo/create-only/lighthouserc-config.json +6 -1
  199. package/expo/merge/package.json +16 -3
  200. package/nestjs/copy-overwrite/.claude/skills/nestjs-rules/SKILL.md +1 -1
  201. package/{typescript → nestjs}/copy-overwrite/.github/k6/README.md +2 -2
  202. package/{typescript → nestjs}/copy-overwrite/.github/k6/examples/customer-deploy-integration.yml +3 -0
  203. package/{typescript → nestjs}/copy-overwrite/.github/k6/examples/data-driven-test.js +5 -0
  204. package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/load.js +6 -2
  205. package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/smoke.js +5 -0
  206. package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/soak.js +5 -0
  207. package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/spike.js +5 -0
  208. package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/stress.js +5 -0
  209. package/{typescript → nestjs}/copy-overwrite/.github/k6/scripts/api-test.js +5 -0
  210. package/{typescript → nestjs}/copy-overwrite/.github/k6/scripts/default-test.js +5 -0
  211. package/nestjs/copy-overwrite/.github/workflows/ci.yml +29 -0
  212. package/nestjs/copy-overwrite/.github/workflows/deploy.yml +291 -0
  213. package/{typescript → nestjs}/copy-overwrite/.github/workflows/load-test.yml +3 -0
  214. package/nestjs/copy-overwrite/eslint.config.ts +53 -0
  215. package/nestjs/copy-overwrite/eslint.nestjs.ts +178 -0
  216. package/nestjs/merge/package.json +11 -3
  217. package/package.json +34 -40
  218. package/typescript/copy-contents/.husky/pre-commit +1 -1
  219. package/typescript/copy-contents/.husky/pre-push +99 -118
  220. package/typescript/copy-overwrite/.claude/hooks/format-on-edit.sh +2 -0
  221. package/typescript/copy-overwrite/.claude/hooks/install_pkgs.sh +3 -11
  222. package/typescript/copy-overwrite/.claude/hooks/lint-on-edit.sh +2 -0
  223. package/typescript/copy-overwrite/.claude/hooks/sg-scan-on-edit.sh +68 -0
  224. package/typescript/copy-overwrite/.claude/settings.json +79 -0
  225. package/typescript/copy-overwrite/.claude/skills/jsdoc-best-practices/SKILL.md +44 -0
  226. package/typescript/copy-overwrite/.github/README.md +49 -1
  227. package/typescript/copy-overwrite/.github/dependabot.yml +3 -0
  228. package/typescript/copy-overwrite/.github/workflows/ci.yml +7 -29
  229. package/typescript/copy-overwrite/.github/workflows/claude.yml +3 -0
  230. package/typescript/copy-overwrite/.github/workflows/create-github-issue-on-failure.yml +6 -4
  231. package/typescript/copy-overwrite/.github/workflows/create-issue-on-failure.yml +176 -0
  232. package/typescript/copy-overwrite/.github/workflows/create-jira-issue-on-failure.yml +3 -1
  233. package/typescript/copy-overwrite/.github/workflows/create-sentry-issue-on-failure.yml +3 -1
  234. package/typescript/copy-overwrite/.github/workflows/lint-slow.yml +40 -0
  235. package/typescript/copy-overwrite/.github/workflows/quality.yml +151 -38
  236. package/typescript/copy-overwrite/.github/workflows/release.yml +3 -0
  237. package/typescript/copy-overwrite/.gitleaksignore +3 -0
  238. package/typescript/copy-overwrite/.lintstagedrc.json +6 -0
  239. package/typescript/copy-overwrite/.prettierignore +2 -1
  240. package/typescript/copy-overwrite/.yamllint +2 -0
  241. package/typescript/copy-overwrite/ast-grep/rule-tests/.gitkeep +3 -0
  242. package/typescript/copy-overwrite/ast-grep/rules/.gitkeep +3 -0
  243. package/typescript/copy-overwrite/ast-grep/utils/.gitkeep +3 -0
  244. package/typescript/copy-overwrite/{commitlint.config.js → commitlint.config.cjs} +5 -0
  245. package/typescript/copy-overwrite/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +5 -0
  246. package/typescript/copy-overwrite/eslint-plugin-code-organization/index.js +5 -0
  247. package/typescript/copy-overwrite/eslint-plugin-code-organization/rules/enforce-statement-order.js +5 -0
  248. package/typescript/copy-overwrite/eslint.base.ts +430 -0
  249. package/typescript/copy-overwrite/eslint.config.ts +52 -0
  250. package/typescript/copy-overwrite/eslint.ignore.config.json +19 -2
  251. package/typescript/copy-overwrite/eslint.slow.config.ts +69 -0
  252. package/typescript/copy-overwrite/eslint.typescript.ts +142 -0
  253. package/typescript/copy-overwrite/knip.json +64 -0
  254. package/typescript/copy-overwrite/sgconfig.yml +11 -0
  255. package/typescript/copy-overwrite/tsconfig.eslint.json +9 -0
  256. package/typescript/create-only/eslint.config.local.ts +24 -0
  257. package/typescript/{copy-overwrite/eslint.thresholds.config.json → create-only/eslint.thresholds.json} +1 -1
  258. package/typescript/github-rulesets/base.json +2 -75
  259. package/typescript/merge/.claude/settings.json +160 -0
  260. package/typescript/merge/package.json +35 -34
  261. package/all/copy-overwrite/.claude/commands/rules/format-md.md +0 -72
  262. package/all/copy-overwrite/.claude/skills/coding-philosophy/references/function-structure.md +0 -416
  263. package/all/copy-overwrite/.claude/skills/coding-philosophy/references/immutable-patterns.md +0 -316
  264. package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-inline-styles.js +0 -73
  265. package/expo/copy-overwrite/eslint.config.mjs +0 -560
  266. package/lisa.sh +0 -35
  267. package/typescript/copy-overwrite/eslint.config.mjs +0 -390
  268. /package/{all/create-only/PROJECT_RULES.md → cdk/copy-overwrite/.github/workflows/.keep} +0 -0
  269. /package/{typescript → nestjs}/copy-overwrite/.github/k6/BROWSER_TESTING_NOTE.md +0 -0
  270. /package/{typescript → nestjs}/copy-overwrite/.github/k6/INTEGRATION_GUIDE.md +0 -0
  271. /package/{typescript → nestjs}/copy-overwrite/.github/k6/SCENARIO_SELECTION_GUIDE.md +0 -0
  272. /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/load.json +0 -0
  273. /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/smoke.json +0 -0
  274. /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/soak.json +0 -0
  275. /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/spike.json +0 -0
  276. /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/stress.json +0 -0
  277. /package/{typescript → nestjs}/copy-overwrite/.github/k6/thresholds/normal.json +0 -0
  278. /package/{typescript → nestjs}/copy-overwrite/.github/k6/thresholds/relaxed.json +0 -0
  279. /package/{typescript → nestjs}/copy-overwrite/.github/k6/thresholds/strict.json +0 -0
  280. /package/{typescript → nestjs}/copy-overwrite/.github/workflows/k6-load-test-README.md +0 -0
@@ -0,0 +1,291 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
3
+
4
+ # This is an example deployment workflow that demonstrates the recommended pattern:
5
+ # 1. Call the release.yml workflow to create a release
6
+ # 2. Implement your custom deployment logic
7
+ # 3. Optionally run load tests for staging deployments
8
+ #
9
+ # The release.yml workflow is kept separate from deployment to allow:
10
+ # - Different deployment strategies per project (AWS, Azure, GCP, etc.)
11
+ # - Custom deployment logic without modifying the release workflow
12
+ # - Optional load testing based on environment
13
+ # - Flexibility to deploy the same release to multiple environments
14
+
15
+ name: 🚀 Release and Deploy
16
+
17
+ on:
18
+ push:
19
+ branches:
20
+ - main
21
+ - staging
22
+ - dev
23
+ workflow_dispatch:
24
+ inputs:
25
+ environment:
26
+ description: 'Environment to deploy to'
27
+ required: true
28
+ default: 'dev'
29
+ type: choice
30
+ options:
31
+ - main
32
+ - staging
33
+ - dev
34
+
35
+ # Prevent concurrent runs of the same workflow on the same ref
36
+ concurrency:
37
+ group: ${{ github.workflow }}-${{ github.ref }}
38
+ cancel-in-progress: true
39
+
40
+ jobs:
41
+ # Environment setup
42
+ determine_environment:
43
+ name: 🌍 Determine Environment
44
+ runs-on: ubuntu-latest
45
+ timeout-minutes: 5
46
+ outputs:
47
+ environment: ${{ steps.env.outputs.environment }}
48
+ steps:
49
+ - name: 🔄 Set environment
50
+ id: env
51
+ run: |
52
+ if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
53
+ echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT
54
+ else
55
+ echo "environment=${{ github.ref_name }}" >> $GITHUB_OUTPUT
56
+ fi
57
+
58
+ # Step 1: Create a release
59
+ release:
60
+ name: 📦 Release
61
+ uses: ./.github/workflows/release.yml
62
+ needs: [determine_environment]
63
+ with:
64
+ environment: ${{ needs.determine_environment.outputs.environment }}
65
+ release_strategy: 'semantic'
66
+ skip_jobs: 'test:e2e,test:unit,test:integration,test'
67
+ # require_approval: ${{ needs.determine_environment.outputs.environment == 'main' }}
68
+ # require_signatures: ${{ needs.determine_environment.outputs.environment == 'main' }}
69
+ generate_sbom: true
70
+ override_blackout: true
71
+ require_approval: false
72
+ require_signatures: false
73
+ node_version: '22.21.1'
74
+ package_manager: 'bun'
75
+ secrets: inherit
76
+
77
+ check_migration_required:
78
+ name: Check Migration Required
79
+ runs-on: ubuntu-latest
80
+ needs: [release]
81
+ outputs:
82
+ requires_migration: ${{ steps.check.outputs.requires_migration }}
83
+ steps:
84
+ - name: Checkout
85
+ uses: actions/checkout@v4
86
+ - id: check
87
+ run: |
88
+ if [[ -z "${SKIP_MIGRATIONS}" ]]; then
89
+ echo "requires_migration=true" >> $GITHUB_OUTPUT
90
+ else
91
+ echo "requires_migration=false" >> $GITHUB_OUTPUT
92
+ fi
93
+ shell: bash
94
+ env:
95
+ SKIP_MIGRATIONS: ${{ vars.SKIP_MIGRATIONS }}
96
+
97
+ verify_vpn:
98
+ name: Verify VPN
99
+ runs-on: ubuntu-latest
100
+ needs: [check_migration_required]
101
+ if: always() && needs.check_migration_required.outputs.requires_migration == 'true'
102
+ outputs:
103
+ has_vpn_setup: ${{ steps.check.outputs.has_vpn_setup }}
104
+ steps:
105
+ - name: Checkout
106
+ uses: actions/checkout@v4
107
+ - uses: noliran/branch-based-secrets@v1
108
+ with:
109
+ secrets: OVPN_CONFIG
110
+ - id: check
111
+ run: |
112
+ if [[ -z "${OVPN_CONFIG}" ]]; then
113
+ echo "has_vpn_setup=false" >> $GITHUB_OUTPUT
114
+ else
115
+ echo "has_vpn_setup=true" >> $GITHUB_OUTPUT
116
+ fi
117
+ env:
118
+ OVPN_CONFIG: ${{ secrets[env.OVPN_CONFIG_NAME] }}
119
+ migrate:
120
+ name: Schema Migrations
121
+ runs-on: ubuntu-latest
122
+ needs: [determine_environment, verify_vpn]
123
+ if: always() && needs.verify_vpn.outputs.has_vpn_setup == 'true'
124
+ permissions:
125
+ id-token: write # needed to interact with GitHub's OIDC Token endpoint.
126
+ contents: read
127
+ steps:
128
+ - uses: actions/checkout@v2
129
+ - uses: noliran/branch-based-secrets@v1
130
+ with:
131
+ secrets: AWS_ACCOUNT_ID
132
+ - name: configure aws credentials
133
+ uses: aws-actions/configure-aws-credentials@v1
134
+ with:
135
+ role-to-assume: arn:aws:iam::${{ secrets[env.AWS_ACCOUNT_ID_NAME] }}:role/DeployServiceRole
136
+ role-session-name: fedeploysession
137
+ aws-region: us-east-1
138
+ - name: Install Open VPN
139
+ run: sudo apt-get update; sudo apt-get install openvpn
140
+ - uses: noliran/branch-based-secrets@v1
141
+ with:
142
+ secrets: OVPN_CONFIG
143
+ - name: Setup VPN config
144
+ run: |
145
+ echo -e "${{ secrets[env.OVPN_CONFIG_NAME] }}" > config.ovpn
146
+ sudo chmod 700 config.ovpn
147
+ - name: Connect VPN
148
+ run: |
149
+ sudo openvpn --config "config.ovpn" --log "vpn.log" --daemon
150
+ - name: Wait for a VPN connection
151
+ timeout-minutes: 2
152
+ run: |
153
+ sleep 60s
154
+ sudo cat vpn.log
155
+ - name: Setup Bun
156
+ uses: oven-sh/setup-bun@v2
157
+ with:
158
+ bun-version: latest
159
+ - name: Install dependencies
160
+ run: bun install
161
+ - name: Run Schema Migrations
162
+ run: STAGE=${{ needs.determine_environment.outputs.environment != 'main' && needs.determine_environment.outputs.environment || 'production' }} bun run migration:run
163
+ env:
164
+ SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }}
165
+ AWS_PROFILE: '' # Override serverless.yml profile with empty string for CI
166
+ deploy:
167
+ needs: [determine_environment, migrate]
168
+ if: |
169
+ always() &&
170
+ (needs.migrate.result == 'success' || needs.migrate.result == 'skipped')
171
+ name: Deploy
172
+ runs-on: ubuntu-latest
173
+ outputs:
174
+ environment_url: ${{ steps.deploy.outputs.environment_url }}
175
+ deployment_status: ${{ steps.deploy.outputs.deployment_status }}
176
+ permissions:
177
+ id-token: write # needed to interact with GitHub's OIDC Token endpoint
178
+ contents: read
179
+ steps:
180
+ - uses: actions/checkout@v3
181
+ - name: Setup Bun
182
+ uses: oven-sh/setup-bun@v2
183
+ with:
184
+ bun-version: latest
185
+ - uses: noliran/branch-based-secrets@v1
186
+ with:
187
+ secrets: AWS_ACCOUNT_ID
188
+ - name: configure aws credentials
189
+ uses: aws-actions/configure-aws-credentials@v1
190
+ with:
191
+ role-to-assume: arn:aws:iam::${{ secrets[env.AWS_ACCOUNT_ID_NAME] }}:role/DeployServiceRole
192
+ role-session-name: fedeploysession
193
+ aws-region: us-east-1
194
+ - name: Install dependencies
195
+ run: bun install
196
+ - name: serverless deploy
197
+ id: deploy
198
+ run: |
199
+ STAGE=${{ needs.determine_environment.outputs.environment != 'main' && needs.determine_environment.outputs.environment || 'production' }}
200
+ OUTPUT=$(bun run serverless deploy --stage $STAGE 2>&1) || {
201
+ echo "deployment_status=failed" >> $GITHUB_OUTPUT
202
+ echo "$OUTPUT"
203
+ exit 1
204
+ }
205
+ echo "$OUTPUT"
206
+ # Extract endpoint URL from serverless output
207
+ ENDPOINT_URL=$(echo "$OUTPUT" | grep -oP 'endpoint: \K(https?://[^\s]+)' | head -1 || echo "")
208
+ if [ -z "$ENDPOINT_URL" ]; then
209
+ # Fallback: try to extract any URL from output
210
+ ENDPOINT_URL=$(echo "$OUTPUT" | grep -oP 'https?://[^\s]+' | head -1 || echo "")
211
+ fi
212
+ echo "environment_url=$ENDPOINT_URL" >> $GITHUB_OUTPUT
213
+ echo "deployment_status=success" >> $GITHUB_OUTPUT
214
+ env:
215
+ SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }}
216
+ AWS_PROFILE: '' # Override serverless.yml profile with empty string for CI
217
+
218
+ - name: 📢 Notify on success
219
+ run: echo "Successfully deployed version ${{ needs.release.outputs.version }} to ${{ needs.determine_environment.outputs.environment }}"
220
+
221
+ # Step 3: Load testing for staging deployments
222
+ load_testing:
223
+ name: 🔍 Load Testing
224
+ needs: [determine_environment, release, deploy]
225
+ if: |
226
+ always() &&
227
+ !cancelled() &&
228
+ needs.deploy.result == 'success' &&
229
+ (needs.determine_environment.outputs.environment == 'staging' || needs.determine_environment.outputs.environment == 'stage')
230
+ uses: ./.github/workflows/load-test.yml
231
+ with:
232
+ environment: ${{ needs.determine_environment.outputs.environment }}
233
+ test_scenario: 'smoke' # Start with smoke test after deployment
234
+ base_url: ${{ needs.deploy.outputs.environment_url }}
235
+ test_duration: '5m'
236
+ virtual_users: 50
237
+ fail_on_threshold: false # Don't fail the release if load test fails
238
+ upload_results: true
239
+ secrets: inherit
240
+
241
+ # Post-deployment monitoring (optional)
242
+ post_deployment_monitoring:
243
+ name: 📊 Post-Deployment Monitoring
244
+ needs: [determine_environment, release, deploy, load_testing]
245
+ if: |
246
+ always() &&
247
+ !cancelled() &&
248
+ needs.deploy.result == 'success'
249
+ runs-on: ubuntu-latest
250
+ steps:
251
+ - name: Monitor Deployment Health
252
+ run: |
253
+ echo "## 📊 Post-Deployment Monitoring" >> $GITHUB_STEP_SUMMARY
254
+ echo "" >> $GITHUB_STEP_SUMMARY
255
+ echo "- **Environment**: ${{ needs.determine_environment.outputs.environment }}" >> $GITHUB_STEP_SUMMARY
256
+ echo "- **Version**: ${{ needs.release.outputs.version }}" >> $GITHUB_STEP_SUMMARY
257
+ echo "- **Deployment Status**: ${{ needs.deploy.outputs.deployment_status }}" >> $GITHUB_STEP_SUMMARY
258
+ echo "- **Environment URL**: ${{ needs.deploy.outputs.environment_url }}" >> $GITHUB_STEP_SUMMARY
259
+
260
+ # Add load test results for staging
261
+ if [[ "${{ needs.determine_environment.outputs.environment }}" == "staging" || "${{ needs.determine_environment.outputs.environment }}" == "stage" ]]; then
262
+ echo "" >> $GITHUB_STEP_SUMMARY
263
+ echo "### 🔍 Load Test Results" >> $GITHUB_STEP_SUMMARY
264
+ echo "- **Test Scenario**: smoke" >> $GITHUB_STEP_SUMMARY
265
+ echo "- **Duration**: 5m" >> $GITHUB_STEP_SUMMARY
266
+ echo "- **Virtual Users**: 50" >> $GITHUB_STEP_SUMMARY
267
+ echo "- **Status**: ${{ needs.load_testing.result }}" >> $GITHUB_STEP_SUMMARY
268
+ fi
269
+
270
+ # Add monitoring checks here
271
+ # - Check application metrics
272
+ # - Verify error rates
273
+ # - Monitor response times
274
+ # - Check resource utilization
275
+
276
+ echo "" >> $GITHUB_STEP_SUMMARY
277
+ echo "✅ Post-deployment monitoring complete" >> $GITHUB_STEP_SUMMARY
278
+
279
+ # Basic health check (uncomment and customize)
280
+ # curl -f ${{ needs.deploy.outputs.environment_url }}/health || echo "Health check failed"
281
+ create_issue_on_failure:
282
+ name: 📌 Create Issue on Failure
283
+ needs: [release, deploy]
284
+ if: ${{ always() && (needs.release.result == 'failure' || needs.deploy.result == 'failure') && !contains(github.event.head_commit.message, '[skip ci]') }}
285
+ uses: ./.github/workflows/create-issue-on-failure.yml
286
+ with:
287
+ package_manager: 'bun'
288
+ node_version: '22.21.1'
289
+ workflow_name: 'Release and Deploy'
290
+ failed_job: ${{ needs.release.result == 'failure' && 'release' || 'deploy' }}
291
+ secrets: inherit
@@ -1,3 +1,6 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
3
+
1
4
  name: K6 Load Testing
2
5
 
3
6
  on:
@@ -0,0 +1,53 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
6
+ /**
7
+ * ESLint 9 Flat Config - Main Entry Point (NestJS)
8
+ *
9
+ * This file imports the NestJS-specific configuration and project-local customizations.
10
+ * Do not modify this file directly - use eslint.config.local.ts for project-specific rules.
11
+ *
12
+ * Inheritance chain:
13
+ * eslint.config.ts (this file)
14
+ * └── eslint.nestjs.ts
15
+ * └── eslint.typescript.ts
16
+ * └── eslint.base.ts
17
+ *
18
+ * @see https://eslint.org/docs/latest/use/configure/configuration-files-new
19
+ * @module eslint.config
20
+ */
21
+ import path from "path";
22
+ import { fileURLToPath } from "url";
23
+
24
+ import {
25
+ defaultIgnores,
26
+ defaultThresholds,
27
+ getNestjsConfig,
28
+ } from "./eslint.nestjs";
29
+
30
+ // Project-specific configuration loaded from JSON files
31
+ import ignoreConfig from "./eslint.ignore.config.json" with { type: "json" };
32
+ import thresholdsConfig from "./eslint.thresholds.json" with { type: "json" };
33
+
34
+ // Project-local customizations (create-only - safe to modify)
35
+ import localConfig from "./eslint.config.local";
36
+
37
+ const __filename = fileURLToPath(import.meta.url);
38
+ const __dirname = path.dirname(__filename);
39
+
40
+ const ignorePatterns = ignoreConfig.ignores || defaultIgnores;
41
+ const thresholds = { ...defaultThresholds, ...thresholdsConfig };
42
+
43
+ export default [
44
+ // Stack-specific configuration (NestJS)
45
+ ...getNestjsConfig({
46
+ tsconfigRootDir: __dirname,
47
+ ignorePatterns,
48
+ thresholds,
49
+ }),
50
+
51
+ // Project-local customizations
52
+ ...localConfig,
53
+ ];
@@ -0,0 +1,178 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
6
+ /* eslint-disable max-lines-per-function -- config file requires many lines */
7
+ /**
8
+ * ESLint 9 Flat Config - NestJS Stack
9
+ *
10
+ * This configuration extends TypeScript config for NestJS projects.
11
+ * It adjusts rules for NestJS patterns like decorators, dependency injection,
12
+ * and class-based architecture.
13
+ *
14
+ * Inheritance chain:
15
+ * eslint.nestjs.ts (this file)
16
+ * └── eslint.typescript.ts
17
+ * └── eslint.base.ts
18
+ *
19
+ * @see https://eslint.org/docs/latest/use/configure/configuration-files-new
20
+ * @module eslint.nestjs
21
+ */
22
+
23
+ // Import TypeScript config and utilities
24
+ import {
25
+ codeOrganization,
26
+ defaultIgnores,
27
+ defaultThresholds,
28
+ getBaseConfigs,
29
+ getBaseLanguageOptions,
30
+ getJsFilesOverride,
31
+ getSharedFilesOverride,
32
+ getSharedRules,
33
+ getTestFilesOverride,
34
+ getTsFilesOverride,
35
+ getTsTestFilesOverride,
36
+ } from "./eslint.typescript";
37
+
38
+ // Re-export for downstream configs
39
+ export {
40
+ defaultIgnores,
41
+ defaultThresholds,
42
+ getBaseConfigs,
43
+ getBaseLanguageOptions,
44
+ getSharedRules,
45
+ };
46
+
47
+ /**
48
+ * Creates the NestJS ESLint configuration.
49
+ *
50
+ * @param {object} options - Configuration options
51
+ * @param {string} options.tsconfigRootDir - Root directory for tsconfig.json
52
+ * @param {string[]} [options.ignorePatterns] - Patterns to ignore
53
+ * @param {object} [options.thresholds] - Threshold overrides
54
+ * @returns {Array} ESLint flat config array
55
+ */
56
+ export function getNestjsConfig({
57
+ tsconfigRootDir,
58
+ ignorePatterns = defaultIgnores,
59
+ thresholds = defaultThresholds,
60
+ }: {
61
+ tsconfigRootDir: string;
62
+ ignorePatterns?: string[];
63
+ thresholds?: typeof defaultThresholds;
64
+ }) {
65
+ return [
66
+ // Global ignores
67
+ {
68
+ ignores: ignorePatterns,
69
+ },
70
+
71
+ // Base configurations from shared module
72
+ ...getBaseConfigs(),
73
+
74
+ // Base configuration for all files
75
+ {
76
+ languageOptions: getBaseLanguageOptions(),
77
+ plugins: {
78
+ "code-organization": codeOrganization,
79
+ },
80
+ rules: {
81
+ // Shared rules from base
82
+ ...getSharedRules(thresholds),
83
+
84
+ // Code organization
85
+ "code-organization/enforce-statement-order": "error",
86
+
87
+ // Configuration enforcement - prevent direct process.env access
88
+ // All configuration should go through ConfigService
89
+ // @see .claude/rules/PROJECT_RULES.md
90
+ "no-restricted-syntax": [
91
+ "error",
92
+ {
93
+ selector:
94
+ "MemberExpression[object.name='process'][property.name='env']",
95
+ message:
96
+ "Direct process.env access is forbidden. Use ConfigService for type-safe configuration. See .claude/rules/PROJECT_RULES.md.",
97
+ },
98
+ ],
99
+
100
+ // NestJS uses classes extensively for modules, controllers, services, etc.
101
+ "functional/no-classes": "off",
102
+
103
+ // NestJS decorators require class methods
104
+ "jsdoc/require-jsdoc": [
105
+ "error",
106
+ {
107
+ require: {
108
+ FunctionDeclaration: true,
109
+ MethodDefinition: true,
110
+ ClassDeclaration: true,
111
+ ArrowFunctionExpression: false,
112
+ FunctionExpression: false,
113
+ },
114
+ contexts: [
115
+ "TSInterfaceDeclaration",
116
+ "TSTypeAliasDeclaration",
117
+ "VariableDeclaration[declarations.0.init.type='ArrowFunctionExpression']:has([id.name=/^[A-Z]/])",
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ },
123
+
124
+ // JavaScript files override
125
+ getJsFilesOverride(),
126
+
127
+ // Shared hooks and components
128
+ getSharedFilesOverride(),
129
+
130
+ // Test files
131
+ getTestFilesOverride(),
132
+
133
+ // TypeScript files - enable type-checked linting
134
+ getTsFilesOverride(["**/*.ts"], tsconfigRootDir),
135
+
136
+ // TypeScript test files - disable immutable-data
137
+ getTsTestFilesOverride([
138
+ "**/*.test.ts",
139
+ "**/*.spec.ts",
140
+ "**/*.e2e-spec.ts",
141
+ ]),
142
+
143
+ // NestJS module files - relax some rules
144
+ {
145
+ files: ["**/*.module.ts"],
146
+ rules: {
147
+ // Modules often import many things
148
+ "max-lines": "off",
149
+ },
150
+ },
151
+
152
+ // NestJS controller/service files
153
+ {
154
+ files: ["**/*.controller.ts", "**/*.service.ts", "**/*.resolver.ts"],
155
+ rules: {
156
+ // These files often have many methods
157
+ "max-lines-per-function": ["error", { max: 100 }],
158
+ },
159
+ },
160
+
161
+ // Configuration files - allowed to use process.env directly
162
+ {
163
+ files: ["**/*config.*", "**/configuration.ts", "**/config/*.ts"],
164
+ rules: {
165
+ "no-restricted-syntax": "off",
166
+ },
167
+ },
168
+
169
+ // Lambda handlers - allowed to use getStandaloneConfig()
170
+ {
171
+ files: ["**/handlers/**/*.ts", "**/lambda/**/*.ts"],
172
+ rules: {
173
+ "no-restricted-syntax": "off",
174
+ },
175
+ },
176
+ ];
177
+ }
178
+ /* eslint-enable max-lines-per-function -- config file requires many lines */
@@ -1,10 +1,14 @@
1
1
  {
2
2
  "scripts": {
3
+ "test": "NODE_ENV=test jest --passWithNoTests",
4
+ "test:unit": "NODE_ENV=test jest --testPathIgnorePatterns=\"\\.integration\\.test\\.(ts|tsx)$\" --passWithNoTests",
5
+ "test:integration": "NODE_ENV=test jest --testPathPatterns=\"\\.integration\\.test\\.(ts|tsx)$\" --passWithNoTests",
6
+ "test:cov": "NODE_ENV=test jest --coverage",
3
7
  "start:local": "IS_OFFLINE=true sls offline start --noTimeout",
4
8
  "start:dev": "IS_OFFLINE=true sls offline start --stage dev",
5
- "start:docker": "docker-compose up",
6
- "start:docker:build": "docker-compose up --build",
7
- "start:docker:down": "docker-compose down",
9
+ "start:docker": "docker compose up",
10
+ "start:docker:build": "docker compose up --build",
11
+ "start:docker:down": "docker compose down",
8
12
  "deploy:dev": "sls deploy --stage dev",
9
13
  "deploy:staging": "sls deploy --stage staging",
10
14
  "deploy:production": "sls deploy --stage production",
@@ -66,7 +70,11 @@
66
70
  "@nestjs/testing": "^11.1.11",
67
71
  "@types/aws-lambda": "^8.10.159",
68
72
  "@types/express": "^5.0.6",
73
+ "@istanbuljs/nyc-config-typescript": "^1.0.2",
74
+ "@jest/test-sequencer": "^30.2.0",
69
75
  "@types/jest": "^30.0.0",
76
+ "jest": "^30.0.0",
77
+ "ts-jest": "^29.4.6",
70
78
  "serverless": "^4.30.0",
71
79
  "serverless-esbuild": "^1.57.0",
72
80
  "serverless-offline": "^14.4.0"
package/package.json CHANGED
@@ -1,42 +1,27 @@
1
1
  {
2
- "lint-staged": {
3
- "*.{js,ts,tsx}": [
4
- "eslint --quiet --cache --fix"
5
- ],
6
- "*.{js,ts,jsx,tsx,html,css,scss,yaml,yml,graphql}": [
7
- "prettier --write"
8
- ]
9
- },
10
- "engines": {
11
- "npm": "please-use-bun",
12
- "yarn": "please-use-bun",
13
- "bun": ">= 1.3.5",
14
- "node": ">=18.0.0"
15
- },
16
- "config": {
17
- "commitizen": {
18
- "path": "./node_modules/cz-conventional-changelog"
19
- }
20
- },
21
2
  "scripts": {
22
3
  "//docs": "The following commands MUST be defined for CI/CD to work properly - even if they're no-ops.",
23
- "lint": "eslint src --ext .ts",
4
+ "lint": "eslint . --quiet",
24
5
  "lint:fix": "eslint . --fix",
25
6
  "build": "tsc",
26
7
  "test": "vitest run",
27
- "test:unit": "NODE_ENV=test jest --testPathIgnorePatterns=\"\\.integration\\.test\\.(ts|tsx)$\" --passWithNoTests",
28
- "test:integration": "NODE_ENV=test jest --testPathPatterns=\"\\.integration\\.test\\.(ts|tsx)$\" --passWithNoTests",
29
- "test:cov": "NODE_ENV=test jest --coverage",
8
+ "test:unit": "vitest run tests/unit",
9
+ "test:integration": "vitest run tests/integration",
10
+ "test:cov": "vitest run --coverage",
30
11
  "types:check": "tsc --noEmit",
31
12
  "typecheck": "tsc --noEmit",
32
13
  "format:check": "prettier --check .",
33
14
  "format": "prettier --check . --write",
34
- "prepare": "npm run build",
15
+ "prepare": "npm run build && husky install || true",
35
16
  "//end-docs": "",
36
17
  "start": "node dist/index.js",
37
18
  "dev": "tsx src/index.ts",
38
19
  "test:watch": "vitest",
39
- "test:coverage": "vitest run --coverage"
20
+ "update-node-version": "tsx scripts/update-node-version.ts",
21
+ "lint:slow": "eslint . --config eslint.slow.config.ts --quiet",
22
+ "knip": "knip",
23
+ "knip:fix": "knip --fix",
24
+ "sg:scan": "ast-grep scan"
40
25
  },
41
26
  "devDependencies": {
42
27
  "@commitlint/cli": "^20.3.1",
@@ -44,9 +29,6 @@
44
29
  "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
45
30
  "@eslint/eslintrc": "^3.2.0",
46
31
  "@eslint/js": "^9.39.0",
47
- "@istanbuljs/nyc-config-typescript": "^1.0.2",
48
- "@jest/test-sequencer": "^30.2.0",
49
- "@types/jest": "^30.0.0",
50
32
  "commitizen": "^4.3.0",
51
33
  "cz-conventional-changelog": "^3.3.0",
52
34
  "eslint": "^9.39.0",
@@ -57,32 +39,44 @@
57
39
  "eslint-plugin-prettier": "^5.5.0",
58
40
  "eslint-plugin-sonarjs": "^3.0.0",
59
41
  "husky": "^8.0.0",
60
- "jest": "^30.0.0",
61
42
  "jscodeshift": "0.15.2",
62
43
  "lint-staged": "^16.2.7",
63
44
  "prettier": "^3.3.3",
64
45
  "standard-version": "^9.5.0",
65
- "ts-jest": "^29.4.6",
66
- "ts-morph": "^27.0.2",
67
- "ts-node": "^10.9.2",
68
46
  "typescript": "~5.7.0",
69
47
  "typescript-eslint": "^8.0.0",
70
48
  "@types/fs-extra": "^11.0.0",
71
49
  "@types/lodash.merge": "^4.6.0",
72
50
  "@types/node": "^22.0.0",
73
51
  "@vitest/coverage-v8": "^3.0.0",
74
- "memfs": "^4.0.0",
75
52
  "tsx": "^4.0.0",
76
- "vitest": "^3.0.0"
53
+ "vitest": "^3.0.0",
54
+ "eslint-import-resolver-typescript": "^4.4.4",
55
+ "eslint-plugin-import": "^2.32.0",
56
+ "jiti": "^2.4.0",
57
+ "knip": "^5.82.0",
58
+ "@ast-grep/cli": "^0.40.4"
59
+ },
60
+ "engines": {
61
+ "npm": "please-use-bun",
62
+ "yarn": "please-use-bun",
63
+ "pnpm": "please-use-bun",
64
+ "bun": ">= 1.3.5",
65
+ "node": "22.21.1"
66
+ },
67
+ "config": {
68
+ "commitizen": {
69
+ "path": "./node_modules/cz-conventional-changelog"
70
+ }
77
71
  },
78
72
  "resolutions": {},
79
73
  "trustedDependencies": [
80
- "@sentry/cli"
74
+ "@sentry/cli",
75
+ "@ast-grep/cli"
81
76
  ],
82
77
  "name": "@codyswann/lisa",
83
- "version": "1.0.0",
78
+ "version": "1.0.5",
84
79
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
85
- "type": "module",
86
80
  "main": "dist/index.js",
87
81
  "bin": {
88
82
  "lisa": "dist/index.js"
@@ -118,7 +112,7 @@
118
112
  "expo",
119
113
  "nestjs",
120
114
  "cdk",
121
- "eslint-plugin-code-organization",
122
- "lisa.sh"
123
- ]
115
+ "eslint-plugin-code-organization"
116
+ ],
117
+ "type": "module"
124
118
  }