@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Bach Ngoc Hoai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,490 @@
1
+ # Sungen - AI-Native E2E Test Generator
2
+
3
+ **Version**: 3.2.0 (Unreleased)
4
+ **Priority-Based E2E Test Generation with Deterministic Selector Mapping**
5
+
6
+ ---
7
+
8
+ ## šŸŽÆ What is Sungen?
9
+
10
+ Sungen is a **deterministic-first** E2E test automation framework that generates Playwright tests from Gherkin features using a **priority-based approach**:
11
+
12
+ 1. **Strict UI Scanning** - Filters only interactive elements (input, button, a, select, textarea)
13
+ 2. **Priority-Based Selector Mapping**:
14
+ - **1ļøāƒ£ Direct ID Match** - Exact `data-testid` matching (instant, free, deterministic)
15
+ - **2ļøāƒ£ Accessibility Match** - Semantic `role` + `aria-label` matching
16
+ - **3ļøāƒ£ AI Fallback** - Claude Sonnet as last resort (not primary solution)
17
+ 3. **Auto-Tagging Tool** - Inject stable `data-testid` into source code proactively
18
+ 4. **Test Generation** - Create production-ready Playwright test code
19
+
20
+ **Key Achievement**: **90%+ Direct ID match rate** with minimal AI dependency!
21
+
22
+ ---
23
+
24
+ ## šŸš€ Quick Start
25
+
26
+ ### Installation
27
+
28
+ ```bash
29
+ npm install -g @sungen/cli
30
+ ```
31
+
32
+ Or use locally in your project:
33
+
34
+ ```bash
35
+ npm install --save-dev @sungen/cli
36
+ ```
37
+
38
+ ### Setup
39
+
40
+ 1. Initialize your Sungen project:
41
+
42
+ ```bash
43
+ sungen init
44
+ ```
45
+
46
+ This creates:
47
+ - `qa/screens/` - Screen definitions directory (use `sungen add --screen` to create)
48
+ - `spec/generated/` - Generated test code output directory
49
+ - `playwright.config.ts` - Playwright configuration
50
+ - `.gitignore` - Updated with Sungen patterns
51
+
52
+ **Note:** Use `sungen add --screen <name>` to create screen definitions with proper structure.
53
+
54
+ 2. Set your API key:
55
+
56
+ ```bash
57
+ export ANTHROPIC_API_KEY=your_api_key_here
58
+ ```
59
+
60
+ 3. Create your first screen definition:
61
+
62
+ ```bash
63
+ sungen add --screen login --path /auth/login
64
+ ```
65
+
66
+ This creates a screen definition with:
67
+ - `qa/screens/login/features/login.feature` - Gherkin scenarios
68
+ - `qa/screens/login/selectors/login.yaml` - Element selectors
69
+ - `qa/screens/login/test-data/login.yaml` - Test data variables
70
+
71
+ 4. Edit the generated feature file and run the pipeline:
72
+
73
+ ### Usage
74
+
75
+ ```bash
76
+ # Create a new screen definition
77
+ sungen add --screen login --path /auth/login
78
+
79
+ # Step by step:
80
+ sungen map --screen login # 2. Map selectors with AI
81
+ sungen generate --screen login # 3. Generate Playwright tests
82
+
83
+ # Clear cache
84
+ sungen cache-clear
85
+ ```
86
+
87
+ ---
88
+
89
+ ## šŸ“ Project Structure
90
+
91
+ ```
92
+ your-project/
93
+ ā”œā”€ā”€ app/ # Your React source
94
+ │ ā”œā”€ā”€ auth/
95
+ │ │ └── page.tsx
96
+ │ └── chat/
97
+ │ └── page.tsx
98
+ │
99
+ ā”œā”€ā”€ qa/ # Input artifacts
100
+ │ └── screens/ # Screen definitions (NEW structure)
101
+ │ └── auth/
102
+ │ ā”œā”€ā”€ features/ # Gherkin scenarios
103
+ │ │ └── login.feature
104
+ │ │ └── logout.feature
105
+ │ ā”œā”€ā”€ selectors/ # Element mappings
106
+ │ │ └── login.yaml
107
+ │ │ └── logout.yaml
108
+ │ └── test-data/ # Test variables
109
+ │ └── login.yaml
110
+ │ └── logout.yaml
111
+ │
112
+ ā”œā”€ā”€ specs/ # Output artifacts (sibling to qa/)
113
+ │ └── generated/ # Generated Playwright tests
114
+ │ └── auth
115
+ │ ā”œā”€ā”€ login.spec.ts
116
+ │ └── logout.spec.ts
117
+ │
118
+ └── sungen.config.yaml # Framework configuration
119
+ ```
120
+
121
+
122
+ **Key Changes in v3.2:**
123
+ - Organized by screens: Each screen has its own directory
124
+ - Self-contained: Features, selectors, and test data grouped together
125
+ - Use `sungen add --screen <name>` to create new screen definitions
126
+
127
+ ---
128
+
129
+ ## šŸŽØ Gherkin Syntax
130
+
131
+ Sungen uses a **simple, natural language grammar** for Gherkin:
132
+
133
+ **Pattern**: `User + action + [element] + with {{data}}`
134
+
135
+ ### Example Feature File
136
+
137
+ ```gherkin
138
+ Feature: Login Screen
139
+
140
+ As a user
141
+ I want to interact with the Login screen
142
+ So that I can access my account
143
+ Path: /auth/login
144
+
145
+ @high
146
+ Scenario: User logs in successfully
147
+ Given User open page
148
+ When User fill [Email] field with {{valid_email}}
149
+ And User fill [Password] field with {{valid_password}}
150
+ And User click [Login] button
151
+ Then User see [Welcome message !] text with {{success_message}}
152
+ ```
153
+
154
+ ### Grammar Rules
155
+
156
+ | Component | Syntax | Example |
157
+ |-----------|--------|---------|
158
+ | **Actor** | `User` | `User open page` |
159
+ | **Action** | `click`, `fill`, `see` | `User click [button]` |
160
+ | **Element** | `[element name]` | `[Email] field`, `[submit] button` |
161
+ | **Data** | `{{variable}}` | `{{valid_email}}`, `{{success.message}}` |
162
+ | **Path** | `Path: /route` | `Path: /auth/login` |
163
+
164
+ ### Common Actions
165
+
166
+ ```gherkin
167
+ # Navigation
168
+ Given User open page
169
+
170
+ # Input
171
+ When User fill [element] field with {{data}}
172
+
173
+ # Click
174
+ When User click [element] button
175
+
176
+ # Verification
177
+ Then User see [element] text with {{expected_text}}
178
+ ```
179
+
180
+ ### Test Data
181
+
182
+ Define variables in `test-data/<screen>.yaml`:
183
+
184
+ ```yaml
185
+ # test-data/login.yaml
186
+ valid_email: "user@example.com"
187
+ valid_password: "SecurePassword123"
188
+ success:
189
+ message: "Welcome back!"
190
+ ```
191
+
192
+ ### Element Selectors
193
+
194
+ Map elements in `selectors/<screen>.yaml`:
195
+
196
+ ```yaml
197
+ # selectors/login.yaml
198
+ email-input:
199
+ selector: ""
200
+ type: "testid"
201
+
202
+ submit-button:
203
+ selector: ""
204
+ type: "role"
205
+ value: "button"
206
+ ```
207
+
208
+ ---
209
+
210
+ ## šŸ—ļø Architecture
211
+
212
+
213
+ ---
214
+
215
+ ## šŸ“– CLI Commands
216
+
217
+ ### `sungen init`
218
+ Initialize Sungen project structure
219
+
220
+ ```bash
221
+ sungen init
222
+ ```
223
+
224
+ Creates:
225
+ - `qa/screens/` directory for screen definitions
226
+ - `spec/generated/` directory for generated tests
227
+ - `playwright.config.ts` if it doesn't exist
228
+ - Updates `.gitignore` with Sungen patterns
229
+
230
+ ### `sungen add --screen` ⭐ NEW
231
+ Create a new screen definition with scaffolded files. Supports multiple test scenarios per screen.
232
+
233
+ ```bash
234
+ sungen add --screen <name> [options]
235
+
236
+ Options:
237
+ --screen <name> Screen name (required)
238
+ -p, --path <path> Screen route path - also controls filename
239
+ -d, --description Screen description
240
+
241
+ Examples:
242
+ # Create screen with default file
243
+ sungen add --screen login
244
+
245
+ # Create screen with custom path/filename
246
+ sungen add --screen login --path /login-valid --description "Valid login"
247
+
248
+ # Add additional test scenarios to existing screen
249
+ sungen add --screen login --path /login-invalid
250
+ sungen add --screen login --path /login-mfa
251
+ ```
252
+
253
+ **What it does:**
254
+ - **First call**: Creates `qa/screens/<name>/` directory structure
255
+ - **Subsequent calls**: Adds additional feature files to existing screen
256
+ - Generates `features/<filename>.feature` with Gherkin template
257
+ - Generates `selectors/<filename>.yaml` with selector structure
258
+ - Generates `test-data/<filename>.yaml` for test variables
259
+ - **Path option**: Controls both filename and Path metadata in feature file
260
+
261
+ **Multi-file workflow** (organizing test scenarios):
262
+ ```bash
263
+ # Create base screen
264
+ sungen add --screen login
265
+
266
+ # Add valid login scenario
267
+ sungen add --screen login --path /login-valid
268
+
269
+ # Add invalid credentials scenario
270
+ sungen add --screen login --path /login-invalid
271
+
272
+ # Add 2FA scenario
273
+ sungen add --screen login --path /login-mfa
274
+ ```
275
+
276
+ Result:
277
+ ```
278
+ qa/screens/login/
279
+ ā”œā”€ā”€ features/
280
+ │ ā”œā”€ā”€ login.feature
281
+ │ ā”œā”€ā”€ login-valid.feature
282
+ │ ā”œā”€ā”€ login-invalid.feature
283
+ │ └── login-mfa.feature
284
+ ā”œā”€ā”€ selectors/
285
+ │ ā”œā”€ā”€ login.yaml
286
+ │ ā”œā”€ā”€ login-valid.yaml
287
+ │ ā”œā”€ā”€ login-invalid.yaml
288
+ │ └── login-mfa.yaml
289
+ └── test-data/
290
+ ā”œā”€ā”€ login.yaml
291
+ ā”œā”€ā”€ login-valid.yaml
292
+ ā”œā”€ā”€ login-invalid.yaml
293
+ └── login-mfa.yaml
294
+ ```
295
+
296
+ **Backward compatible**: Default behavior (no `--path`) creates single file named after screen.
297
+
298
+
299
+ ### `sungen map`
300
+ Map Gherkin references to actual selectors using AI
301
+
302
+ ```bash
303
+ sungen map --screen <screen-name> [options]
304
+
305
+ Options:
306
+ --screen <name> Screen name to map (required)
307
+ --all Map all screens
308
+ --force Force regeneration, bypass cache, overwrite existing files
309
+ --verbose Detailed output
310
+ ```
311
+
312
+ **Output:** Processes each feature file individually, generating separate YAML files for each:
313
+
314
+ ```
315
+ Mapping screen: login
316
+
317
+ āœ“ Mapped login.feature
318
+ → selectors/login.yaml (5 elements)
319
+ → test-data/login.yaml (3 variables)
320
+
321
+ āœ“ Mapped login-valid.feature
322
+ → selectors/login-valid.yaml (3 elements)
323
+ → test-data/login-valid.yaml (2 variables)
324
+
325
+ Next step: sungen generate --screen login
326
+ ```
327
+
328
+ **Multi-file support:** Each `.feature` file generates matching `.yaml` files, maintaining clean separation between test scenarios.
329
+
330
+ ### `sungen generate`
331
+ Generate Playwright test code from features
332
+
333
+ ```bash
334
+ sungen generate [options]
335
+
336
+ Options:
337
+ --ai-mapper Enable AI fallback for unknown Gherkin patterns
338
+ --framework <name> Test framework (playwright, appium, integration) - default: playwright
339
+ -s, --screen <name> Filter generation to specific screen (recommended)
340
+ -f, --force Force regeneration, bypass cache
341
+
342
+ Examples:
343
+ sungen generate --screen login # Generate tests for login screen
344
+ sungen generate -s login --force # Force regenerate login screen tests
345
+ sungen generate # Generate all tests (legacy)
346
+ ```
347
+
348
+ **Output:** Shows per-file results with step counts:
349
+
350
+ ```
351
+ Generating tests: login
352
+
353
+ āœ“ Generated login.spec.ts
354
+ → spec/generated/login/login.spec.ts (8 steps)
355
+
356
+ āœ“ Generated login-valid.spec.ts
357
+ → spec/generated/login/login-valid.spec.ts (5 steps)
358
+
359
+ āœ“ Generated login-invalid.spec.ts
360
+ → spec/generated/login/login-invalid.spec.ts (3 steps)
361
+
362
+ Next step: npx playwright test
363
+ ```
364
+
365
+ **Selector Merging:** Supports optional base + feature-specific selector files:
366
+ - **Base file**: `selectors/<screen>.yaml` - Shared selectors for all scenarios
367
+ - **Feature file**: `selectors/<feature-name>.yaml` - Scenario-specific selectors (required)
368
+ - Feature-specific selectors override base selectors when keys conflict
369
+
370
+ **Validation:** Checks for missing selector files before generation and suggests running `map` command if needed.
371
+
372
+ ### `sungen full`
373
+ Run complete pipeline (discover + map + generate)
374
+
375
+ ```bash
376
+ sungen full [options]
377
+
378
+ Options:
379
+ --screen <name> Process specific screen (optional)
380
+ --depth <num> Max component depth
381
+ --force Force regeneration
382
+ --verbose Detailed output
383
+ ```
384
+
385
+ ### `sungen cache-clear`
386
+ Clear all cached data
387
+
388
+ ```bash
389
+ sungen cache-clear
390
+ ```
391
+
392
+ ### `sungen auto-tag` ⭐ NEW
393
+ Auto-inject stable `data-testid` attributes into source code
394
+
395
+ ```bash
396
+ sungen auto-tag [options]
397
+
398
+ Options:
399
+ --screen <name> Tag specific screen (optional, defaults to all)
400
+ --dry-run Preview changes without modifying files
401
+ --force Overwrite existing data-testid (use with caution)
402
+ --verbose Show detailed changes
403
+
404
+ Examples:
405
+ sungen auto-tag --screen login --dry-run # Preview changes
406
+ sungen auto-tag --screen login # Apply changes
407
+ sungen auto-tag # Tag all screens
408
+ ```
409
+
410
+ **What it does:**
411
+ - Scans React/Vue/HTML source code for interactive elements
412
+ - Injects `data-testid="screen-element"` attributes
413
+ - Idempotent (skips if `data-testid` already exists)
414
+ - Preserves code formatting (Prettier/ESLint compatible)
415
+
416
+ **Before:**
417
+ ```tsx
418
+ <input type="email" name="email" />
419
+ <button onClick={handleSubmit}>Login</button>
420
+ ```
421
+
422
+ **After:**
423
+ ```tsx
424
+ <input type="email" name="email" data-testid="login-email-input" />
425
+ <button onClick={handleSubmit} data-testid="login-submit-btn">Login</button>
426
+ ```
427
+
428
+ ---
429
+
430
+ ## šŸŽ“ Examples
431
+
432
+ See the `/examples` folder for complete working examples:
433
+
434
+ - **ai-chat** - Chat application with authentication
435
+ - More examples coming soon!
436
+
437
+ ---
438
+
439
+ ## šŸ“š Documentation
440
+
441
+ ### Getting Started
442
+ - **[Documentation Index](docs/README.md)** - Start here for all documentation
443
+ - **[Implementation Guide](docs/IMPLEMENTATION_GUIDE.md)** ⭐ **Core reference**
444
+ - Kim chỉ nam (North Star Principles)
445
+ - Architecture overview
446
+ - Implementation roadmap
447
+ - Best practices
448
+
449
+ ### Core Guides
450
+ - **[System Overview](docs/SYSTEM_OVERVIEW.md)** - High-level architecture
451
+ - **[Gherkin Standards](docs/GHERKIN_STANDARDS.md)** - Gherkin syntax and conventions
452
+ - **[Selector Override Guide](docs/SELECTOR_OVERRIDE_GUIDE.md)** - How to fix AI mapping errors
453
+ - **[Debugging Guide](docs/DEBUGGING_GUIDE.md)** - Troubleshooting common issues
454
+
455
+ ### Recent Updates
456
+ - **[Improvement Summary](docs/IMPROVEMENT_SUMMARY.md)** - Latest fixes and improvements (Dec 2025)
457
+ - Test results: 1 → 6 passed (+500%)
458
+ - Selector override mechanism
459
+ - Heuristic mapper implementation
460
+ - Complete test-data structure
461
+
462
+ ### Quick Links
463
+ - **For QA**: Start with [Gherkin Standards](docs/GHERKIN_STANDARDS.md)
464
+ - **For Developers**: Read [Implementation Guide](docs/IMPLEMENTATION_GUIDE.md)
465
+ - **Fix AI Errors**: Use [Selector Override](docs/SELECTOR_OVERRIDE_GUIDE.md)
466
+
467
+ ---
468
+
469
+ ## šŸ¤ Contributing
470
+
471
+ Contributions are welcome! Please read our contributing guidelines and follow the **Kim chỉ nam (North Star Principles)** in the [Implementation Guide](docs/IMPLEMENTATION_GUIDE.md).
472
+
473
+ ---
474
+
475
+ ## šŸ“ License
476
+
477
+ MIT License - see LICENSE file for details
478
+
479
+ ---
480
+
481
+ ## šŸ™ Credits
482
+
483
+ - Built with [Claude Sonnet 4.5](https://www.anthropic.com/claude)
484
+ - Uses [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript)
485
+ - Powered by [Playwright](https://playwright.dev/)
486
+ - Gherkin parsing by [@cucumber/gherkin](https://github.com/cucumber/gherkin)
487
+
488
+ ---
489
+
490
+ **Made with ā¤ļø by Bach Ngoc Hoai**
package/bin/sungen.js ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Sungen CLI Entry Point
5
+ * This file is the executable entry point for the sungen command
6
+ */
7
+
8
+ // Import tsx loader and run the CLI
9
+ require('tsx/cjs/api').register();
10
+
11
+ // Load and execute the CLI
12
+ require('../src/cli/index.ts');
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Auto-Tag CLI Command
3
+ * Injects data-testid attributes into source code
4
+ */
5
+ import { Command } from 'commander';
6
+ import { RuntimeConfig } from '../../config/config-schema';
7
+ export declare function createAutoTagCommand(config: RuntimeConfig): Command;
8
+ //# sourceMappingURL=auto-tag-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-tag-command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auto-tag-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAqEnE"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * Auto-Tag CLI Command
4
+ * Injects data-testid attributes into source code
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.createAutoTagCommand = createAutoTagCommand;
41
+ const commander_1 = require("commander");
42
+ const auto_tagger_1 = require("../../tools/auto-tagger");
43
+ const path = __importStar(require("path"));
44
+ function createAutoTagCommand(config) {
45
+ const cmd = new commander_1.Command('auto-tag');
46
+ cmd
47
+ .description('Auto-inject stable data-testid attributes into source code')
48
+ .option('--screen <name>', 'Tag specific screen (optional, defaults to all)')
49
+ .option('--dry-run', 'Preview changes without modifying files', false)
50
+ .option('--force', 'Overwrite existing data-testid attributes', false)
51
+ .option('--verbose', 'Show detailed output', false)
52
+ .action(async (options) => {
53
+ try {
54
+ console.log('\nšŸ·ļø Sungen Auto-Tagger\n');
55
+ // Build config
56
+ const autoTagConfig = {
57
+ sourceRoot: path.resolve(config.paths.sourceRoot),
58
+ projectRoot: process.cwd(),
59
+ screenName: options.screen,
60
+ dryRun: options.dryRun,
61
+ force: options.force,
62
+ verbose: options.verbose,
63
+ preserveFormatting: false,
64
+ };
65
+ if (options.dryRun) {
66
+ console.log('šŸ” DRY RUN MODE - No files will be modified\n');
67
+ }
68
+ if (options.screen) {
69
+ console.log(`šŸ“ Tagging screen: ${options.screen}\n`);
70
+ }
71
+ else {
72
+ console.log('šŸ“ Tagging all screens\n');
73
+ }
74
+ // Run auto-tagger
75
+ const tagger = new auto_tagger_1.AutoTagger(autoTagConfig);
76
+ const stats = await tagger.tag();
77
+ // Display results
78
+ console.log('\nšŸ“Š RESULTS:\n');
79
+ console.log(`Files Processed: ${stats.totalFiles}`);
80
+ console.log(`Files Modified: ${stats.modifiedFiles}`);
81
+ console.log(`Total Elements: ${stats.totalElements}`);
82
+ console.log(`Elements Tagged: ${stats.taggedElements}`);
83
+ console.log(`Elements Skipped: ${stats.skippedElements}`);
84
+ console.log(`Processing Time: ${stats.processingTime}ms`);
85
+ if (stats.taggedElements > 0) {
86
+ const coverage = ((stats.taggedElements / stats.totalElements) * 100).toFixed(1);
87
+ console.log(`\n✨ Coverage: ${coverage}% of interactive elements now have data-testid`);
88
+ }
89
+ if (options.dryRun && stats.taggedElements > 0) {
90
+ console.log(`\nšŸ’” Run without --dry-run to apply changes`);
91
+ }
92
+ if (!options.dryRun && stats.modifiedFiles > 0) {
93
+ console.log(`\nāœ… Successfully tagged ${stats.taggedElements} elements in ${stats.modifiedFiles} files`);
94
+ }
95
+ console.log('');
96
+ }
97
+ catch (error) {
98
+ console.error('\nāŒ Auto-tagging failed:', error.message);
99
+ process.exit(1);
100
+ }
101
+ });
102
+ return cmd;
103
+ }
104
+ //# sourceMappingURL=auto-tag-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-tag-command.js","sourceRoot":"","sources":["../../../src/cli/commands/auto-tag-command.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOH,oDAqEC;AA1ED,yCAAoC;AACpC,yDAAoE;AAEpE,2CAA6B;AAE7B,SAAgB,oBAAoB,CAAC,MAAqB;IACxD,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC;IAEpC,GAAG;SACA,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;SAC5E,MAAM,CAAC,WAAW,EAAE,yCAAyC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,SAAS,EAAE,2CAA2C,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAE3C,eAAe;YACf,MAAM,aAAa,GAAkB;gBACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjD,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gBAC1B,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,kBAAkB,EAAE,KAAK;aAC1B,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAC1C,CAAC;YAED,kBAAkB;YAClB,MAAM,MAAM,GAAG,IAAI,wBAAU,CAAC,aAAa,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;YAEjC,kBAAkB;YAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;YAE9D,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,gDAAgD,CAAC,CAAC;YACzF,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,cAAc,gBAAgB,KAAK,CAAC,aAAa,QAAQ,CAAC,CAAC;YAC1G,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Sungen CLI - AI-Native E2E Test Generator
4
+ * Command-line interface for generating E2E tests from Gherkin features
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}