@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,176 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
3
+ # -----------------------------------------------------------------------------
4
+ # Cascading Issue Creation Workflow
5
+ # -----------------------------------------------------------------------------
6
+ # ⚠️ WARNING: THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY! ⚠️
7
+ # Any changes may be overwritten by the generation process.
8
+ #
9
+ # This is a dispatcher workflow that intelligently routes failures to the
10
+ # appropriate issue tracking system based on available credentials:
11
+ #
12
+ # 1. If Sentry credentials exist → Create Sentry issue
13
+ # 2. Else if Jira credentials exist → Create Jira issue
14
+ # 3. Else → Create GitHub issue (fallback)
15
+ #
16
+ # Example usage in another workflow:
17
+ # ```yaml
18
+ # create_issue_on_failure:
19
+ # if: failure()
20
+ # uses: ./.github/workflows/create-issue-on-failure.yml
21
+ # with:
22
+ # workflow_name: 'My Workflow'
23
+ # failed_job: 'build_and_test'
24
+ # secrets: inherit
25
+ # ```
26
+ #
27
+ # The workflow automatically detects which system to use based on repository
28
+ # variables and secrets. No configuration needed in the calling workflow.
29
+
30
+ name: 📌 Create Issue on Failure (Auto-Dispatch)
31
+
32
+ on:
33
+ workflow_call:
34
+ inputs:
35
+ workflow_name:
36
+ required: true
37
+ type: string
38
+ description: 'Name of the workflow that failed'
39
+ failed_job:
40
+ required: false
41
+ type: string
42
+ description: 'Name of the job that failed (optional)'
43
+ issue_type:
44
+ required: false
45
+ type: string
46
+ default: 'Bug'
47
+ description: 'Type of issue to create (Bug, Task, etc.)'
48
+ environment:
49
+ required: false
50
+ type: string
51
+ default: 'production'
52
+ description: 'Environment where the failure occurred'
53
+ level:
54
+ required: false
55
+ type: string
56
+ default: 'error'
57
+ description: 'Severity level (debug, info, warning, error, fatal)'
58
+ node_version:
59
+ description: 'Node.js version to use'
60
+ required: false
61
+ default: '22.21.1'
62
+ type: string
63
+ package_manager:
64
+ description: 'Package manager to use (npm, yarn, or bun)'
65
+ required: false
66
+ default: 'npm'
67
+ type: string
68
+ working_directory:
69
+ description: 'Directory to run commands in (if not root)'
70
+ required: false
71
+ default: ''
72
+ type: string
73
+ secrets:
74
+ SENTRY_AUTH_TOKEN:
75
+ required: false
76
+ description: 'Sentry Auth Token (if using Sentry)'
77
+ JIRA_API_TOKEN:
78
+ required: false
79
+ description: 'Jira API token (if using Jira)'
80
+ PAT:
81
+ required: false
82
+ description: 'Personal Access Token (if using GitHub Issues)'
83
+
84
+ # Concurrency is managed by the parent workflow that calls this one
85
+ # This avoids deadlocks between parent and child workflows
86
+
87
+ jobs:
88
+ # Dispatch job determines which system to use based on available credentials
89
+ dispatch:
90
+ name: 🧭 Determine Issue Tracking System
91
+ runs-on: ubuntu-latest
92
+ timeout-minutes: 5
93
+ outputs:
94
+ use_sentry: ${{ steps.check.outputs.sentry }}
95
+ use_jira: ${{ steps.check.outputs.jira }}
96
+ use_github: ${{ steps.check.outputs.github }}
97
+ steps:
98
+ - name: 🔍 Check Available Credentials
99
+ id: check
100
+ run: |
101
+ # Check for Sentry (highest priority)
102
+ if [ -n "${{ vars.SENTRY_ORG }}" ] && [ -n "${{ vars.SENTRY_PROJECT }}" ] && [ -n "${{ secrets.SENTRY_AUTH_TOKEN }}" ]; then
103
+ echo "sentry=true" >> $GITHUB_OUTPUT
104
+ echo "jira=false" >> $GITHUB_OUTPUT
105
+ echo "github=false" >> $GITHUB_OUTPUT
106
+ echo "✓ Using Sentry for issue tracking"
107
+ exit 0
108
+ fi
109
+
110
+ # Check for Jira (second priority)
111
+ if [ -n "${{ vars.JIRA_BASE_URL }}" ] && [ -n "${{ vars.JIRA_USER_EMAIL }}" ] && [ -n "${{ vars.JIRA_PROJECT_KEY }}" ] && [ -n "${{ secrets.JIRA_API_TOKEN }}" ]; then
112
+ echo "sentry=false" >> $GITHUB_OUTPUT
113
+ echo "jira=true" >> $GITHUB_OUTPUT
114
+ echo "github=false" >> $GITHUB_OUTPUT
115
+ echo "✓ Using Jira for issue tracking"
116
+ exit 0
117
+ fi
118
+
119
+ # Fall back to GitHub (always available)
120
+ echo "sentry=false" >> $GITHUB_OUTPUT
121
+ echo "jira=false" >> $GITHUB_OUTPUT
122
+ echo "github=true" >> $GITHUB_OUTPUT
123
+ echo "✓ Using GitHub Issues for issue tracking (fallback)"
124
+
125
+ # Create Sentry issue (if available)
126
+ create_sentry_issue:
127
+ name: 📌 Create Sentry Issue
128
+ needs: [dispatch]
129
+ if: ${{ needs.dispatch.outputs.use_sentry == 'true' }}
130
+ uses: ./.github/workflows/create-sentry-issue-on-failure.yml
131
+ with:
132
+ workflow_name: ${{ inputs.workflow_name }}
133
+ failed_job: ${{ inputs.failed_job }}
134
+ SENTRY_ORG: ${{ vars.SENTRY_ORG }}
135
+ SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
136
+ environment: ${{ inputs.environment }}
137
+ level: ${{ inputs.level }}
138
+ node_version: ${{ inputs.node_version }}
139
+ package_manager: ${{ inputs.package_manager }}
140
+ working_directory: ${{ inputs.working_directory }}
141
+ secrets:
142
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
143
+
144
+ # Create Jira issue (if available)
145
+ create_jira_issue:
146
+ name: 📌 Create Jira Issue
147
+ needs: [dispatch]
148
+ if: ${{ needs.dispatch.outputs.use_jira == 'true' }}
149
+ uses: ./.github/workflows/create-jira-issue-on-failure.yml
150
+ with:
151
+ workflow_name: ${{ inputs.workflow_name }}
152
+ failed_job: ${{ inputs.failed_job }}
153
+ issue_type: ${{ inputs.issue_type }}
154
+ JIRA_BASE_URL: ${{ vars.JIRA_BASE_URL }}
155
+ JIRA_USER_EMAIL: ${{ vars.JIRA_USER_EMAIL }}
156
+ JIRA_PROJECT_KEY: ${{ vars.JIRA_PROJECT_KEY }}
157
+ node_version: ${{ inputs.node_version }}
158
+ package_manager: ${{ inputs.package_manager }}
159
+ working_directory: ${{ inputs.working_directory }}
160
+ secrets:
161
+ JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
162
+
163
+ # Create GitHub issue (fallback)
164
+ create_github_issue:
165
+ name: 📌 Create GitHub Issue
166
+ needs: [dispatch]
167
+ if: ${{ needs.dispatch.outputs.use_github == 'true' }}
168
+ uses: ./.github/workflows/create-github-issue-on-failure.yml
169
+ with:
170
+ workflow_name: ${{ inputs.workflow_name }}
171
+ failed_job: ${{ inputs.failed_job }}
172
+ node_version: ${{ inputs.node_version }}
173
+ package_manager: ${{ inputs.package_manager }}
174
+ working_directory: ${{ inputs.working_directory }}
175
+ secrets:
176
+ PAT: ${{ secrets.PAT }}
@@ -1,3 +1,5 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
1
3
  # -----------------------------------------------------------------------------
2
4
  # Jira Issue Creation Workflow
3
5
  # -----------------------------------------------------------------------------
@@ -55,7 +57,7 @@ on:
55
57
  node_version:
56
58
  description: 'Node.js version to use'
57
59
  required: false
58
- default: '20.x'
60
+ default: '22.21.1'
59
61
  type: string
60
62
  package_manager:
61
63
  description: 'Package manager to use (npm, yarn, or bun)'
@@ -1,3 +1,5 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
1
3
  # -----------------------------------------------------------------------------
2
4
  # Sentry Issue Creation Workflow
3
5
  # -----------------------------------------------------------------------------
@@ -55,7 +57,7 @@ on:
55
57
  node_version:
56
58
  description: 'Node.js version to use'
57
59
  required: false
58
- default: '20.x'
60
+ default: '22.21.1'
59
61
  type: string
60
62
  package_manager:
61
63
  description: 'Package manager to use (npm, yarn, or bun)'
@@ -0,0 +1,40 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
3
+
4
+ name: 🐢 Slow Lint Rules
5
+
6
+ on:
7
+ schedule:
8
+ # Run nightly at 2 AM UTC
9
+ - cron: '0 2 * * *'
10
+ workflow_dispatch:
11
+ # Allow manual triggering
12
+
13
+ jobs:
14
+ lint-slow:
15
+ name: 🐢 Slow Lint Rules
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - name: 📥 Checkout
19
+ uses: actions/checkout@v4
20
+
21
+ - name: 📦 Setup Bun
22
+ uses: oven-sh/setup-bun@v2
23
+ with:
24
+ bun-version: latest
25
+
26
+ - name: 📦 Install dependencies
27
+ run: bun install --frozen-lockfile
28
+
29
+ - name: 🐢 Run slow lint rules
30
+ run: bun run lint:slow
31
+
32
+ create_issue_on_failure:
33
+ name: 📌 Create Issue on Failure
34
+ needs: [lint-slow]
35
+ if: ${{ failure() }}
36
+ uses: ./.github/workflows/create-issue-on-failure.yml
37
+ with:
38
+ workflow_name: 'Slow Lint Rules'
39
+ failed_job: 'lint-slow'
40
+ secrets: inherit
@@ -1,3 +1,5 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
1
3
  # -----------------------------------------------------------------------------
2
4
  # Quality Checks Workflow
3
5
  # -----------------------------------------------------------------------------
@@ -44,7 +46,7 @@ on:
44
46
  node_version:
45
47
  description: 'Node.js version to use'
46
48
  required: false
47
- default: '20.x'
49
+ default: '22.21.1'
48
50
  type: string
49
51
  package_manager:
50
52
  description: 'Package manager to use (npm, yarn, or bun)'
@@ -81,8 +83,18 @@ on:
81
83
  required: false
82
84
  default: false
83
85
  type: boolean
86
+ skip_dead_code:
87
+ description: 'Skip the dead code detection job (knip)'
88
+ required: false
89
+ default: false
90
+ type: boolean
91
+ skip_sg_scan:
92
+ description: 'Skip the ast-grep scan job'
93
+ required: false
94
+ default: false
95
+ type: boolean
84
96
  skip_jobs:
85
- description: 'Jobs to skip (comma-separated: lint,typecheck,test,test:unit,test:integration,test:e2e,maestro_e2e,playwright_e2e,format,build,npm_security_scan,github_issue)'
97
+ description: 'Jobs to skip (comma-separated: lint,typecheck,test,test:unit,test:integration,test:e2e,maestro_e2e,playwright_e2e,format,build,dead_code,sg_scan,npm_security_scan,github_issue)'
86
98
  required: false
87
99
  default: ''
88
100
  type: string
@@ -357,7 +369,7 @@ jobs:
357
369
  elif [ "${{ inputs.package_manager }}" = "yarn" ]; then
358
370
  yarn test
359
371
  elif [ "${{ inputs.package_manager }}" = "bun" ]; then
360
- bun test
372
+ bun run test
361
373
  fi
362
374
  working-directory: ${{ inputs.working_directory || '.' }}
363
375
 
@@ -795,6 +807,121 @@ jobs:
795
807
  retention-days: 1
796
808
  if-no-files-found: ignore
797
809
 
810
+ dead_code:
811
+ name: 🗑️ Dead Code Detection
812
+ runs-on: ubuntu-latest
813
+ timeout-minutes: 10
814
+ if: ${{ !inputs.skip_dead_code && !contains(inputs.skip_jobs, 'dead_code') }}
815
+
816
+ steps:
817
+ - name: 📥 Checkout repository
818
+ uses: actions/checkout@v4
819
+
820
+ - name: 🔧 Setup Node.js
821
+ uses: actions/setup-node@v4
822
+ with:
823
+ node-version: ${{ inputs.node_version }}
824
+ cache: ${{ inputs.package_manager != 'bun' && inputs.package_manager || '' }}
825
+
826
+ - name: 🍞 Setup Bun
827
+ if: inputs.package_manager == 'bun'
828
+ uses: oven-sh/setup-bun@v2
829
+ with:
830
+ bun-version: latest
831
+
832
+ - name: 📦 Install dependencies
833
+ run: |
834
+ if [ "${{ inputs.package_manager }}" = "npm" ]; then
835
+ npm ci
836
+ elif [ "${{ inputs.package_manager }}" = "yarn" ]; then
837
+ yarn install --frozen-lockfile
838
+ elif [ "${{ inputs.package_manager }}" = "bun" ]; then
839
+ bun install --frozen-lockfile
840
+ fi
841
+ working-directory: ${{ inputs.working_directory || '.' }}
842
+
843
+ - name: 🗑️ Run dead code detection (knip)
844
+ run: ${{ inputs.package_manager }} run knip
845
+ working-directory: ${{ inputs.working_directory || '.' }}
846
+
847
+ sg_scan:
848
+ name: 🔎 AST Grep Scan
849
+ runs-on: ubuntu-latest
850
+ timeout-minutes: 10
851
+ if: ${{ !inputs.skip_sg_scan && !contains(inputs.skip_jobs, 'sg_scan') }}
852
+
853
+ steps:
854
+ - name: 📥 Checkout repository
855
+ uses: actions/checkout@v4
856
+
857
+ - name: 🔧 Setup Node.js
858
+ uses: actions/setup-node@v4
859
+ with:
860
+ node-version: ${{ inputs.node_version }}
861
+ cache: ${{ inputs.package_manager != 'bun' && inputs.package_manager || '' }}
862
+
863
+ - name: 🍞 Setup Bun
864
+ if: inputs.package_manager == 'bun'
865
+ uses: oven-sh/setup-bun@v2
866
+ with:
867
+ bun-version: latest
868
+
869
+ - name: 📦 Install dependencies
870
+ run: |
871
+ if [ "${{ inputs.package_manager }}" = "npm" ]; then
872
+ npm ci
873
+ elif [ "${{ inputs.package_manager }}" = "yarn" ]; then
874
+ yarn install --frozen-lockfile
875
+ elif [ "${{ inputs.package_manager }}" = "bun" ]; then
876
+ bun install --frozen-lockfile
877
+ fi
878
+ working-directory: ${{ inputs.working_directory || '.' }}
879
+
880
+ - name: 🔍 Check for sgconfig.yml
881
+ id: check_config
882
+ run: |
883
+ if [ -f "sgconfig.yml" ]; then
884
+ echo "has_config=true" >> $GITHUB_OUTPUT
885
+ else
886
+ echo "has_config=false" >> $GITHUB_OUTPUT
887
+ fi
888
+ working-directory: ${{ inputs.working_directory || '.' }}
889
+
890
+ - name: 🔍 Check for ast-grep rules
891
+ id: check_rules
892
+ if: steps.check_config.outputs.has_config == 'true'
893
+ run: |
894
+ RULES_DIR="ast-grep/rules"
895
+ if [ -d "$RULES_DIR" ]; then
896
+ RULE_COUNT=$(find "$RULES_DIR" -name "*.yml" -o -name "*.yaml" 2>/dev/null | grep -v ".gitkeep" | wc -l | tr -d ' ')
897
+ if [ "$RULE_COUNT" -gt 0 ]; then
898
+ echo "has_rules=true" >> $GITHUB_OUTPUT
899
+ echo "rule_count=$RULE_COUNT" >> $GITHUB_OUTPUT
900
+ else
901
+ echo "has_rules=false" >> $GITHUB_OUTPUT
902
+ fi
903
+ else
904
+ echo "has_rules=false" >> $GITHUB_OUTPUT
905
+ fi
906
+ working-directory: ${{ inputs.working_directory || '.' }}
907
+
908
+ - name: 🔎 Run ast-grep scan
909
+ if: steps.check_config.outputs.has_config == 'true' && steps.check_rules.outputs.has_rules == 'true'
910
+ run: ${{ inputs.package_manager }} run sg:scan
911
+ working-directory: ${{ inputs.working_directory || '.' }}
912
+
913
+ - name: ⏭️ AST Grep Skipped (no config)
914
+ if: steps.check_config.outputs.has_config != 'true'
915
+ run: |
916
+ echo "::warning::ast-grep scan skipped - no sgconfig.yml found"
917
+ echo "To enable ast-grep scanning, add sgconfig.yml to your project root"
918
+
919
+ - name: ⏭️ AST Grep Skipped (no rules)
920
+ if: steps.check_config.outputs.has_config == 'true' && steps.check_rules.outputs.has_rules != 'true'
921
+ run: |
922
+ echo "::warning::ast-grep scan skipped - no rules defined in ast-grep/rules/"
923
+ echo "To enable ast-grep scanning, add rule YAML files to ast-grep/rules/"
924
+
798
925
  npm_security_scan:
799
926
  name: 🔒 Security Scan
800
927
  runs-on: ubuntu-latest
@@ -865,43 +992,18 @@ jobs:
865
992
  echo "::notice::No high or critical vulnerabilities found (excluding known false positives)"
866
993
  fi
867
994
  elif [ "${{ inputs.package_manager }}" = "bun" ]; then
868
- # Bun's 'bun pm scan' requires a configured scanner in bunfig.toml
869
- # Fall back to npm audit which works with package.json
870
- echo "::notice::Using npm audit fallback for bun projects"
871
-
872
- # npm audit requires a lockfile - generate temporary one if needed
873
- TEMP_LOCKFILE=false
874
- if [ ! -f "package-lock.json" ]; then
875
- echo "Generating temporary package-lock.json for audit..."
876
- npm i --package-lock-only --ignore-scripts --legacy-peer-deps --silent 2>/dev/null
877
- TEMP_LOCKFILE=true
878
- fi
995
+ # Excluding GHSA-5j98-mcp5-4vw2 (CVE-2025-64756): glob CLI command injection
996
+ # This vulnerability only affects the glob CLI (--cmd flag), not library usage
997
+ # We only use glob as a library through Babel and other tools - never invoke CLI
879
998
 
880
999
  # Excluding GHSA-8qq5-rm4j-mr97: node-tar path sanitization vulnerability
881
- # This is a nested dependency in @expo/cli that bun resolves to the patched version (7.5.3)
882
- # npm audit generates its own lockfile and doesn't respect bun's resolutions
883
- # Risk: None - bun.lock shows tar@7.5.3 is used, not the vulnerable version
884
- VULN_COUNT=$(npm audit --omit=dev --json 2>/dev/null | jq '
885
- .vulnerabilities | to_entries | map(select(
886
- .value.severity == "high" or .value.severity == "critical"
887
- )) | map(select(
888
- .value.via | all(. | if type == "object" then (.url == "https://github.com/advisories/GHSA-8qq5-rm4j-mr97" | not) else true end)
889
- )) | length
890
- ')
891
- if [ "$VULN_COUNT" -gt 0 ] 2>/dev/null; then
892
- exit_code=1
893
- fi
894
-
895
- # Clean up temporary lockfile
896
- if [ "$TEMP_LOCKFILE" = "true" ]; then
897
- rm -f package-lock.json
898
- fi
899
-
900
- if [ "${exit_code:-0}" -ne 0 ]; then
901
- echo "::warning::Found high or critical vulnerabilities (excluding known false positives)"
902
- exit $exit_code
1000
+ # Nested dependency in @expo/cli - bun resolves to patched version but audit still flags it
1001
+ # Risk: Low - only affects tar extraction with malicious filenames, not our use case
1002
+ if ! bun audit --audit-level=high --ignore GHSA-5j98-mcp5-4vw2 --ignore GHSA-8qq5-rm4j-mr97; then
1003
+ echo "::warning::Found high or critical vulnerabilities"
1004
+ exit 1
903
1005
  fi
904
- echo "::notice::No high or critical vulnerabilities found (excluding known false positives)"
1006
+ echo "::notice::No high or critical vulnerabilities found"
905
1007
  else
906
1008
  echo "Unsupported package manager: ${{ inputs.package_manager }}"
907
1009
  exit 1
@@ -1228,6 +1330,8 @@ jobs:
1228
1330
  playwright_e2e,
1229
1331
  format,
1230
1332
  build,
1333
+ dead_code,
1334
+ sg_scan,
1231
1335
  npm_security_scan,
1232
1336
  sonarcloud,
1233
1337
  snyk,
@@ -1438,6 +1542,8 @@ jobs:
1438
1542
  playwright_e2e,
1439
1543
  format,
1440
1544
  build,
1545
+ dead_code,
1546
+ sg_scan,
1441
1547
  npm_security_scan,
1442
1548
  sonarcloud,
1443
1549
  snyk,
@@ -1489,7 +1595,8 @@ jobs:
1489
1595
  maestro_e2e: '${{ needs.maestro_e2e.result }}',
1490
1596
  playwright_e2e: '${{ needs.playwright_e2e.result }}',
1491
1597
  format: '${{ needs.format.result }}',
1492
- build: '${{ needs.build.result }}'
1598
+ build: '${{ needs.build.result }}',
1599
+ sg_scan: '${{ needs.sg_scan.result }}'
1493
1600
  },
1494
1601
  security: {
1495
1602
  npm_audit: '${{ needs.npm_security_scan.result }}',
@@ -1647,6 +1754,8 @@ jobs:
1647
1754
  playwright_e2e,
1648
1755
  format,
1649
1756
  build,
1757
+ dead_code,
1758
+ sg_scan,
1650
1759
  npm_security_scan,
1651
1760
  sonarcloud,
1652
1761
  snyk,
@@ -1695,6 +1804,8 @@ jobs:
1695
1804
  echo "| Playwright E2E | ${{ needs.playwright_e2e.result }} | Quality |" >> $GITHUB_STEP_SUMMARY
1696
1805
  echo "| Format Check | ${{ needs.format.result }} | Quality |" >> $GITHUB_STEP_SUMMARY
1697
1806
  echo "| Build | ${{ needs.build.result }} | Build |" >> $GITHUB_STEP_SUMMARY
1807
+ echo "| Dead Code | ${{ needs.dead_code.result }} | Quality |" >> $GITHUB_STEP_SUMMARY
1808
+ echo "| AST Grep | ${{ needs.sg_scan.result }} | Quality |" >> $GITHUB_STEP_SUMMARY
1698
1809
  echo "| NPM Security | ${{ needs.npm_security_scan.result }} | Security |" >> $GITHUB_STEP_SUMMARY
1699
1810
  echo "| SonarCloud | ${{ needs.sonarcloud.result }} | Security |" >> $GITHUB_STEP_SUMMARY
1700
1811
  echo "| Snyk | ${{ needs.snyk.result }} | Security |" >> $GITHUB_STEP_SUMMARY
@@ -1722,6 +1833,8 @@ jobs:
1722
1833
  [ "${{ needs.maestro_e2e.result }}" != "skipped" ] && QUALITY_JOBS=$((QUALITY_JOBS + 1))
1723
1834
  [ "${{ needs.playwright_e2e.result }}" != "skipped" ] && QUALITY_JOBS=$((QUALITY_JOBS + 1))
1724
1835
  [ "${{ needs.format.result }}" != "skipped" ] && QUALITY_JOBS=$((QUALITY_JOBS + 1))
1836
+ [ "${{ needs.dead_code.result }}" != "skipped" ] && QUALITY_JOBS=$((QUALITY_JOBS + 1))
1837
+ [ "${{ needs.sg_scan.result }}" != "skipped" ] && QUALITY_JOBS=$((QUALITY_JOBS + 1))
1725
1838
 
1726
1839
  [ "${{ needs.sonarcloud.result }}" != "skipped" ] && SECURITY_JOBS=$((SECURITY_JOBS + 1))
1727
1840
  [ "${{ needs.snyk.result }}" != "skipped" ] && SECURITY_JOBS=$((SECURITY_JOBS + 1))
@@ -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: Enhanced Release Workflow v4 (with Enterprise Features)
2
5
 
3
6
  on:
@@ -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
  # CDK snapshot files contain asset hashes that can trigger false positives
2
5
  __tests__/infra/__snapshots__/sse-stream-stack.test.ts.snap:generic-api-key:380
3
6
  __tests__/infra/__snapshots__/sse-stream-stack.test.ts.snap:generic-api-key:398
@@ -0,0 +1,6 @@
1
+ {
2
+ "*.{js,mjs,ts,tsx}": ["eslint --quiet --cache --fix", "ast-grep scan"],
3
+ "*.{json,mjs,js,ts,jsx,tsx,html,md,mdx,css,scss,yaml,yml,graphql}": [
4
+ "prettier --write"
5
+ ]
6
+ }
@@ -1,4 +1,5 @@
1
-
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
2
3
 
3
4
  node_modules/**/*
4
5
  .serverless/**/*
@@ -1,3 +1,5 @@
1
+ # This file is managed by Lisa.
2
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
1
3
  ---
2
4
  extends: default
3
5
 
@@ -0,0 +1,3 @@
1
+ # This directory contains test cases for ast-grep rules.
2
+ # Each test file should match its corresponding rule file name.
3
+ # See: https://ast-grep.github.io/reference/yaml.html#rule-tests
@@ -0,0 +1,3 @@
1
+ # This directory contains ast-grep rules for the project.
2
+ # Add your rule YAML files here.
3
+ # See: https://ast-grep.github.io/reference/yaml.html
@@ -0,0 +1,3 @@
1
+ # This directory contains shared utility rules for ast-grep.
2
+ # Add reusable rule fragments here.
3
+ # See: https://ast-grep.github.io/reference/sgconfig.html#utildirs
@@ -1,3 +1,8 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
1
6
  module.exports = {
2
7
  extends: ["@commitlint/config-conventional"],
3
8
  rules: {
@@ -1,3 +1,8 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
1
6
  /* eslint-disable max-lines -- comprehensive test coverage requires extensive test cases */
2
7
  /**
3
8
  * Tests for enforce-statement-order ESLint rule
@@ -1,3 +1,8 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
1
6
  /**
2
7
  * ESLint plugin for code organization standards
3
8
  *
@@ -1,3 +1,8 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
1
6
  /**
2
7
  * ESLint rule to enforce statement order in all functions
3
8
  *