@sun-asterisk/sungen 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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +490 -0
  3. package/bin/sungen.js +12 -0
  4. package/dist/cli/commands/auto-tag-command.d.ts +8 -0
  5. package/dist/cli/commands/auto-tag-command.d.ts.map +1 -0
  6. package/dist/cli/commands/auto-tag-command.js +104 -0
  7. package/dist/cli/commands/auto-tag-command.js.map +1 -0
  8. package/dist/cli/index.d.ts +7 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +196 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/config/ai-providers.yaml +56 -0
  13. package/dist/config/config-loader.d.ts +51 -0
  14. package/dist/config/config-loader.d.ts.map +1 -0
  15. package/dist/config/config-loader.js +216 -0
  16. package/dist/config/config-loader.js.map +1 -0
  17. package/dist/config/config-schema.d.ts +121 -0
  18. package/dist/config/config-schema.d.ts.map +1 -0
  19. package/dist/config/config-schema.js +7 -0
  20. package/dist/config/config-schema.js.map +1 -0
  21. package/dist/config/default.config.yaml +101 -0
  22. package/dist/config/framework.config.yaml +52 -0
  23. package/dist/config/routes.yaml +31 -0
  24. package/dist/core/selector-base/annotation-handler.d.ts +45 -0
  25. package/dist/core/selector-base/annotation-handler.d.ts.map +1 -0
  26. package/dist/core/selector-base/annotation-handler.js +102 -0
  27. package/dist/core/selector-base/annotation-handler.js.map +1 -0
  28. package/dist/core/selector-base/base-generator.d.ts +49 -0
  29. package/dist/core/selector-base/base-generator.d.ts.map +1 -0
  30. package/dist/core/selector-base/base-generator.js +214 -0
  31. package/dist/core/selector-base/base-generator.js.map +1 -0
  32. package/dist/core/selector-base/gherkin-parser.d.ts +24 -0
  33. package/dist/core/selector-base/gherkin-parser.d.ts.map +1 -0
  34. package/dist/core/selector-base/gherkin-parser.js +42 -0
  35. package/dist/core/selector-base/gherkin-parser.js.map +1 -0
  36. package/dist/core/selector-mapper/priority-mapper.d.ts +74 -0
  37. package/dist/core/selector-mapper/priority-mapper.d.ts.map +1 -0
  38. package/dist/core/selector-mapper/priority-mapper.js +477 -0
  39. package/dist/core/selector-mapper/priority-mapper.js.map +1 -0
  40. package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +91 -0
  41. package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +1 -0
  42. package/dist/core/ui-scanner/heuristics/base-heuristic.js +175 -0
  43. package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +1 -0
  44. package/dist/core/ui-scanner/react-scanner.d.ts +32 -0
  45. package/dist/core/ui-scanner/react-scanner.d.ts.map +1 -0
  46. package/dist/core/ui-scanner/react-scanner.js +163 -0
  47. package/dist/core/ui-scanner/react-scanner.js.map +1 -0
  48. package/dist/core/ui-scanner/scanner-interface.d.ts +94 -0
  49. package/dist/core/ui-scanner/scanner-interface.d.ts.map +1 -0
  50. package/dist/core/ui-scanner/scanner-interface.js +33 -0
  51. package/dist/core/ui-scanner/scanner-interface.js.map +1 -0
  52. package/dist/core/ui-scanner/strict-scanner.d.ts +81 -0
  53. package/dist/core/ui-scanner/strict-scanner.d.ts.map +1 -0
  54. package/dist/core/ui-scanner/strict-scanner.js +511 -0
  55. package/dist/core/ui-scanner/strict-scanner.js.map +1 -0
  56. package/dist/executor/playwright/playwright-generator.d.ts +33 -0
  57. package/dist/executor/playwright/playwright-generator.d.ts.map +1 -0
  58. package/dist/executor/playwright/playwright-generator.js +136 -0
  59. package/dist/executor/playwright/playwright-generator.js.map +1 -0
  60. package/dist/executor/test-generator.d.ts +63 -0
  61. package/dist/executor/test-generator.d.ts.map +1 -0
  62. package/dist/executor/test-generator.js +30 -0
  63. package/dist/executor/test-generator.js.map +1 -0
  64. package/dist/external/ai-provider.d.ts +60 -0
  65. package/dist/external/ai-provider.d.ts.map +1 -0
  66. package/dist/external/ai-provider.js +30 -0
  67. package/dist/external/ai-provider.js.map +1 -0
  68. package/dist/external/anthropic-provider.d.ts +29 -0
  69. package/dist/external/anthropic-provider.d.ts.map +1 -0
  70. package/dist/external/anthropic-provider.js +85 -0
  71. package/dist/external/anthropic-provider.js.map +1 -0
  72. package/dist/generators/cache/cache-manager.d.ts +66 -0
  73. package/dist/generators/cache/cache-manager.d.ts.map +1 -0
  74. package/dist/generators/cache/cache-manager.js +286 -0
  75. package/dist/generators/cache/cache-manager.js.map +1 -0
  76. package/dist/generators/cli.d.ts +7 -0
  77. package/dist/generators/cli.d.ts.map +1 -0
  78. package/dist/generators/cli.js +570 -0
  79. package/dist/generators/cli.js.map +1 -0
  80. package/dist/generators/dsl-writer/index.d.ts +33 -0
  81. package/dist/generators/dsl-writer/index.d.ts.map +1 -0
  82. package/dist/generators/dsl-writer/index.js +226 -0
  83. package/dist/generators/dsl-writer/index.js.map +1 -0
  84. package/dist/generators/gherkin-parser/index.d.ts +47 -0
  85. package/dist/generators/gherkin-parser/index.d.ts.map +1 -0
  86. package/dist/generators/gherkin-parser/index.js +149 -0
  87. package/dist/generators/gherkin-parser/index.js.map +1 -0
  88. package/dist/generators/gherkin-parser/selector-extractor.d.ts +37 -0
  89. package/dist/generators/gherkin-parser/selector-extractor.d.ts.map +1 -0
  90. package/dist/generators/gherkin-parser/selector-extractor.js +108 -0
  91. package/dist/generators/gherkin-parser/selector-extractor.js.map +1 -0
  92. package/dist/generators/scaffold-generator/index.d.ts +111 -0
  93. package/dist/generators/scaffold-generator/index.d.ts.map +1 -0
  94. package/dist/generators/scaffold-generator/index.js +408 -0
  95. package/dist/generators/scaffold-generator/index.js.map +1 -0
  96. package/dist/generators/selector-mapper/ai-mapper.d.ts +56 -0
  97. package/dist/generators/selector-mapper/ai-mapper.d.ts.map +1 -0
  98. package/dist/generators/selector-mapper/ai-mapper.js +457 -0
  99. package/dist/generators/selector-mapper/ai-mapper.js.map +1 -0
  100. package/dist/generators/selector-mapper/hybrid-mapper.d.ts +67 -0
  101. package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +1 -0
  102. package/dist/generators/selector-mapper/hybrid-mapper.js +349 -0
  103. package/dist/generators/selector-mapper/hybrid-mapper.js.map +1 -0
  104. package/dist/generators/selector-mapper/index.d.ts +8 -0
  105. package/dist/generators/selector-mapper/index.d.ts.map +1 -0
  106. package/dist/generators/selector-mapper/index.js +12 -0
  107. package/dist/generators/selector-mapper/index.js.map +1 -0
  108. package/dist/generators/selector-mapper/intelligent-mapper.d.ts +125 -0
  109. package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +1 -0
  110. package/dist/generators/selector-mapper/intelligent-mapper.js +391 -0
  111. package/dist/generators/selector-mapper/intelligent-mapper.js.map +1 -0
  112. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +49 -0
  113. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -0
  114. package/dist/generators/test-generator/adapters/adapter-interface.js +7 -0
  115. package/dist/generators/test-generator/adapters/adapter-interface.js.map +1 -0
  116. package/dist/generators/test-generator/adapters/adapter-registry.d.ts +29 -0
  117. package/dist/generators/test-generator/adapters/adapter-registry.d.ts.map +1 -0
  118. package/dist/generators/test-generator/adapters/adapter-registry.js +50 -0
  119. package/dist/generators/test-generator/adapters/adapter-registry.js.map +1 -0
  120. package/dist/generators/test-generator/adapters/index.d.ts +4 -0
  121. package/dist/generators/test-generator/adapters/index.d.ts.map +1 -0
  122. package/dist/generators/test-generator/adapters/index.js +13 -0
  123. package/dist/generators/test-generator/adapters/index.js.map +1 -0
  124. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +23 -0
  125. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -0
  126. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js +38 -0
  127. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -0
  128. package/dist/generators/test-generator/adapters/playwright/templates/before-each.hbs +8 -0
  129. package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +5 -0
  130. package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +8 -0
  131. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/check-action.hbs +1 -0
  132. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/clear-action.hbs +1 -0
  133. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -0
  134. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/double-click-action.hbs +1 -0
  135. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -0
  136. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/hover-action.hbs +1 -0
  137. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/press-action.hbs +1 -0
  138. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -0
  139. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/uncheck-action.hbs +1 -0
  140. package/dist/generators/test-generator/adapters/playwright/templates/steps/active-state-assertion.hbs +2 -0
  141. package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-selector.hbs +5 -0
  142. package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-simple.hbs +1 -0
  143. package/dist/generators/test-generator/adapters/playwright/templates/steps/application-running.hbs +1 -0
  144. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +1 -0
  145. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -0
  146. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +1 -0
  147. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -0
  148. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -0
  149. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -0
  150. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +1 -0
  151. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +1 -0
  152. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +1 -0
  153. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-visible-assertion.hbs +1 -0
  154. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +1 -0
  155. package/dist/generators/test-generator/adapters/playwright/templates/steps/check-action.hbs +1 -0
  156. package/dist/generators/test-generator/adapters/playwright/templates/steps/checkbox.hbs +2 -0
  157. package/dist/generators/test-generator/adapters/playwright/templates/steps/checked-assertion.hbs +1 -0
  158. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-action.hbs +1 -0
  159. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-auth.hbs +6 -0
  160. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-browser-state.hbs +6 -0
  161. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-database.hbs +4 -0
  162. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear.hbs +2 -0
  163. package/dist/generators/test-generator/adapters/playwright/templates/steps/click-action.hbs +1 -0
  164. package/dist/generators/test-generator/adapters/playwright/templates/steps/click.hbs +2 -0
  165. package/dist/generators/test-generator/adapters/playwright/templates/steps/contain-text-assertion.hbs +1 -0
  166. package/dist/generators/test-generator/adapters/playwright/templates/steps/contains-text-assertion.hbs +2 -0
  167. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-assertion.hbs +1 -0
  168. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-greater-than.hbs +3 -0
  169. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-less-than.hbs +3 -0
  170. package/dist/generators/test-generator/adapters/playwright/templates/steps/disabled-assertion.hbs +2 -0
  171. package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-containing-text.hbs +3 -0
  172. package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-with-text.hbs +3 -0
  173. package/dist/generators/test-generator/adapters/playwright/templates/steps/double-click-action.hbs +1 -0
  174. package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion-advanced.hbs +3 -0
  175. package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion.hbs +2 -0
  176. package/dist/generators/test-generator/adapters/playwright/templates/steps/enabled-assertion.hbs +2 -0
  177. package/dist/generators/test-generator/adapters/playwright/templates/steps/error-message-assertion.hbs +3 -0
  178. package/dist/generators/test-generator/adapters/playwright/templates/steps/fill-action.hbs +1 -0
  179. package/dist/generators/test-generator/adapters/playwright/templates/steps/fill.hbs +2 -0
  180. package/dist/generators/test-generator/adapters/playwright/templates/steps/focused-assertion.hbs +1 -0
  181. package/dist/generators/test-generator/adapters/playwright/templates/steps/generic-message-assertion.hbs +3 -0
  182. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-attribute.hbs +2 -0
  183. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-class.hbs +2 -0
  184. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-count.hbs +2 -0
  185. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-image-src.hbs +3 -0
  186. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-link.hbs +3 -0
  187. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-placeholder.hbs +3 -0
  188. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-value.hbs +2 -0
  189. package/dist/generators/test-generator/adapters/playwright/templates/steps/have-text-assertion.hbs +1 -0
  190. package/dist/generators/test-generator/adapters/playwright/templates/steps/hover-action.hbs +1 -0
  191. package/dist/generators/test-generator/adapters/playwright/templates/steps/html5-validation-check.hbs +4 -0
  192. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-checked.hbs +2 -0
  193. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-editable.hbs +2 -0
  194. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-focused.hbs +2 -0
  195. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-hidden.hbs +2 -0
  196. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-unchecked.hbs +2 -0
  197. package/dist/generators/test-generator/adapters/playwright/templates/steps/locator.hbs +1 -0
  198. package/dist/generators/test-generator/adapters/playwright/templates/steps/login.hbs +8 -0
  199. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-body.hbs +1 -0
  200. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-selector.hbs +2 -0
  201. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-count-assertion.hbs +3 -0
  202. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -0
  203. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +2 -0
  204. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -0
  205. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -0
  206. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation.hbs +1 -0
  207. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-checked-assertion.hbs +1 -0
  208. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible-assertion.hbs +1 -0
  209. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible.hbs +2 -0
  210. package/dist/generators/test-generator/adapters/playwright/templates/steps/notification-assertion.hbs +4 -0
  211. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -0
  212. package/dist/generators/test-generator/adapters/playwright/templates/steps/press-action.hbs +1 -0
  213. package/dist/generators/test-generator/adapters/playwright/templates/steps/press-enter.hbs +2 -0
  214. package/dist/generators/test-generator/adapters/playwright/templates/steps/redirect-assertion.hbs +3 -0
  215. package/dist/generators/test-generator/adapters/playwright/templates/steps/route-assertion.hbs +2 -0
  216. package/dist/generators/test-generator/adapters/playwright/templates/steps/screen-navigation.hbs +3 -0
  217. package/dist/generators/test-generator/adapters/playwright/templates/steps/scroll-bottom-assertion.hbs +5 -0
  218. package/dist/generators/test-generator/adapters/playwright/templates/steps/select-action.hbs +1 -0
  219. package/dist/generators/test-generator/adapters/playwright/templates/steps/select.hbs +2 -0
  220. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/application-running.hbs +1 -0
  221. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-auth.hbs +6 -0
  222. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-browser-state.hbs +6 -0
  223. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-database.hbs +4 -0
  224. package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/user-login-todo.hbs +6 -0
  225. package/dist/generators/test-generator/adapters/playwright/templates/steps/text-matches-pattern.hbs +3 -0
  226. package/dist/generators/test-generator/adapters/playwright/templates/steps/uncheck-action.hbs +1 -0
  227. package/dist/generators/test-generator/adapters/playwright/templates/steps/user-login-todo.hbs +6 -0
  228. package/dist/generators/test-generator/adapters/playwright/templates/steps/visibility-assertion.hbs +2 -0
  229. package/dist/generators/test-generator/adapters/playwright/templates/steps/visible-assertion.hbs +1 -0
  230. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-for-element.hbs +1 -0
  231. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-timeout.hbs +1 -0
  232. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait.hbs +1 -0
  233. package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +19 -0
  234. package/dist/generators/test-generator/ai-step-mapper.d.ts +27 -0
  235. package/dist/generators/test-generator/ai-step-mapper.d.ts.map +1 -0
  236. package/dist/generators/test-generator/ai-step-mapper.js +204 -0
  237. package/dist/generators/test-generator/ai-step-mapper.js.map +1 -0
  238. package/dist/generators/test-generator/code-generator.d.ts +52 -0
  239. package/dist/generators/test-generator/code-generator.d.ts.map +1 -0
  240. package/dist/generators/test-generator/code-generator.js +191 -0
  241. package/dist/generators/test-generator/code-generator.js.map +1 -0
  242. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts +7 -0
  243. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -0
  244. package/dist/generators/test-generator/patterns/assertion-patterns.js +173 -0
  245. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -0
  246. package/dist/generators/test-generator/patterns/form-patterns.d.ts +8 -0
  247. package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -0
  248. package/dist/generators/test-generator/patterns/form-patterns.js +110 -0
  249. package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -0
  250. package/dist/generators/test-generator/patterns/index.d.ts +45 -0
  251. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -0
  252. package/dist/generators/test-generator/patterns/index.js +106 -0
  253. package/dist/generators/test-generator/patterns/index.js.map +1 -0
  254. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +7 -0
  255. package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -0
  256. package/dist/generators/test-generator/patterns/interaction-patterns.js +100 -0
  257. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -0
  258. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +8 -0
  259. package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -0
  260. package/dist/generators/test-generator/patterns/navigation-patterns.js +92 -0
  261. package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -0
  262. package/dist/generators/test-generator/patterns/setup-patterns.d.ts +7 -0
  263. package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -0
  264. package/dist/generators/test-generator/patterns/setup-patterns.js +84 -0
  265. package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -0
  266. package/dist/generators/test-generator/patterns/types.d.ts +38 -0
  267. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -0
  268. package/dist/generators/test-generator/patterns/types.js +3 -0
  269. package/dist/generators/test-generator/patterns/types.js.map +1 -0
  270. package/dist/generators/test-generator/step-mapper-old.d.ts +180 -0
  271. package/dist/generators/test-generator/step-mapper-old.d.ts.map +1 -0
  272. package/dist/generators/test-generator/step-mapper-old.js +752 -0
  273. package/dist/generators/test-generator/step-mapper-old.js.map +1 -0
  274. package/dist/generators/test-generator/step-mapper-refactored.d.ts +47 -0
  275. package/dist/generators/test-generator/step-mapper-refactored.d.ts.map +1 -0
  276. package/dist/generators/test-generator/step-mapper-refactored.js +182 -0
  277. package/dist/generators/test-generator/step-mapper-refactored.js.map +1 -0
  278. package/dist/generators/test-generator/step-mapper.d.ts +66 -0
  279. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -0
  280. package/dist/generators/test-generator/step-mapper.js +248 -0
  281. package/dist/generators/test-generator/step-mapper.js.map +1 -0
  282. package/dist/generators/test-generator/template-engine.d.ts +33 -0
  283. package/dist/generators/test-generator/template-engine.d.ts.map +1 -0
  284. package/dist/generators/test-generator/template-engine.js +129 -0
  285. package/dist/generators/test-generator/template-engine.js.map +1 -0
  286. package/dist/generators/test-generator/utils/data-resolver.d.ts +39 -0
  287. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -0
  288. package/dist/generators/test-generator/utils/data-resolver.js +162 -0
  289. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -0
  290. package/dist/generators/test-generator/utils/path-inference.d.ts +49 -0
  291. package/dist/generators/test-generator/utils/path-inference.d.ts.map +1 -0
  292. package/dist/generators/test-generator/utils/path-inference.js +286 -0
  293. package/dist/generators/test-generator/utils/path-inference.js.map +1 -0
  294. package/dist/generators/test-generator/utils/selector-resolver.d.ts +93 -0
  295. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -0
  296. package/dist/generators/test-generator/utils/selector-resolver.js +408 -0
  297. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -0
  298. package/dist/generators/types.d.ts +118 -0
  299. package/dist/generators/types.d.ts.map +1 -0
  300. package/dist/generators/types.js +48 -0
  301. package/dist/generators/types.js.map +1 -0
  302. package/dist/generators/ui-model-builder/deep-scanner.d.ts +121 -0
  303. package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +1 -0
  304. package/dist/generators/ui-model-builder/deep-scanner.js +1113 -0
  305. package/dist/generators/ui-model-builder/deep-scanner.js.map +1 -0
  306. package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +110 -0
  307. package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +1 -0
  308. package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +608 -0
  309. package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +1 -0
  310. package/dist/generators/ui-model-builder/react-scanner.d.ts +107 -0
  311. package/dist/generators/ui-model-builder/react-scanner.d.ts.map +1 -0
  312. package/dist/generators/ui-model-builder/react-scanner.js +797 -0
  313. package/dist/generators/ui-model-builder/react-scanner.js.map +1 -0
  314. package/dist/input/cli-adapter.d.ts +63 -0
  315. package/dist/input/cli-adapter.d.ts.map +1 -0
  316. package/dist/input/cli-adapter.js +173 -0
  317. package/dist/input/cli-adapter.js.map +1 -0
  318. package/dist/input/config-adapter.d.ts +25 -0
  319. package/dist/input/config-adapter.d.ts.map +1 -0
  320. package/dist/input/config-adapter.js +70 -0
  321. package/dist/input/config-adapter.js.map +1 -0
  322. package/dist/input/input-adapter.d.ts +28 -0
  323. package/dist/input/input-adapter.d.ts.map +1 -0
  324. package/dist/input/input-adapter.js +17 -0
  325. package/dist/input/input-adapter.js.map +1 -0
  326. package/dist/input/vscode-adapter.d.ts +62 -0
  327. package/dist/input/vscode-adapter.d.ts.map +1 -0
  328. package/dist/input/vscode-adapter.js +64 -0
  329. package/dist/input/vscode-adapter.js.map +1 -0
  330. package/dist/orchestrator/cache-manager.d.ts +37 -0
  331. package/dist/orchestrator/cache-manager.d.ts.map +1 -0
  332. package/dist/orchestrator/cache-manager.js +148 -0
  333. package/dist/orchestrator/cache-manager.js.map +1 -0
  334. package/dist/orchestrator/pipeline.d.ts +73 -0
  335. package/dist/orchestrator/pipeline.d.ts.map +1 -0
  336. package/dist/orchestrator/pipeline.js +607 -0
  337. package/dist/orchestrator/pipeline.js.map +1 -0
  338. package/dist/orchestrator/project-initializer.d.ts +51 -0
  339. package/dist/orchestrator/project-initializer.d.ts.map +1 -0
  340. package/dist/orchestrator/project-initializer.js +326 -0
  341. package/dist/orchestrator/project-initializer.js.map +1 -0
  342. package/dist/orchestrator/reporter.d.ts +15 -0
  343. package/dist/orchestrator/reporter.d.ts.map +1 -0
  344. package/dist/orchestrator/reporter.js +30 -0
  345. package/dist/orchestrator/reporter.js.map +1 -0
  346. package/dist/orchestrator/screen-manager.d.ts +47 -0
  347. package/dist/orchestrator/screen-manager.d.ts.map +1 -0
  348. package/dist/orchestrator/screen-manager.js +271 -0
  349. package/dist/orchestrator/screen-manager.js.map +1 -0
  350. package/dist/tools/auto-tagger.d.ts +107 -0
  351. package/dist/tools/auto-tagger.d.ts.map +1 -0
  352. package/dist/tools/auto-tagger.js +502 -0
  353. package/dist/tools/auto-tagger.js.map +1 -0
  354. package/package.json +73 -0
  355. package/src/cli/commands/auto-tag-command.ts +80 -0
  356. package/src/cli/index.ts +205 -0
  357. package/src/config/ai-providers.yaml +56 -0
  358. package/src/config/config-loader.ts +248 -0
  359. package/src/config/config-schema.ts +148 -0
  360. package/src/config/default.config.yaml +101 -0
  361. package/src/config/framework.config.yaml +52 -0
  362. package/src/config/routes.yaml +31 -0
  363. package/src/core/selector-base/annotation-handler.ts +127 -0
  364. package/src/core/selector-base/base-generator.ts +234 -0
  365. package/src/core/selector-base/gherkin-parser.ts +57 -0
  366. package/src/core/selector-mapper/priority-mapper.ts +607 -0
  367. package/src/core/ui-scanner/heuristics/base-heuristic.ts +216 -0
  368. package/src/core/ui-scanner/react-scanner.ts +156 -0
  369. package/src/core/ui-scanner/scanner-interface.ts +133 -0
  370. package/src/core/ui-scanner/strict-scanner.ts +629 -0
  371. package/src/executor/playwright/playwright-generator.ts +125 -0
  372. package/src/executor/test-generator.ts +90 -0
  373. package/src/external/ai-provider.ts +90 -0
  374. package/src/external/anthropic-provider.ts +114 -0
  375. package/src/generators/README.md +410 -0
  376. package/src/generators/cache/cache-manager.ts +322 -0
  377. package/src/generators/cli.ts +640 -0
  378. package/src/generators/dsl-writer/index.ts +253 -0
  379. package/src/generators/gherkin-parser/index.ts +155 -0
  380. package/src/generators/gherkin-parser/selector-extractor.ts +142 -0
  381. package/src/generators/scaffold-generator/index.ts +524 -0
  382. package/src/generators/selector-mapper/ai-mapper.ts +528 -0
  383. package/src/generators/selector-mapper/hybrid-mapper.ts +427 -0
  384. package/src/generators/selector-mapper/index.ts +10 -0
  385. package/src/generators/selector-mapper/intelligent-mapper.ts +530 -0
  386. package/src/generators/test-generator/adapters/adapter-interface.ts +49 -0
  387. package/src/generators/test-generator/adapters/adapter-registry.ts +56 -0
  388. package/src/generators/test-generator/adapters/index.ts +9 -0
  389. package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +40 -0
  390. package/src/generators/test-generator/adapters/playwright/templates/before-each.hbs +8 -0
  391. package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +5 -0
  392. package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +8 -0
  393. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/check-action.hbs +1 -0
  394. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/clear-action.hbs +1 -0
  395. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -0
  396. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/double-click-action.hbs +1 -0
  397. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -0
  398. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/hover-action.hbs +1 -0
  399. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/press-action.hbs +1 -0
  400. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -0
  401. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/uncheck-action.hbs +1 -0
  402. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +1 -0
  403. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -0
  404. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +1 -0
  405. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -0
  406. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -0
  407. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -0
  408. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +1 -0
  409. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +1 -0
  410. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +1 -0
  411. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-visible-assertion.hbs +1 -0
  412. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +1 -0
  413. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -0
  414. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +2 -0
  415. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -0
  416. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -0
  417. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -0
  418. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/application-running.hbs +1 -0
  419. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-auth.hbs +6 -0
  420. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-browser-state.hbs +6 -0
  421. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-database.hbs +4 -0
  422. package/src/generators/test-generator/adapters/playwright/templates/steps/setup/user-login-todo.hbs +6 -0
  423. package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +19 -0
  424. package/src/generators/test-generator/ai-step-mapper.ts +224 -0
  425. package/src/generators/test-generator/code-generator.ts +235 -0
  426. package/src/generators/test-generator/patterns/assertion-patterns.ts +183 -0
  427. package/src/generators/test-generator/patterns/form-patterns.ts +124 -0
  428. package/src/generators/test-generator/patterns/index.ts +97 -0
  429. package/src/generators/test-generator/patterns/interaction-patterns.ts +119 -0
  430. package/src/generators/test-generator/patterns/navigation-patterns.ts +110 -0
  431. package/src/generators/test-generator/patterns/setup-patterns.ts +94 -0
  432. package/src/generators/test-generator/patterns/types.ts +41 -0
  433. package/src/generators/test-generator/step-mapper.ts +254 -0
  434. package/src/generators/test-generator/template-engine.ts +160 -0
  435. package/src/generators/test-generator/utils/data-resolver.ts +147 -0
  436. package/src/generators/test-generator/utils/path-inference.ts +344 -0
  437. package/src/generators/test-generator/utils/selector-resolver.ts +480 -0
  438. package/src/generators/types.ts +226 -0
  439. package/src/generators/ui-model-builder/deep-scanner.ts +1244 -0
  440. package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +731 -0
  441. package/src/generators/ui-model-builder/react-scanner.ts +959 -0
  442. package/src/input/cli-adapter.ts +185 -0
  443. package/src/input/config-adapter.ts +71 -0
  444. package/src/input/input-adapter.ts +32 -0
  445. package/src/input/vscode-adapter.ts +90 -0
  446. package/src/orchestrator/cache-manager.ts +138 -0
  447. package/src/orchestrator/pipeline.ts +713 -0
  448. package/src/orchestrator/project-initializer.ts +315 -0
  449. package/src/orchestrator/reporter.ts +36 -0
  450. package/src/orchestrator/screen-manager.ts +268 -0
  451. package/src/tools/auto-tagger.ts +572 -0
@@ -0,0 +1,101 @@
1
+ # AI-Native E2E Test Framework - Default Configuration
2
+ # This file contains default settings for the framework
3
+ # Override values via CLI flags or custom config files
4
+
5
+ # General settings
6
+ version: "1.0.0"
7
+ verbose: false
8
+ force: false # Force regeneration, bypass cache
9
+
10
+ # Paths
11
+ paths:
12
+ sourceRoot: "app"
13
+ featuresDir: "qa/features"
14
+ testDataDir: "qa/test-data"
15
+ uiModelsDir: "qa/ui-models"
16
+ selectorsDir: "qa/selectors"
17
+ specsDir: "specs/generated"
18
+ cacheDir: ".cache"
19
+
20
+ # UI Scanner configuration
21
+ scanner:
22
+ framework: "react" # react, vue, angular
23
+ maxDepth: 999 # Component scan depth (999 = unlimited)
24
+ includePatterns:
25
+ - "src/**/*.tsx"
26
+ - "src/**/*.jsx"
27
+ excludePatterns:
28
+ - "node_modules/**"
29
+ - "**/*.test.*"
30
+ - "**/*.spec.*"
31
+
32
+ # Selector mapping configuration
33
+ selectorMapping:
34
+ mode: "hybrid" # hybrid, ai-only, heuristic-only
35
+ aiProvider: "anthropic" # anthropic, copilot, openai
36
+ model: "claude-sonnet-4-5-20250929"
37
+ maxTokens: 4000
38
+ temperature: 0
39
+ enableOverride: true # Support manual .override.yaml files
40
+ heuristicFirst: true # Try heuristics before AI (hybrid mode)
41
+ minHeuristicConfidence: 0.8 # Min confidence to use heuristic (0.0-1.0)
42
+
43
+ # Gherkin annotations (for selector base generation)
44
+ annotations:
45
+ selectorId:
46
+ pattern: "\\[([a-z0-9-]+\\.[a-z0-9-]+)\\]"
47
+ description: "Element selector ID, e.g., [chat.input]"
48
+
49
+ dataRef:
50
+ pattern: "<([a-z0-9_\\.]+)>"
51
+ description: "Test data reference, e.g., <user.email>"
52
+
53
+ ignore:
54
+ pattern: "# @ignore"
55
+ description: "Ignore step in generation"
56
+
57
+ ignoreTestCase:
58
+ pattern: "# @ignore-testcase"
59
+ description: "Ignore entire test case (scenario)"
60
+
61
+ skipProduction:
62
+ pattern: "# @skip-production"
63
+ description: "Skip test in production environment"
64
+
65
+ # Test generation configuration
66
+ testGenerator:
67
+ framework: "playwright" # playwright, appium, integration
68
+ aiProvider: "anthropic" # anthropic, copilot, openai
69
+ model: "claude-3-5-haiku-20241022"
70
+ maxTokens: 500
71
+ temperature: 0
72
+ enableAIFallback: false # Enable AI for unknown patterns (--ai-mapper flag)
73
+ dictionaryPath: "qa/executor/playwright/dictionary.yaml"
74
+
75
+ # Cache configuration
76
+ cache:
77
+ enabled: true
78
+ ttl: 86400 # 24 hours in seconds
79
+ invalidateOnSourceChange: true
80
+ invalidateOnConfigChange: true
81
+
82
+ # External API configuration
83
+ apis:
84
+ anthropic:
85
+ baseURL: "https://api.anthropic.com"
86
+ apiKeyEnv: "ANTHROPIC_API_KEY"
87
+ timeout: 30000 # 30 seconds
88
+
89
+ openai:
90
+ baseURL: "https://api.openai.com"
91
+ apiKeyEnv: "OPENAI_API_KEY"
92
+ timeout: 30000
93
+
94
+ copilot:
95
+ # Will be configured via VS Code extension
96
+ enabled: false
97
+
98
+ # Application configuration (for E2E tests)
99
+ app:
100
+ baseURL: "http://localhost:3000"
101
+ timeout: 30000 # Default timeout for test actions
@@ -0,0 +1,52 @@
1
+ # QA Automation Framework Configuration
2
+
3
+ # AI Provider Settings
4
+ ai:
5
+ provider: "claude" # claude | openai | gemini
6
+ model: "claude-3-haiku-20240307"
7
+ temperature: 0.2
8
+ maxTokens: 2048
9
+
10
+ # Selector Discovery Settings
11
+ selectors:
12
+ autoDiscovery: false # Enable in Phase 2
13
+ selfHealing: false # Enable in Phase 2
14
+ confidenceThreshold: 0.8
15
+ defaultTimeout: 30000 # 30 seconds
16
+
17
+ # Caching Settings
18
+ caching:
19
+ enabled: true
20
+ ttl: 86400 # 24 hours in seconds
21
+ directory: ".cache/flows"
22
+
23
+ # Generation Settings
24
+ generation:
25
+ patternMatchingFirst: true # Try pattern matching before AI
26
+ parallelGeneration: false # Generate multiple features in parallel
27
+ validateSelectors: true # Validate selectors exist before generation
28
+
29
+ # Reporting Settings
30
+ reporting:
31
+ formats:
32
+ - "html"
33
+ - "json"
34
+ - "junit"
35
+ outputDir: "reports"
36
+ screenshots: "only-on-failure"
37
+ video: false
38
+ trace: "on-first-retry"
39
+
40
+ # Test Execution Settings
41
+ execution:
42
+ baseURL: "http://localhost:3000"
43
+ headless: true
44
+ timeout: 30000
45
+ retries: 2
46
+ workers: 1
47
+ browser: "chromium"
48
+
49
+ # Logging
50
+ logging:
51
+ level: "info" # debug | info | warn | error
52
+ verbose: false
@@ -0,0 +1,31 @@
1
+ # Routes Configuration
2
+ # Centralized route management for all environments
3
+
4
+ # Development routes
5
+ development:
6
+ home: "/"
7
+ login: "/auth/login"
8
+ register: "/auth/register"
9
+ chat: "/chat"
10
+
11
+ # Staging routes (if different)
12
+ staging:
13
+ home: "/"
14
+ login: "/auth/login"
15
+ register: "/auth/register"
16
+ chat: "/chat"
17
+
18
+ # Production routes (if different)
19
+ production:
20
+ home: "/"
21
+ login: "/login" # Maybe different in production
22
+ register: "/register"
23
+ chat: "/chat"
24
+
25
+ # Default environment
26
+ default: "development"
27
+
28
+ # Route aliases for backward compatibility
29
+ aliases:
30
+ "login": "auth.login"
31
+ "register": "auth.register"
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Annotation Handler
3
+ * Handles Gherkin annotations: selector IDs, data refs, ignore, etc.
4
+ */
5
+
6
+ import { RuntimeConfig } from '../../config/config-schema';
7
+ import { ParsedScenario, ParsedStep } from './gherkin-parser';
8
+
9
+ export interface ExtractedAnnotation {
10
+ id: string;
11
+ type: 'selector' | 'data' | 'ignore';
12
+ value?: string;
13
+ }
14
+
15
+ export class AnnotationHandler {
16
+ private config: RuntimeConfig;
17
+
18
+ constructor(config: RuntimeConfig) {
19
+ this.config = config;
20
+ }
21
+
22
+ /**
23
+ * Extract element ID from step text
24
+ * Supports: [screen.element] ONLY (not data refs)
25
+ * Data refs <data.field> are handled separately in test-data system
26
+ */
27
+ extractElementId(stepText: string, screenName: string): ExtractedAnnotation | null {
28
+ // Extract selector ID: [screen.element-name]
29
+ const selectorPattern = new RegExp(this.config.annotations.selectorId.pattern);
30
+ const selectorMatch = stepText.match(selectorPattern);
31
+
32
+ if (selectorMatch) {
33
+ const fullId = selectorMatch[1]; // e.g., "chat.input"
34
+ const [screen, element] = fullId.split('.');
35
+
36
+ // Only return if it matches the target screen
37
+ if (screen === screenName) {
38
+ return {
39
+ id: element,
40
+ type: 'selector'
41
+ };
42
+ }
43
+ }
44
+
45
+ // NOTE: Data references <data.field> are NOT included in selector files
46
+ // They belong in qa/test-data/ directory, not qa/selectors/
47
+ // This is per GHERKIN_STANDARDS.md specification
48
+
49
+ return null;
50
+ }
51
+
52
+ /**
53
+ * Check if step should be ignored
54
+ * Supports: # @ignore
55
+ */
56
+ shouldIgnoreStep(step: ParsedStep): boolean {
57
+ const ignorePattern = new RegExp(this.config.annotations.ignore.pattern);
58
+ return ignorePattern.test(step.text);
59
+ }
60
+
61
+ /**
62
+ * Check if entire scenario should be ignored
63
+ * Supports: # @ignore-testcase
64
+ */
65
+ shouldIgnoreScenario(scenario: ParsedScenario): boolean {
66
+ // Check scenario description
67
+ // @ts-ignore - Legacy parser may have description field
68
+ if (scenario.description) {
69
+ const ignorePattern = new RegExp(this.config.annotations.ignoreTestCase.pattern);
70
+ // @ts-ignore
71
+ if (ignorePattern.test(scenario.description)) {
72
+ return true;
73
+ }
74
+ }
75
+
76
+ // Check scenario tags (if any)
77
+ // @ts-ignore - Legacy parser may have tags field
78
+ if (scenario.tags && scenario.tags.includes('@ignore')) {
79
+ return true;
80
+ }
81
+
82
+ return false;
83
+ }
84
+
85
+ /**
86
+ * Check if step should be skipped in production
87
+ * Supports: # @skip-production
88
+ */
89
+ shouldSkipInProduction(step: ParsedStep): boolean {
90
+ const skipPattern = new RegExp(this.config.annotations.skipProduction.pattern);
91
+ return skipPattern.test(step.text);
92
+ }
93
+
94
+ /**
95
+ * Extract all element IDs from step (can have multiple)
96
+ */
97
+ extractAllElementIds(stepText: string): string[] {
98
+ const ids: string[] = [];
99
+
100
+ // Extract all [screen.element] patterns
101
+ const selectorPattern = new RegExp(this.config.annotations.selectorId.pattern, 'g');
102
+ let match;
103
+
104
+ while ((match = selectorPattern.exec(stepText)) !== null) {
105
+ ids.push(match[1]);
106
+ }
107
+
108
+ return ids;
109
+ }
110
+
111
+ /**
112
+ * Extract data references from step
113
+ */
114
+ extractDataRefs(stepText: string): string[] {
115
+ const refs: string[] = [];
116
+
117
+ // Extract all <data.ref> patterns
118
+ const dataPattern = new RegExp(this.config.annotations.dataRef.pattern, 'g');
119
+ let match;
120
+
121
+ while ((match = dataPattern.exec(stepText)) !== null) {
122
+ refs.push(match[1]);
123
+ }
124
+
125
+ return refs;
126
+ }
127
+ }
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Selector Base Generator
3
+ * Generates empty selector template from Gherkin features
4
+ * Supports multiple annotation types
5
+ */
6
+
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import yaml from 'yaml';
10
+ import { RuntimeConfig } from '../../config/config-schema';
11
+ import { GherkinParser, ParsedFeature } from './gherkin-parser';
12
+ import { AnnotationHandler } from './annotation-handler';
13
+
14
+ export interface SelectorBase {
15
+ screen: string;
16
+ elements: Record<string, SelectorElement>;
17
+ metadata: {
18
+ generatedFrom: string;
19
+ timestamp: number;
20
+ totalElements: number;
21
+ };
22
+ }
23
+
24
+ export interface SelectorElement {
25
+ selector: string; // Empty initially, will be filled by AI
26
+ type?: 'selector' | 'data' | 'ignore';
27
+ source?: string; // Which feature file it came from
28
+ line?: number; // Line number in feature file
29
+ }
30
+
31
+ export class SelectorBaseGenerator {
32
+ private config: RuntimeConfig;
33
+ private parser: GherkinParser;
34
+ private annotationHandler: AnnotationHandler;
35
+
36
+ constructor(config: RuntimeConfig) {
37
+ this.config = config;
38
+ this.parser = new GherkinParser(config);
39
+ this.annotationHandler = new AnnotationHandler(config);
40
+ }
41
+
42
+ /**
43
+ * Generate selector base for a screen
44
+ * Scans all Gherkin features and extracts element IDs
45
+ */
46
+ async generate(screenName: string): Promise<SelectorBase> {
47
+ const featuresDir = this.config.paths.featuresDir;
48
+
49
+ // Find all feature files
50
+ const featureFiles = this.findFeatureFiles(featuresDir);
51
+
52
+ // Extract element IDs from all features
53
+ const elementIds = new Set<string>();
54
+ const elementMetadata: Record<string, { source: string; line: number; type: string }> = {};
55
+
56
+ for (const featureFile of featureFiles) {
57
+ const feature = await this.parser.parse(featureFile);
58
+
59
+ // Extract element IDs from steps
60
+ const ids = this.extractElementIds(feature, screenName);
61
+
62
+ for (const { id, line, type } of ids) {
63
+ elementIds.add(id);
64
+ elementMetadata[id] = {
65
+ source: path.basename(featureFile),
66
+ line,
67
+ type
68
+ };
69
+ }
70
+ }
71
+
72
+ // Build selector base
73
+ const elements: Record<string, SelectorElement> = {};
74
+
75
+ for (const id of Array.from(elementIds)) {
76
+ const meta = elementMetadata[id];
77
+ elements[id] = {
78
+ selector: '', // Empty - will be filled by AI
79
+ type: meta.type as any,
80
+ source: meta.source,
81
+ line: meta.line
82
+ };
83
+ }
84
+
85
+ return {
86
+ screen: screenName,
87
+ elements,
88
+ metadata: {
89
+ generatedFrom: featuresDir,
90
+ timestamp: Date.now(),
91
+ totalElements: elementIds.size
92
+ }
93
+ };
94
+ }
95
+
96
+ /**
97
+ * Save selector base to YAML file
98
+ */
99
+ async save(selectorBase: SelectorBase): Promise<string> {
100
+ const outputDir = path.join(this.config.paths.selectorsDir, 'screens');
101
+
102
+ // Ensure output directory exists
103
+ if (!fs.existsSync(outputDir)) {
104
+ fs.mkdirSync(outputDir, { recursive: true });
105
+ }
106
+
107
+ const outputPath = path.join(outputDir, `${selectorBase.screen}.yaml`);
108
+
109
+ // Format for YAML output
110
+ const yamlContent = {
111
+ screen: selectorBase.screen,
112
+ elements: selectorBase.elements
113
+ };
114
+
115
+ fs.writeFileSync(outputPath, yaml.stringify(yamlContent), 'utf-8');
116
+
117
+ if (this.config.verbose) {
118
+ console.log(`✓ Generated selector base: ${outputPath}`);
119
+ console.log(` Elements: ${selectorBase.metadata.totalElements}`);
120
+ }
121
+
122
+ return outputPath;
123
+ }
124
+
125
+ /**
126
+ * Extract element IDs from feature for specific screen
127
+ */
128
+ private extractElementIds(
129
+ feature: ParsedFeature,
130
+ screenName: string
131
+ ): Array<{ id: string; line: number; type: string }> {
132
+ const ids: Array<{ id: string; line: number; type: string }> = [];
133
+
134
+ // Check background steps
135
+ if (feature.background) {
136
+ for (const step of feature.background.steps) {
137
+ const extracted = this.annotationHandler.extractElementId(step.text, screenName);
138
+ if (extracted) {
139
+ ids.push({
140
+ id: extracted.id,
141
+ // @ts-ignore - Legacy parser may have line field
142
+ line: step.line || 0,
143
+ type: extracted.type
144
+ });
145
+ }
146
+ }
147
+ }
148
+
149
+ // Check scenario steps
150
+ for (const scenario of feature.scenarios) {
151
+ // Check for @ignore-testcase annotation
152
+ if (this.annotationHandler.shouldIgnoreScenario(scenario)) {
153
+ continue;
154
+ }
155
+
156
+ for (const step of scenario.steps) {
157
+ // Check for @ignore annotation
158
+ if (this.annotationHandler.shouldIgnoreStep(step)) {
159
+ continue;
160
+ }
161
+
162
+ const extracted = this.annotationHandler.extractElementId(step.text, screenName);
163
+ if (extracted) {
164
+ ids.push({
165
+ id: extracted.id,
166
+ // @ts-ignore - Legacy parser may have line field
167
+ line: step.line || 0,
168
+ type: extracted.type
169
+ });
170
+ }
171
+ }
172
+ }
173
+
174
+ return ids;
175
+ }
176
+
177
+ /**
178
+ * Find all feature files in directory
179
+ */
180
+ private findFeatureFiles(dir: string): string[] {
181
+ const files: string[] = [];
182
+
183
+ if (!fs.existsSync(dir)) {
184
+ return files;
185
+ }
186
+
187
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
188
+
189
+ for (const entry of entries) {
190
+ const fullPath = path.join(dir, entry.name);
191
+
192
+ if (entry.isDirectory()) {
193
+ files.push(...this.findFeatureFiles(fullPath));
194
+ } else if (entry.isFile() && entry.name.endsWith('.feature')) {
195
+ files.push(fullPath);
196
+ }
197
+ }
198
+
199
+ return files;
200
+ }
201
+
202
+ /**
203
+ * Load existing selector base (if exists)
204
+ */
205
+ async load(screenName: string): Promise<SelectorBase | null> {
206
+ const filePath = path.join(
207
+ this.config.paths.selectorsDir,
208
+ 'screens',
209
+ `${screenName}.yaml`
210
+ );
211
+
212
+ if (!fs.existsSync(filePath)) {
213
+ return null;
214
+ }
215
+
216
+ try {
217
+ const content = fs.readFileSync(filePath, 'utf-8');
218
+ const data = yaml.parse(content);
219
+
220
+ return {
221
+ screen: data.screen,
222
+ elements: data.elements || {},
223
+ metadata: {
224
+ generatedFrom: this.config.paths.featuresDir,
225
+ timestamp: Date.now(),
226
+ totalElements: Object.keys(data.elements || {}).length
227
+ }
228
+ };
229
+ } catch (error) {
230
+ console.error(`Failed to load selector base: ${error}`);
231
+ return null;
232
+ }
233
+ }
234
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Gherkin Parser
3
+ * Parses Gherkin feature files into structured format
4
+ * This is a wrapper around the existing parser with new interface
5
+ */
6
+
7
+ import * as fs from 'fs';
8
+ import { RuntimeConfig } from '../../config/config-schema';
9
+ import {
10
+ GherkinParser as LegacyParser,
11
+ ParsedFeature as LegacyFeature,
12
+ ParsedScenario as LegacyScenario,
13
+ ParsedStep as LegacyStep
14
+ } from '../../generators/gherkin-parser';
15
+
16
+ // Re-export types from legacy parser for now
17
+ export type ParsedFeature = LegacyFeature;
18
+ export type ParsedScenario = LegacyScenario;
19
+ export type ParsedStep = LegacyStep;
20
+
21
+ export class GherkinParser {
22
+ private config: RuntimeConfig;
23
+ private legacyParser: LegacyParser;
24
+
25
+ constructor(config: RuntimeConfig) {
26
+ this.config = config;
27
+ this.legacyParser = new LegacyParser();
28
+ }
29
+
30
+ /**
31
+ * Parse a Gherkin feature file
32
+ */
33
+ async parse(featurePath: string): Promise<ParsedFeature> {
34
+ // Use correct method name from legacy parser
35
+ return this.legacyParser.parseFeatureFile(featurePath);
36
+ }
37
+
38
+ /**
39
+ * Parse multiple feature files
40
+ */
41
+ async parseAll(featureFiles: string[]): Promise<ParsedFeature[]> {
42
+ const features: ParsedFeature[] = [];
43
+
44
+ for (const file of featureFiles) {
45
+ try {
46
+ const feature = await this.parse(file);
47
+ features.push(feature);
48
+ } catch (error) {
49
+ if (this.config.verbose) {
50
+ console.error(`Failed to parse ${file}: ${error}`);
51
+ }
52
+ }
53
+ }
54
+
55
+ return features;
56
+ }
57
+ }