@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,457 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * AI-Assisted Selector Mapper
5
+ * Uses AI (Claude/Gemini) to map Gherkin element IDs to CSS selectors
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.AIMapper = void 0;
12
+ exports.mapSelectors = mapSelectors;
13
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
14
+ const generative_ai_1 = require("@google/generative-ai");
15
+ // ============================================================================
16
+ // AI Mapper Class
17
+ // ============================================================================
18
+ class AIMapper {
19
+ constructor(config) {
20
+ this.config = config;
21
+ // Initialize AI clients
22
+ if (config.provider === 'anthropic') {
23
+ const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
24
+ if (!apiKey) {
25
+ throw new Error('ANTHROPIC_API_KEY not found');
26
+ }
27
+ this.anthropic = new sdk_1.default({ apiKey });
28
+ }
29
+ else if (config.provider === 'google') {
30
+ const apiKey = config.apiKey || process.env.GEMINI_API_KEY;
31
+ if (!apiKey) {
32
+ throw new Error('GEMINI_API_KEY not found');
33
+ }
34
+ this.googleAI = new generative_ai_1.GoogleGenerativeAI(apiKey);
35
+ }
36
+ }
37
+ /**
38
+ * Map element IDs to selectors using AI
39
+ */
40
+ async mapSelectors(request) {
41
+ const prompt = this.buildPrompt(request);
42
+ if (this.config.verbose) {
43
+ console.log('\n📤 Sending request to AI...');
44
+ }
45
+ let response;
46
+ let aiModel;
47
+ let tokenCost;
48
+ if (this.config.provider === 'anthropic') {
49
+ const result = await this.callAnthropic(prompt);
50
+ response = result.response;
51
+ aiModel = result.model;
52
+ tokenCost = result.tokenCost;
53
+ }
54
+ else {
55
+ const result = await this.callGoogle(prompt);
56
+ response = result.response;
57
+ aiModel = result.model;
58
+ }
59
+ // Parse AI response
60
+ const selectors = this.parseResponse(response, request.elementIds);
61
+ // UPDATED: Phase 1 - Task 3 - Don't create fake fallback placeholders
62
+ // Return null selectors with confidence "none" for missing elements
63
+ for (const elementId of request.elementIds) {
64
+ // CRITICAL FIX: Use clean ID to match heuristic format
65
+ const cleanId = elementId.replace(/[\[\]]/g, '').split('.').pop() || elementId;
66
+ if (!selectors[cleanId]) {
67
+ selectors[cleanId] = {
68
+ selector: null,
69
+ type: 'unknown',
70
+ description: 'Element not found in UI Model - re-scan or add manually',
71
+ discoveryMethod: 'ai-static-analysis',
72
+ locatorType: 'css',
73
+ confidence: 'none',
74
+ reason: 'not-in-ui-model',
75
+ suggestedAction: 'Run discovery again or add data-testid to source code'
76
+ };
77
+ }
78
+ }
79
+ return {
80
+ selectors,
81
+ metadata: {
82
+ aiModel,
83
+ tokenCost,
84
+ provider: this.config.provider
85
+ }
86
+ };
87
+ }
88
+ /**
89
+ * Build prompt for AI
90
+ */
91
+ buildPrompt(request) {
92
+ const { uiModel, elementIds } = request;
93
+ // Extract ALL relevant attributes from UI model (DON'T simplify!)
94
+ const enrichedElements = uiModel.elements.map(el => {
95
+ // Extract critical props from the props object
96
+ const props = el.props || {};
97
+ return {
98
+ key: el.key,
99
+ tag: el.tag,
100
+ // Top-level attributes
101
+ id: el.id,
102
+ name: el.name,
103
+ placeholder: el.placeholder,
104
+ ariaLabel: el.ariaLabel,
105
+ testId: el.testId,
106
+ text: el.text,
107
+ role: el.role,
108
+ // CRITICAL: Extract props that AI needs for selector generation
109
+ type: props.type, // button type="submit", input type="password"
110
+ href: props.href, // link href="/auth/register"
111
+ value: props.value, // input value
112
+ disabled: props.disabled, // button disabled
113
+ required: props.required, // input required
114
+ autoComplete: props.autoComplete, // input autocomplete
115
+ // Keep full props for AI to reference if needed
116
+ allProps: props
117
+ };
118
+ });
119
+ const prompt = `You are a test automation expert. Given a UI Model and a list of element IDs from Gherkin test scenarios, generate CSS selectors for each element.
120
+
121
+ **CRITICAL: Use Semantic Understanding**
122
+ The element IDs come from QA-written Gherkin scenarios and use human-readable names. You MUST understand the semantic meaning of each ID and match it to the appropriate UI element.
123
+
124
+ **PHASE 2 ENHANCEMENT: Semantic Aliases & Context Awareness**
125
+
126
+ Gherkin names often use INTENT-based naming while UI uses IMPLEMENTATION-based text. You must bridge this semantic gap:
127
+
128
+ **Common Semantic Aliases:**
129
+
130
+ **Action Buttons:**
131
+ - "clear" / "clear-button" ≈ "New Chat" button (clears chat history)
132
+ - "send" / "send-button" ≈ "Send", "Submit", "→", "➤" button
133
+ - "submit" / "submit-button" ≈ "Submit", "Continue", "Sign In", "Register" button
134
+ - "cancel" / "cancel-button" ≈ "Cancel", "Back", "Close" button
135
+ - "delete" / "delete-button" ≈ "Delete", "Remove", "×" button
136
+ - "edit" / "edit-button" ≈ "Edit", "Modify", "✎" button
137
+ - "save" / "save-button" ≈ "Save", "Update", "Confirm" button
138
+
139
+ **Brand/Identity Elements:**
140
+ - "logo" ≈ heading with brand name OR image with alt="logo"
141
+ - "title" ≈ main heading (h1) with brand/app name
142
+ - "tagline" ≈ subtitle or description text
143
+
144
+ **Navigation:**
145
+ - "login-link" / "signin-link" ≈ link with text "Login", "Sign In", "Log In"
146
+ - "register-link" / "signup-link" ≈ link with text "Register", "Sign Up", "Create Account"
147
+ - "logout-link" / "signout-link" ≈ link/button with text "Logout", "Sign Out", "Log Out"
148
+ - "back-link" ≈ link with text "Back", "←", "Return"
149
+
150
+ **Input Fields (aliases for same field):**
151
+ - "email" / "email-input" / "email-field" → input[type='email'] OR input[name='email']
152
+ - "password" / "pass" / "password-input" / "pw" → input[type='password']
153
+ - "message" / "message-input" / "input" / "textarea" → textarea for messages
154
+ - "search" / "search-input" → input[type='search'] OR placeholder containing "search"
155
+
156
+ **Container Elements:**
157
+ - "messages" / "messages-container" / "messages-list" → div with overflow-y-auto OR flex-1 (scrollable area)
158
+ - "empty-state" → text/paragraph shown when no content (e.g., "No messages yet", "Start a conversation")
159
+ - "error" / "error-message" → text with red color (text-red-*) OR bg-red-*
160
+
161
+ **Conditional Elements (may have isConditional marker):**
162
+ - "timestamp" / "message-timestamp" → small text with time format (text-xs, text-gray-500)
163
+ - "error" / "field-error" → conditionally rendered error message
164
+ - "copy-button" → button that appears on hover (opacity-0 group-hover:opacity-100)
165
+ - "tooltip" → conditionally shown helper text
166
+
167
+ **Context Clues:**
168
+ - If Gherkin says "clear-button" but UI has "New Chat" button → Match if button clears/resets state
169
+ - If Gherkin says "logo" but UI has h1 text → Match heading with brand name
170
+ - If Gherkin says "send" but UI has "Submit" → Match if button submits form
171
+ - If multiple buttons exist, use context: submit buttons usually have type='submit', cancel buttons may have type='button'
172
+
173
+ **Examples of semantic matching:**
174
+ - \`[auth-login.email]\` OR \`[auth-login.email-input]\` → input with name="email" or id="email-address"
175
+ - \`[auth-login.password]\` OR \`[auth-login.pass]\` → input with type="password" or name="password"
176
+ - \`[auth-login.submit]\` OR \`[auth-login.login-button]\` → button with type="submit" OR button:has-text("Sign In")
177
+ - \`[auth-login.signup-link]\` OR \`[auth-login.register-link]\` → link (a tag) pointing to signup/register
178
+ - \`[chat.input]\` OR \`[chat.message-input]\` → textarea or input for chat messages
179
+ - \`[chat.send-button]\` OR \`[chat.send]\` → button to send messages OR button:has-text("Send")
180
+ - \`[chat.clear-button]\` → button:has-text("New Chat") (semantic alias: clear ≈ new chat)
181
+ - \`[home.logo]\` → h1:has-text("PEU AI-Native Workflow") (logo as text heading)
182
+
183
+ **Screen:** ${uiModel.screenId}
184
+ **Framework:** ${uiModel.framework}
185
+
186
+ **UI Elements Available:**
187
+ ${JSON.stringify(enrichedElements, null, 2)}
188
+
189
+ **Element IDs to Resolve (from Gherkin):**
190
+ ${elementIds.map(id => `- ${id}`).join('\n')}
191
+
192
+ **CRITICAL INSTRUCTIONS - MUST FOLLOW:**
193
+
194
+ 1. **Use EXACT attributes from UI Model** - Each element has \`type\`, \`href\`, \`id\`, \`name\`, etc. Use these EXACT values!
195
+
196
+ 2. **MANDATORY Selector Priority:**
197
+
198
+ **FOR BUTTONS (tag="button"):**
199
+ - If element has \`type\` attribute → **MUST use** \`button[type="..."]\`
200
+ - Example: \`type: "submit"\` → \`button[type='submit']\` (NOT \`button[role='button']\`!)
201
+ - Only use text if no type: \`button:has-text("...")\`
202
+
203
+ **FOR LINKS (tag="a", tag="link"):**
204
+ - If element has \`href\` → **MUST use** \`a[href="..."]\`
205
+ - Use EXACT href from UI Model
206
+ - Example: \`href: "/auth/register"\` → \`a[href='/auth/register']\`
207
+
208
+ **FOR INPUTS (tag="input"):**
209
+ - Priority: \`id\` > \`name\` > \`type\` + \`placeholder\`
210
+ - Example: \`id: "email-address"\` → \`#email-address\`
211
+ - Example: \`name: "password"\` → \`input[name='password']\`
212
+
213
+ **FOR TEXTAREA:**
214
+ - Priority: \`id\` > \`name\` > \`placeholder\`
215
+ - Example: \`placeholder: "Type your message"\` → \`textarea[placeholder*='Type your message']\`
216
+
217
+ 3. **NEVER use these (BANNED):**
218
+ - Generic \`role\` attribute for buttons/inputs
219
+ - Class names NOT in UI Model
220
+ - Invented/guessed selectors
221
+ - Just tag name without attributes (e.g., \`button\`, \`textarea\`)
222
+
223
+ 4. **Semantic matching:** "email", "email-input", "email-field" all = same element
224
+
225
+ 5. **Confidence levels:**
226
+ - \`high\`: Used id/name/type/href from UI Model - exact match
227
+ - \`medium\`: Used placeholder/text from UI Model OR semantic alias match (e.g., "clear" → "New Chat")
228
+ - \`low\`: Ambiguous match - multiple elements could match
229
+ - \`none\`: Element not found in UI Model (needs manual review)
230
+
231
+ 6. **PHASE 2: Ambiguity Detection & Helpful Messages**
232
+
233
+ If you find MULTIPLE elements that could match a Gherkin ID:
234
+ - Set confidence to \`low\`
235
+ - In description, list ALL potential matches
236
+ - Example:
237
+ \`\`\`json
238
+ {
239
+ "[chat.messages]": {
240
+ "selector": "div.flex-1.overflow-y-auto",
241
+ "type": "container",
242
+ "description": "AMBIGUOUS: Could be (1) messages container (div.flex-1), (2) messages list (div.max-w-4xl), or (3) message items. Recommend using [chat.messages-container] for container, [chat.messages-list] for list, or [chat.messages-item] for items.",
243
+ "confidence": "low"
244
+ }
245
+ }
246
+ \`\`\`
247
+
248
+ If element uses semantic alias:
249
+ - Set confidence to \`medium\`
250
+ - Explain the alias in description
251
+ - Example:
252
+ \`\`\`json
253
+ {
254
+ "[chat.clear-button]": {
255
+ "selector": "button:has-text('New Chat')",
256
+ "type": "button",
257
+ "description": "Semantic match: 'clear-button' maps to 'New Chat' button (clears chat history)",
258
+ "confidence": "medium"
259
+ }
260
+ }
261
+ \`\`\`
262
+
263
+ 7. **IF ELEMENT NOT FOUND IN UI MODEL:**
264
+ - DO NOT guess selectors or invent className patterns like \`div[className*='...']\`
265
+ - DO NOT create fake data-testid attributes like \`[data-testid="messages"]\`
266
+ - RETURN exactly:
267
+ \`\`\`json
268
+ {
269
+ "[element-id]": {
270
+ "selector": null,
271
+ "type": "unknown",
272
+ "description": "Element not found in UI Model",
273
+ "confidence": "none"
274
+ }
275
+ }
276
+ \`\`\`
277
+
278
+ **Return ONLY valid JSON with this structure:**
279
+ \`\`\`json
280
+ {
281
+ "[element-id]": {
282
+ "selector": "css-selector-string",
283
+ "type": "input|button|link|textarea|text|container",
284
+ "description": "Human readable description",
285
+ "confidence": "high|medium|low"
286
+ }
287
+ }
288
+ \`\`\`
289
+
290
+ **Example Response (showing CORRECT usage):**
291
+ \`\`\`json
292
+ {
293
+ "[auth-login.email]": {
294
+ "selector": "#email-address",
295
+ "type": "input",
296
+ "description": "Email input field",
297
+ "confidence": "high"
298
+ },
299
+ "[auth-login.submit]": {
300
+ "selector": "button[type='submit']",
301
+ "type": "button",
302
+ "description": "Login submit button",
303
+ "confidence": "high"
304
+ },
305
+ "[auth-login.signup-link]": {
306
+ "selector": "a[href='/auth/register']",
307
+ "type": "link",
308
+ "description": "Sign up link",
309
+ "confidence": "high"
310
+ }
311
+ }
312
+ \`\`\`
313
+
314
+ **WRONG Examples (NEVER do this):**
315
+ ❌ \`"selector": "button[role='button']"\` - DON'T use role when type exists!
316
+ ❌ \`"selector": "button"\` - DON'T use tag only!
317
+ ❌ \`"selector": ".submit-btn"\` - DON'T invent class names!
318
+ ❌ \`"selector": "div[className*='chat-messages']"\` - DON'T guess className patterns!
319
+ ❌ \`"selector": "[data-testid='messages']"\` - DON'T create fake testids!
320
+ ✅ \`"selector": "button[type='submit']"\` - CORRECT! Uses type from UI Model!
321
+ ✅ \`"selector": null, "confidence": "none"\` - CORRECT! If not found in UI Model!
322
+
323
+ **IMPORTANT:** Return ONLY the JSON object, no markdown, no additional text.`;
324
+ return prompt;
325
+ }
326
+ /**
327
+ * Call Anthropic API
328
+ */
329
+ async callAnthropic(prompt) {
330
+ if (!this.anthropic) {
331
+ throw new Error('Anthropic client not initialized');
332
+ }
333
+ const model = this.config.model || 'claude-3-5-haiku-20241022';
334
+ const message = await this.anthropic.messages.create({
335
+ model,
336
+ max_tokens: 4096,
337
+ messages: [{
338
+ role: 'user',
339
+ content: prompt
340
+ }]
341
+ });
342
+ const response = message.content[0].type === 'text' ? message.content[0].text : '';
343
+ const tokenCost = message.usage.input_tokens + message.usage.output_tokens;
344
+ if (this.config.verbose) {
345
+ console.log(`✅ Response received (${tokenCost} tokens)`);
346
+ }
347
+ return { response, model, tokenCost };
348
+ }
349
+ /**
350
+ * Call Google Gemini API
351
+ */
352
+ async callGoogle(prompt) {
353
+ if (!this.googleAI) {
354
+ throw new Error('Google AI client not initialized');
355
+ }
356
+ const model = this.config.model || 'gemini-2.0-flash-exp';
357
+ const genModel = this.googleAI.getGenerativeModel({ model });
358
+ const result = await genModel.generateContent(prompt);
359
+ const response = result.response.text();
360
+ if (this.config.verbose) {
361
+ console.log(`✅ Response received from ${model}`);
362
+ }
363
+ return { response, model };
364
+ }
365
+ /**
366
+ * Parse AI response into SelectorDSL
367
+ */
368
+ parseResponse(response, elementIds) {
369
+ // Extract JSON from response (handle markdown code blocks)
370
+ let jsonStr = response.trim();
371
+ // Remove markdown code blocks if present
372
+ const codeBlockMatch = jsonStr.match(/```(?:json)?\s*(\{[\s\S]*\})\s*```/);
373
+ if (codeBlockMatch) {
374
+ jsonStr = codeBlockMatch[1];
375
+ }
376
+ try {
377
+ const parsed = JSON.parse(jsonStr);
378
+ const selectors = {};
379
+ // Convert to SelectorDSL format
380
+ for (const elementId of elementIds) {
381
+ if (parsed[elementId]) {
382
+ const entry = parsed[elementId];
383
+ // CRITICAL FIX: Clean element ID to match heuristic format
384
+ // [auth-login.email] → email
385
+ // [chat.message-input] → message-input
386
+ const cleanId = elementId.replace(/[\[\]]/g, '').split('.').pop() || elementId;
387
+ selectors[cleanId] = {
388
+ selector: entry.selector,
389
+ type: entry.type,
390
+ description: entry.description,
391
+ discoveryMethod: 'ai-static-analysis',
392
+ locatorType: 'css',
393
+ confidence: entry.confidence || 'medium'
394
+ };
395
+ }
396
+ }
397
+ return selectors;
398
+ }
399
+ catch (error) {
400
+ console.error('Failed to parse AI response:', error);
401
+ console.error('Response:', response);
402
+ throw new Error('AI response is not valid JSON');
403
+ }
404
+ }
405
+ /**
406
+ * Create fallback selector using heuristic rules
407
+ */
408
+ createFallbackSelector(elementId, uiModel) {
409
+ // Extract element name from ID
410
+ // e.g., "[login.email]" -> "email"
411
+ const match = elementId.match(/\[([^.]+)\.([^\]]+)\]/);
412
+ const elementName = match ? match[2] : 'unknown';
413
+ // Try to find matching element by name
414
+ const matchingElement = uiModel.elements.find(el => el.name === elementName ||
415
+ el.id === elementName ||
416
+ el.testId?.includes(elementName));
417
+ if (matchingElement) {
418
+ // Build selector
419
+ let selector = matchingElement.tag;
420
+ if (matchingElement.testId) {
421
+ selector = `[data-testid="${matchingElement.testId}"]`;
422
+ }
423
+ else if (matchingElement.id) {
424
+ selector = `#${matchingElement.id}`;
425
+ }
426
+ else if (matchingElement.name) {
427
+ selector = `${matchingElement.tag}[name="${matchingElement.name}"]`;
428
+ }
429
+ return {
430
+ selector,
431
+ type: matchingElement.tag,
432
+ description: `Fallback selector for ${elementName}`,
433
+ discoveryMethod: 'ai-static-analysis',
434
+ locatorType: 'css',
435
+ confidence: 'low'
436
+ };
437
+ }
438
+ // Ultimate fallback
439
+ return {
440
+ selector: `[data-testid="${elementName}"]`,
441
+ type: 'unknown',
442
+ description: `Placeholder selector for ${elementName} - needs manual review`,
443
+ discoveryMethod: 'ai-static-analysis',
444
+ locatorType: 'css',
445
+ confidence: 'low'
446
+ };
447
+ }
448
+ }
449
+ exports.AIMapper = AIMapper;
450
+ // ============================================================================
451
+ // Factory Function
452
+ // ============================================================================
453
+ async function mapSelectors(uiModel, elementIds, config) {
454
+ const mapper = new AIMapper(config);
455
+ return mapper.mapSelectors({ uiModel, elementIds });
456
+ }
457
+ //# sourceMappingURL=ai-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-mapper.js","sourceRoot":"","sources":["../../../src/generators/selector-mapper/ai-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Hybrid Selector Mapper
3
+ * Combines heuristic matching (fast, free) with AI fallback (slow, accurate)
4
+ *
5
+ * Strategy:
6
+ * 1. Try heuristic matching (90% success, 0 cost, instant)
7
+ * 2. Fallback to AI mapping (10% cases, paid, 2-5s)
8
+ *
9
+ * Benefits:
10
+ * - 90% cost reduction
11
+ * - 10x faster mapping
12
+ * - Deterministic results for common elements
13
+ */
14
+ import { AIMapperConfig } from './ai-mapper';
15
+ import { UIModel, SelectorDSL } from '../types';
16
+ export interface HybridMapperConfig extends AIMapperConfig {
17
+ heuristicFirst?: boolean;
18
+ minHeuristicConfidence?: number;
19
+ }
20
+ export interface HybridMappingStats {
21
+ total: number;
22
+ heuristicMatches: number;
23
+ aiMatches: number;
24
+ heuristicSuccessRate: number;
25
+ estimatedCost: number;
26
+ estimatedTime: number;
27
+ }
28
+ export declare class HybridMapper {
29
+ private aiMapper;
30
+ private config;
31
+ private stats;
32
+ constructor(config: HybridMapperConfig);
33
+ /**
34
+ * Map element IDs to selectors using hybrid approach
35
+ */
36
+ mapSelectors(uiModel: UIModel, elementIds: string[]): Promise<SelectorDSL>;
37
+ /**
38
+ * Get mapping statistics
39
+ */
40
+ getStats(): HybridMappingStats;
41
+ /**
42
+ * Reset statistics
43
+ */
44
+ resetStats(): void;
45
+ }
46
+ /**
47
+ * Example Usage:
48
+ *
49
+ * const mapper = new HybridMapper({
50
+ * provider: 'anthropic',
51
+ * apiKey: process.env.ANTHROPIC_API_KEY,
52
+ * verbose: true,
53
+ * heuristicFirst: true,
54
+ * minHeuristicConfidence: 0.8
55
+ * });
56
+ *
57
+ * const selectors = await mapper.mapSelectors(uiModel, [
58
+ * '[login.email]',
59
+ * '[login.password]',
60
+ * '[login.submit]'
61
+ * ]);
62
+ *
63
+ * const stats = mapper.getStats();
64
+ * console.log(`Heuristic success: ${stats.heuristicSuccessRate}%`);
65
+ * console.log(`Cost: $${stats.estimatedCost}`);
66
+ */
67
+ //# sourceMappingURL=hybrid-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-mapper.d.ts","sourceRoot":"","sources":["../../../src/generators/selector-mapper/hybrid-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAY,cAAc,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,OAAO,EAAa,WAAW,EAAiB,MAAM,UAAU,CAAC;AAqP1E,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAqB;gBAEtB,MAAM,EAAE,kBAAkB;IAiBtC;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAqFhF;;OAEG;IACH,QAAQ,IAAI,kBAAkB;IAI9B;;OAEG;IACH,UAAU,IAAI,IAAI;CAUnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG"}