@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,315 @@
1
+ /**
2
+ * Project Initializer
3
+ * Creates essential directory structure for Sungen pipeline
4
+ */
5
+
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+
9
+ export class ProjectInitializer {
10
+ private cwd: string;
11
+ private createdItems: string[] = [];
12
+ private skippedItems: string[] = [];
13
+
14
+ constructor() {
15
+ this.cwd = process.cwd();
16
+ }
17
+
18
+ /**
19
+ * Initialize project with essential directories and config
20
+ */
21
+ async initialize(): Promise<void> {
22
+ console.log('🚀 Initializing Sungen project...\n');
23
+
24
+ // Create directories
25
+ this.createDirectories();
26
+
27
+ // Create playwright config if doesn't exist
28
+ this.createPlaywrightConfig();
29
+
30
+ // Create/update .gitignore
31
+ this.updateGitignore();
32
+
33
+ // Create README
34
+ this.createReadme();
35
+
36
+ // Display summary
37
+ this.displaySummary();
38
+ }
39
+
40
+ /**
41
+ * Create essential directories only
42
+ */
43
+ private createDirectories(): void {
44
+ const dirs = [
45
+ 'qa',
46
+ 'qa/screens',
47
+ 'specs',
48
+ 'specs/generated'
49
+ ];
50
+
51
+ for (const dir of dirs) {
52
+ const fullPath = path.join(this.cwd, dir);
53
+ if (!fs.existsSync(fullPath)) {
54
+ fs.mkdirSync(fullPath, { recursive: true });
55
+ this.createdItems.push(dir + '/');
56
+ } else {
57
+ this.skippedItems.push(dir + '/');
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Create Playwright configuration
64
+ */
65
+ private createPlaywrightConfig(): void {
66
+ const configPath = path.join(this.cwd, 'playwright.config.ts');
67
+
68
+ if (fs.existsSync(configPath)) {
69
+ this.skippedItems.push('playwright.config.ts');
70
+ return;
71
+ }
72
+
73
+ const configContent = this.getPlaywrightConfigTemplate();
74
+ fs.writeFileSync(configPath, configContent, 'utf-8');
75
+ this.createdItems.push('playwright.config.ts');
76
+ }
77
+
78
+ /**
79
+ * Update .gitignore with Sungen-specific entries
80
+ */
81
+ private updateGitignore(): void {
82
+ const gitignorePath = path.join(this.cwd, '.gitignore');
83
+ const sungenEntries = [
84
+ '# Sungen generated files',
85
+ 'specs/generated/',
86
+ 'test-results/',
87
+ 'playwright-report/'
88
+ ];
89
+
90
+ if (!fs.existsSync(gitignorePath)) {
91
+ // Create new .gitignore with Node.js patterns
92
+ const content = this.getGitignoreTemplate() + '\n' + sungenEntries.join('\n') + '\n';
93
+ fs.writeFileSync(gitignorePath, content, 'utf-8');
94
+ this.createdItems.push('.gitignore');
95
+ } else {
96
+ // Append Sungen entries if not already present
97
+ let content = fs.readFileSync(gitignorePath, 'utf-8');
98
+ const needsUpdate = !content.includes('specs/generated/');
99
+
100
+ if (needsUpdate) {
101
+ content += '\n' + sungenEntries.join('\n') + '\n';
102
+ fs.writeFileSync(gitignorePath, content, 'utf-8');
103
+ this.createdItems.push('.gitignore (updated)');
104
+ } else {
105
+ this.skippedItems.push('.gitignore');
106
+ }
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Create README documentation
112
+ */
113
+ private createReadme(): void {
114
+ const readmePath = path.join(this.cwd, 'README.md');
115
+
116
+ if (fs.existsSync(readmePath)) {
117
+ this.skippedItems.push('README.md');
118
+ return;
119
+ }
120
+
121
+ const readmeContent = this.getReadmeTemplate();
122
+ fs.writeFileSync(readmePath, readmeContent, 'utf-8');
123
+ this.createdItems.push('README.md');
124
+ }
125
+
126
+ /**
127
+ * Display initialization summary
128
+ */
129
+ private displaySummary(): void {
130
+ console.log('✅ Sungen initialized successfully!\n');
131
+
132
+ if (this.createdItems.length > 0) {
133
+ console.log('Created:');
134
+ this.createdItems.forEach(item => {
135
+ console.log(` ✓ ${item}`);
136
+ });
137
+ }
138
+
139
+ if (this.skippedItems.length > 0) {
140
+ console.log('\nAlready exists:');
141
+ this.skippedItems.forEach(item => {
142
+ console.log(` ⊳ ${item}`);
143
+ });
144
+ }
145
+
146
+ // Check for Playwright installation
147
+ this.checkDependencies();
148
+
149
+ console.log('\nNext steps:');
150
+ console.log(' 1. Review README.md for workflow overview');
151
+ console.log(' 2. Create your first screen with: sungen add --screen <name>');
152
+ console.log(' 3. Generate mapped tests with: sungen map --screen <name> | sungen map --all');
153
+ console.log(' 4. Generate tests with: sungen generate --screen <name> | sungen generate --all\n');
154
+ }
155
+
156
+ /**
157
+ * Check for required dependencies
158
+ */
159
+ private checkDependencies(): void {
160
+ try {
161
+ const packageJsonPath = path.join(this.cwd, 'package.json');
162
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
163
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
164
+
165
+ if (!deps['@playwright/test']) {
166
+ console.log('\n⚠️ Playwright not detected. Install with:');
167
+ console.log(' npm install -D @playwright/test');
168
+ console.log(' npx playwright install');
169
+ }
170
+ } catch (error) {
171
+ // Ignore if can't read package.json
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Get Playwright configuration template
177
+ */
178
+ private getPlaywrightConfigTemplate(): string {
179
+ return `import { defineConfig, devices } from '@playwright/test';
180
+
181
+ /**
182
+ * Playwright Test Configuration
183
+ * See https://playwright.dev/docs/test-configuration
184
+ */
185
+ export default defineConfig({
186
+ testDir: './specs/generated',
187
+
188
+ fullyParallel: true,
189
+
190
+ forbidOnly: !!process.env.CI,
191
+
192
+ retries: process.env.CI ? 2 : 0,
193
+
194
+ workers: process.env.CI ? 1 : undefined,
195
+
196
+ reporter: 'html',
197
+
198
+ use: {
199
+ baseURL: 'http://localhost:3000',
200
+
201
+ trace: 'on-first-retry',
202
+ },
203
+
204
+ projects: [
205
+ {
206
+ name: 'chromium',
207
+ use: { ...devices['Desktop Chrome'] },
208
+ },
209
+
210
+ {
211
+ name: 'firefox',
212
+ use: { ...devices['Desktop Firefox'] },
213
+ },
214
+
215
+ {
216
+ name: 'webkit',
217
+ use: { ...devices['Desktop Safari'] },
218
+ },
219
+ ],
220
+
221
+ webServer: {
222
+ command: 'npm run dev',
223
+ url: 'http://localhost:3000',
224
+ reuseExistingServer: !process.env.CI,
225
+ },
226
+ });
227
+ `;
228
+ }
229
+
230
+ /**
231
+ * Get .gitignore template
232
+ */
233
+ private getGitignoreTemplate(): string {
234
+ return `# Dependencies
235
+ node_modules/
236
+
237
+ # Build output
238
+ dist/
239
+ build/
240
+
241
+ # Environment variables
242
+ .env
243
+ .env.local
244
+
245
+ # IDE
246
+ .vscode/
247
+ .idea/
248
+ *.swp
249
+ *.swo
250
+ `;
251
+ }
252
+
253
+ /**
254
+ * Get README template
255
+ */
256
+ private getReadmeTemplate(): string {
257
+ return `# Sungen Test Automation
258
+
259
+ This project uses [Sungen](https://github.com/sun-asterisk/sungen) for AI-native E2E test generation.
260
+
261
+ ## Directory Structure
262
+
263
+ \`\`\`
264
+ ├── qa/
265
+ │ └── screens/ # Screen definitions and selectors
266
+ └── specs/
267
+ └── generated/ # Auto-generated Playwright tests
268
+ \`\`\`
269
+
270
+ ## Workflow
271
+
272
+ ### 1. Add new Screens
273
+ Define a new screen for your application:
274
+
275
+ \`\`\`bash
276
+ sungen add --screen login
277
+ \`\`\`
278
+
279
+ ### 2. Generate mapped or full tests
280
+ Generate mapper elements for a specific screen or all screens:
281
+
282
+ \`\`\`bash
283
+ sungen map --screen login
284
+ # or
285
+ sungen map --all
286
+ \`\`\`
287
+
288
+ ### 4. Generate full Playwright tests
289
+ Generate complete tests based on mapped elements:
290
+
291
+ \`\`\`bash
292
+ sungen generate --screen login
293
+ # or for all screens
294
+ sungen generate --all
295
+ \`\`\`
296
+
297
+ ## Configuration
298
+
299
+ Edit \`sungen.config.yaml\` to customize:
300
+ - Source root directory
301
+ - UI framework (react/vue/html)
302
+ - AI provider settings
303
+ - Test generation options
304
+
305
+ ## Documentation
306
+
307
+ - [Sungen Documentation](https://github.com/sun-asterisk/sungen)
308
+ - [Playwright Documentation](https://playwright.dev)
309
+
310
+ ## Learn More
311
+
312
+ Visit the [Sungen GitHub repository](https://github.com/sun-asterisk/sungen) for detailed guides and examples.
313
+ `;
314
+ }
315
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Reporter
3
+ * Generates reports for test generation results
4
+ */
5
+
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import { RuntimeConfig } from '../config/config-schema';
9
+ import { GeneratedTest } from '../executor/test-generator';
10
+
11
+ export class Reporter {
12
+ private config: RuntimeConfig;
13
+
14
+ constructor(config: RuntimeConfig) {
15
+ this.config = config;
16
+ }
17
+
18
+ /**
19
+ * Generate report for test generation results
20
+ */
21
+ async generate(results: GeneratedTest[]): Promise<void> {
22
+ if (!this.config.verbose) {
23
+ return;
24
+ }
25
+
26
+ const totalScenarios = results.reduce((sum, r) => sum + r.stats.totalScenarios, 0);
27
+ const totalSteps = results.reduce((sum, r) => sum + r.stats.totalSteps, 0);
28
+ const totalTodos = results.reduce((sum, r) => sum + r.stats.todoCount, 0);
29
+
30
+ console.log('\n📊 Generation Report:');
31
+ console.log(` Features: ${results.length}`);
32
+ console.log(` Scenarios: ${totalScenarios}`);
33
+ console.log(` Steps: ${totalSteps}`);
34
+ console.log(` TODOs: ${totalTodos}`);
35
+ }
36
+ }
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Screen Manager
3
+ * Manages screen definition files in qa/screens directory
4
+ */
5
+
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+
9
+ export interface ScreenOptions {
10
+ name: string;
11
+ path?: string;
12
+ description?: string;
13
+ }
14
+
15
+ export class ScreenManager {
16
+ private cwd: string;
17
+ private screensDir: string;
18
+
19
+ constructor() {
20
+ this.cwd = process.cwd();
21
+ this.screensDir = path.join(this.cwd, 'qa', 'screens');
22
+ }
23
+
24
+ /**
25
+ * Add a new screen definition
26
+ */
27
+ async addScreen(options: ScreenOptions): Promise<void> {
28
+ console.log(`📱 Adding screen: ${options.name}...\n`);
29
+
30
+ // Validate screen name
31
+ this.validateScreenName(options.name);
32
+
33
+ // Normalize screen name for directory
34
+ const screenName = this.normalizeScreenName(options.name);
35
+ const screenDir = path.join(this.screensDir, screenName);
36
+
37
+ // Derive filename from path or use screen name
38
+ const filename = options.path
39
+ ? this.extractFilenameFromPath(options.path)
40
+ : screenName;
41
+
42
+ // Create directory structure
43
+ const featuresDir = path.join(screenDir, 'features');
44
+ const selectorsDir = path.join(screenDir, 'selectors');
45
+ const testDataDir = path.join(screenDir, 'test-data');
46
+
47
+ // File paths
48
+ const featurePath = path.join(featuresDir, `${filename}.feature`);
49
+ const selectorPath = path.join(selectorsDir, `${filename}.yaml`);
50
+ const testDataPath = path.join(testDataDir, `${filename}.yaml`);
51
+
52
+ // Smart behavior: Create dirs only if first file
53
+ const isFirstFile = !fs.existsSync(screenDir);
54
+
55
+ if (isFirstFile) {
56
+ console.log(`📱 Creating screen: ${options.name}...\n`);
57
+
58
+ // Create directories
59
+ try {
60
+ if (!fs.existsSync(this.screensDir)) {
61
+ fs.mkdirSync(this.screensDir, { recursive: true });
62
+ console.log(`✓ Created directory: qa/screens/\n`);
63
+ }
64
+ fs.mkdirSync(featuresDir, { recursive: true });
65
+ fs.mkdirSync(selectorsDir, { recursive: true });
66
+ fs.mkdirSync(testDataDir, { recursive: true });
67
+ } catch (error) {
68
+ console.error(`❌ Error: Failed to create directories`);
69
+ console.error(` ${error instanceof Error ? error.message : String(error)}`);
70
+ console.error(' Check file permissions and try again.\n');
71
+ process.exit(1);
72
+ }
73
+ } else {
74
+ console.log(`📄 Adding feature to screen: ${options.name}...\n`);
75
+ }
76
+
77
+ // Check file existence to prevent overwrite
78
+ if (fs.existsSync(featurePath)) {
79
+ console.error(`❌ Error: Feature file "${filename}.feature" already exists`);
80
+ console.error(` Path: ${featurePath}`);
81
+ console.error(` Use a different --path value or delete existing file.`);
82
+ process.exit(1);
83
+ }
84
+
85
+ // Generate and write feature file
86
+ const featureContent = this.generateFeatureTemplate(options, filename);
87
+ try {
88
+ fs.writeFileSync(featurePath, featureContent, 'utf-8');
89
+ } catch (error) {
90
+ console.error(`❌ Error: Failed to create feature file at ${featurePath}`);
91
+ console.error(` ${error instanceof Error ? error.message : String(error)}`);
92
+ process.exit(1);
93
+ }
94
+
95
+ // Generate and write selector file
96
+ const selectorContent = this.generateSelectorTemplate(options, filename);
97
+ try {
98
+ fs.writeFileSync(selectorPath, selectorContent, 'utf-8');
99
+ } catch (error) {
100
+ console.error(`❌ Error: Failed to create selector file at ${selectorPath}`);
101
+ console.error(` ${error instanceof Error ? error.message : String(error)}`);
102
+ process.exit(1);
103
+ }
104
+
105
+ // Generate and write test data file
106
+ const testDataContent = this.generateTestDataTemplate(options);
107
+ try {
108
+ fs.writeFileSync(testDataPath, testDataContent, 'utf-8');
109
+ } catch (error) {
110
+ console.error(`❌ Error: Failed to create test data file at ${testDataPath}`);
111
+ console.error(` ${error instanceof Error ? error.message : String(error)}`);
112
+ process.exit(1);
113
+ }
114
+
115
+ // Display success message
116
+ if (isFirstFile) {
117
+ console.log(`✓ Created screen: ${options.name} at ${screenDir}`);
118
+ } else {
119
+ console.log(`✓ Added feature: ${filename} to ${screenName}`);
120
+ }
121
+
122
+ this.displaySuccess(options.name, filename, screenDir);
123
+ }
124
+
125
+ /**
126
+ * Validate screen name
127
+ */
128
+ private validateScreenName(name: string): void {
129
+ if (!name || name.trim().length === 0) {
130
+ console.error('❌ Error: Screen name cannot be empty');
131
+ process.exit(1);
132
+ }
133
+
134
+ // Check if name contains at least one alphanumeric character
135
+ if (!/[a-zA-Z0-9]/.test(name)) {
136
+ console.error('❌ Error: Screen name must contain at least one alphanumeric character');
137
+ console.error(' Valid examples: login, user-profile, Dashboard');
138
+ process.exit(1);
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Normalize screen name to kebab-case for filename
144
+ */
145
+ private normalizeScreenName(name: string): string {
146
+ return name
147
+ .toLowerCase()
148
+ .replace(/[^a-z0-9]+/g, '-')
149
+ .replace(/^-+|-+$/g, '')
150
+ .replace(/-+/g, '-');
151
+ }
152
+
153
+ /**
154
+ * Extract filename from path value
155
+ */
156
+ private extractFilenameFromPath(pathString: string): string {
157
+ // Remove leading and trailing slashes
158
+ const cleanPath = pathString.replace(/^\/+/, '').replace(/\/+$/, '');
159
+
160
+ // Split by '/' and take last segment
161
+ const segments = cleanPath.split('/');
162
+ const lastSegment = segments[segments.length - 1];
163
+
164
+ // Normalize to kebab-case
165
+ return this.normalizeScreenName(lastSegment);
166
+ }
167
+
168
+ /**
169
+ * Generate feature file template
170
+ */
171
+ private generateFeatureTemplate(options: ScreenOptions, filename: string): string {
172
+ const screenName = this.normalizeScreenName(options.name);
173
+ const featurePath = options.path || `/${screenName}`;
174
+ const description = options.description || `interact with the ${options.name} screen`;
175
+
176
+ return `Feature: ${options.name} Screen
177
+
178
+ As a user
179
+ I want to ${description}
180
+ So that I can accomplish my tasks
181
+ Path: ${featurePath}
182
+
183
+ @high
184
+ Scenario: Sample scenario for ${options.name}
185
+ Given User open page
186
+ When User click [element] button
187
+ Then User see [result] text with {{success}}
188
+ `;
189
+ }
190
+
191
+ /**
192
+ * Generate selector YAML template
193
+ */
194
+ private generateSelectorTemplate(options: ScreenOptions, filename: string): string {
195
+ const timestamp = new Date().toISOString().split('T')[0];
196
+ const screenPath = options.path || '';
197
+
198
+ return `# ${options.name} Screen Selectors
199
+ # Created: ${timestamp}
200
+ ${screenPath ? `# Path: ${screenPath}` : '# Path: (not specified - update as needed)'}
201
+
202
+ # Example element - replace with actual elements or use 'sungen map'
203
+ #
204
+ # Element structure:
205
+ # key: element-identifier
206
+ # selector: "" # Playwright selector
207
+ # type: text|role|placeholder|testid|xpath
208
+ # value: "text content" # Element value/text/label
209
+ # name: "Display Name" # Optional: readable name
210
+ # nth: 0 # Optional: element index if multiple matches
211
+
212
+ # element:
213
+ # selector: ""
214
+ # type: role
215
+ # value: "button"
216
+ # name: "element"
217
+ # nth: 0
218
+
219
+ # Next steps:
220
+ # 1. Edit the feature file: qa/screens/${filename}/features/${filename}.feature
221
+ # 2. Run: sungen map --screen ${filename}
222
+ # This will populate selectors from your feature file
223
+ #
224
+ # Documentation: https://github.com/sun-asterisk/sungen
225
+ `;
226
+ }
227
+
228
+ /**
229
+ * Generate test data YAML template
230
+ */
231
+ private generateTestDataTemplate(options: ScreenOptions): string {
232
+ const timestamp = new Date().toISOString().split('T')[0];
233
+
234
+ return `# ${options.name} Screen Test Data
235
+ # Created: ${timestamp}
236
+
237
+ # Define test data variables here
238
+ # Example:
239
+ # success: "Operation completed successfully"
240
+ # username: "testuser@example.com"
241
+ # password: "SecurePassword123"
242
+
243
+ # Next steps:
244
+ # 1. Add test data variables referenced in your feature scenarios
245
+ # 2. Use {{variable}} syntax in your feature files to reference these values
246
+ `;
247
+ }
248
+
249
+ /**
250
+ * Display success message with next steps
251
+ */
252
+ private displaySuccess(name: string, filename: string, screenDir: string): void {
253
+ console.log('✅ Screen definition created successfully!\n');
254
+ console.log(`Screen: ${name}`);
255
+ console.log(`Path: ${screenDir}\n`);
256
+
257
+ console.log('Created files:');
258
+ console.log(` 📄 ${path.join(screenDir, 'features', `${filename}.feature`)}`);
259
+ console.log(` 📄 ${path.join(screenDir, 'selectors', `${filename}.yaml`)}`);
260
+ console.log(` 📄 ${path.join(screenDir, 'test-data', `${filename}.yaml`)}\n`);
261
+
262
+ console.log('Next steps:');
263
+ console.log(` 1. Edit the Gherkin feature file to define test scenarios`);
264
+ console.log(` 2. Run: sungen map --screen ${filename}`);
265
+ console.log(` This will generate selector mappings from your feature file\n`);
266
+ console.log('Documentation: https://github.com/sun-asterisk/sungen');
267
+ }
268
+ }