@sun-asterisk/sungen 1.0.24 → 2.0.1

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 (378) hide show
  1. package/README.md +198 -74
  2. package/dist/cli/commands/add.d.ts.map +1 -1
  3. package/dist/cli/commands/add.js +5 -3
  4. package/dist/cli/commands/add.js.map +1 -1
  5. package/dist/cli/commands/generate.d.ts.map +1 -1
  6. package/dist/cli/commands/generate.js +110 -35
  7. package/dist/cli/commands/generate.js.map +1 -1
  8. package/dist/cli/index.d.ts +2 -2
  9. package/dist/cli/index.js +5 -16
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
  12. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
  13. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
  14. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
  15. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
  16. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
  17. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
  18. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
  19. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
  20. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
  21. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
  22. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
  23. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
  24. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
  25. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
  26. package/dist/generators/test-generator/code-generator.d.ts +0 -1
  27. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  28. package/dist/generators/test-generator/code-generator.js +10 -47
  29. package/dist/generators/test-generator/code-generator.js.map +1 -1
  30. package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
  31. package/dist/generators/test-generator/patterns/assertion-patterns.js +2 -0
  32. package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
  33. package/dist/generators/test-generator/patterns/index.d.ts +4 -1
  34. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  35. package/dist/generators/test-generator/patterns/index.js +17 -5
  36. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  37. package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
  38. package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
  39. package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
  40. package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
  41. package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
  42. package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
  43. package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
  44. package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
  45. package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
  46. package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
  47. package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
  48. package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
  49. package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
  50. package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
  51. package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
  52. package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
  53. package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
  54. package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
  55. package/dist/generators/test-generator/step-mapper.d.ts +5 -3
  56. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  57. package/dist/generators/test-generator/step-mapper.js +38 -27
  58. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  59. package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
  60. package/dist/generators/test-generator/template-engine.js +4 -1
  61. package/dist/generators/test-generator/template-engine.js.map +1 -1
  62. package/dist/generators/test-generator/types.d.ts +7 -24
  63. package/dist/generators/test-generator/types.d.ts.map +1 -1
  64. package/dist/generators/test-generator/types.js +2 -101
  65. package/dist/generators/test-generator/types.js.map +1 -1
  66. package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
  67. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  68. package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
  69. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  70. package/dist/orchestrator/project-initializer.d.ts +12 -0
  71. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  72. package/dist/orchestrator/project-initializer.js +72 -160
  73. package/dist/orchestrator/project-initializer.js.map +1 -1
  74. package/dist/orchestrator/screen-manager.d.ts +1 -32
  75. package/dist/orchestrator/screen-manager.d.ts.map +1 -1
  76. package/dist/orchestrator/screen-manager.js +55 -216
  77. package/dist/orchestrator/screen-manager.js.map +1 -1
  78. package/dist/orchestrator/templates/ai-rules.md +189 -0
  79. package/dist/orchestrator/templates/gitignore +16 -0
  80. package/dist/orchestrator/templates/playwright.config.d.ts +10 -0
  81. package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -0
  82. package/dist/orchestrator/templates/playwright.config.js +77 -0
  83. package/dist/orchestrator/templates/playwright.config.js.map +1 -0
  84. package/dist/orchestrator/templates/playwright.config.ts +80 -0
  85. package/dist/orchestrator/templates/readme.md +197 -0
  86. package/dist/utils/selector-types.d.ts +1 -1
  87. package/dist/utils/selector-types.d.ts.map +1 -1
  88. package/dist/utils/selector-types.js +3 -0
  89. package/dist/utils/selector-types.js.map +1 -1
  90. package/docs/gherkin standards/gherkin-core-standard.md +377 -0
  91. package/docs/gherkin standards/gherkin-core-standard.vi.md +303 -0
  92. package/docs/gherkin-dictionary.md +1071 -0
  93. package/docs/makeauth.md +225 -0
  94. package/package.json +4 -3
  95. package/src/cli/commands/add.ts +5 -3
  96. package/src/cli/commands/generate.ts +90 -38
  97. package/src/cli/index.ts +5 -16
  98. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
  99. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
  100. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
  101. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
  102. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
  103. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
  104. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
  105. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
  106. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
  107. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
  108. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
  109. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
  110. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
  111. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
  112. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
  113. package/src/generators/test-generator/code-generator.ts +11 -59
  114. package/src/generators/test-generator/patterns/assertion-patterns.ts +2 -0
  115. package/src/generators/test-generator/patterns/index.ts +12 -3
  116. package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
  117. package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
  118. package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
  119. package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
  120. package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
  121. package/src/generators/test-generator/step-mapper.ts +42 -27
  122. package/src/generators/test-generator/template-engine.ts +3 -1
  123. package/src/generators/test-generator/types.ts +7 -112
  124. package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
  125. package/src/orchestrator/project-initializer.ts +75 -160
  126. package/src/orchestrator/screen-manager.ts +61 -233
  127. package/src/orchestrator/templates/ai-rules.md +189 -0
  128. package/src/orchestrator/templates/gitignore +16 -0
  129. package/src/orchestrator/templates/playwright.config.ts +80 -0
  130. package/src/orchestrator/templates/readme.md +197 -0
  131. package/src/utils/selector-types.ts +3 -0
  132. package/dist/cli/commands/cache-clear.d.ts +0 -3
  133. package/dist/cli/commands/cache-clear.d.ts.map +0 -1
  134. package/dist/cli/commands/cache-clear.js +0 -24
  135. package/dist/cli/commands/cache-clear.js.map +0 -1
  136. package/dist/cli/commands/full.d.ts +0 -3
  137. package/dist/cli/commands/full.d.ts.map +0 -1
  138. package/dist/cli/commands/full.js +0 -37
  139. package/dist/cli/commands/full.js.map +0 -1
  140. package/dist/cli/commands/live-scan.d.ts +0 -3
  141. package/dist/cli/commands/live-scan.d.ts.map +0 -1
  142. package/dist/cli/commands/live-scan.js +0 -78
  143. package/dist/cli/commands/live-scan.js.map +0 -1
  144. package/dist/cli/commands/map.d.ts +0 -3
  145. package/dist/cli/commands/map.d.ts.map +0 -1
  146. package/dist/cli/commands/map.js +0 -93
  147. package/dist/cli/commands/map.js.map +0 -1
  148. package/dist/cli/commands/validate.d.ts +0 -3
  149. package/dist/cli/commands/validate.d.ts.map +0 -1
  150. package/dist/cli/commands/validate.js +0 -43
  151. package/dist/cli/commands/validate.js.map +0 -1
  152. package/dist/cli/utils.d.ts +0 -6
  153. package/dist/cli/utils.d.ts.map +0 -1
  154. package/dist/cli/utils.js +0 -101
  155. package/dist/cli/utils.js.map +0 -1
  156. package/dist/config/config-loader.d.ts +0 -51
  157. package/dist/config/config-loader.d.ts.map +0 -1
  158. package/dist/config/config-loader.js +0 -216
  159. package/dist/config/config-loader.js.map +0 -1
  160. package/dist/config/config-schema.d.ts +0 -121
  161. package/dist/config/config-schema.d.ts.map +0 -1
  162. package/dist/config/config-schema.js +0 -7
  163. package/dist/config/config-schema.js.map +0 -1
  164. package/dist/core/live-scanner/config-reader.d.ts +0 -10
  165. package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
  166. package/dist/core/live-scanner/config-reader.js +0 -87
  167. package/dist/core/live-scanner/config-reader.js.map +0 -1
  168. package/dist/core/live-scanner/element-finder.d.ts +0 -20
  169. package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
  170. package/dist/core/live-scanner/element-finder.js +0 -481
  171. package/dist/core/live-scanner/element-finder.js.map +0 -1
  172. package/dist/core/live-scanner/index.d.ts +0 -8
  173. package/dist/core/live-scanner/index.d.ts.map +0 -1
  174. package/dist/core/live-scanner/index.js +0 -33
  175. package/dist/core/live-scanner/index.js.map +0 -1
  176. package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
  177. package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
  178. package/dist/core/live-scanner/matrix-reader.js +0 -60
  179. package/dist/core/live-scanner/matrix-reader.js.map +0 -1
  180. package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
  181. package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
  182. package/dist/core/live-scanner/matrix-writer.js +0 -103
  183. package/dist/core/live-scanner/matrix-writer.js.map +0 -1
  184. package/dist/core/live-scanner/role-fallback.d.ts +0 -15
  185. package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
  186. package/dist/core/live-scanner/role-fallback.js +0 -46
  187. package/dist/core/live-scanner/role-fallback.js.map +0 -1
  188. package/dist/core/live-scanner/scanner.d.ts +0 -22
  189. package/dist/core/live-scanner/scanner.d.ts.map +0 -1
  190. package/dist/core/live-scanner/scanner.js +0 -303
  191. package/dist/core/live-scanner/scanner.js.map +0 -1
  192. package/dist/core/live-scanner/step-replayer.d.ts +0 -26
  193. package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
  194. package/dist/core/live-scanner/step-replayer.js +0 -473
  195. package/dist/core/live-scanner/step-replayer.js.map +0 -1
  196. package/dist/core/live-scanner/types.d.ts +0 -52
  197. package/dist/core/live-scanner/types.d.ts.map +0 -1
  198. package/dist/core/live-scanner/types.js +0 -14
  199. package/dist/core/live-scanner/types.js.map +0 -1
  200. package/dist/core/selector-base/annotation-handler.d.ts +0 -45
  201. package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
  202. package/dist/core/selector-base/annotation-handler.js +0 -102
  203. package/dist/core/selector-base/annotation-handler.js.map +0 -1
  204. package/dist/core/selector-base/base-generator.d.ts +0 -49
  205. package/dist/core/selector-base/base-generator.d.ts.map +0 -1
  206. package/dist/core/selector-base/base-generator.js +0 -214
  207. package/dist/core/selector-base/base-generator.js.map +0 -1
  208. package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
  209. package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
  210. package/dist/core/selector-base/gherkin-parser.js +0 -42
  211. package/dist/core/selector-base/gherkin-parser.js.map +0 -1
  212. package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
  213. package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
  214. package/dist/core/selector-mapper/priority-mapper.js +0 -477
  215. package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
  216. package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
  217. package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
  218. package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
  219. package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
  220. package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
  221. package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
  222. package/dist/core/ui-scanner/react-scanner.js +0 -163
  223. package/dist/core/ui-scanner/react-scanner.js.map +0 -1
  224. package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
  225. package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
  226. package/dist/core/ui-scanner/scanner-interface.js +0 -33
  227. package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
  228. package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
  229. package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
  230. package/dist/core/ui-scanner/strict-scanner.js +0 -511
  231. package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
  232. package/dist/core/validator/data-validator.d.ts +0 -38
  233. package/dist/core/validator/data-validator.d.ts.map +0 -1
  234. package/dist/core/validator/data-validator.js +0 -212
  235. package/dist/core/validator/data-validator.js.map +0 -1
  236. package/dist/core/validator/feature-validator.d.ts +0 -27
  237. package/dist/core/validator/feature-validator.d.ts.map +0 -1
  238. package/dist/core/validator/feature-validator.js +0 -182
  239. package/dist/core/validator/feature-validator.js.map +0 -1
  240. package/dist/core/validator/index.d.ts +0 -46
  241. package/dist/core/validator/index.d.ts.map +0 -1
  242. package/dist/core/validator/index.js +0 -17
  243. package/dist/core/validator/index.js.map +0 -1
  244. package/dist/core/validator/screen-validator.d.ts +0 -35
  245. package/dist/core/validator/screen-validator.d.ts.map +0 -1
  246. package/dist/core/validator/screen-validator.js +0 -195
  247. package/dist/core/validator/screen-validator.js.map +0 -1
  248. package/dist/core/validator/selector-validator.d.ts +0 -36
  249. package/dist/core/validator/selector-validator.d.ts.map +0 -1
  250. package/dist/core/validator/selector-validator.js +0 -210
  251. package/dist/core/validator/selector-validator.js.map +0 -1
  252. package/dist/external/ai-provider.d.ts +0 -60
  253. package/dist/external/ai-provider.d.ts.map +0 -1
  254. package/dist/external/ai-provider.js +0 -30
  255. package/dist/external/ai-provider.js.map +0 -1
  256. package/dist/external/anthropic-provider.d.ts +0 -29
  257. package/dist/external/anthropic-provider.d.ts.map +0 -1
  258. package/dist/external/anthropic-provider.js +0 -85
  259. package/dist/external/anthropic-provider.js.map +0 -1
  260. package/dist/generators/cache/cache-manager.d.ts +0 -66
  261. package/dist/generators/cache/cache-manager.d.ts.map +0 -1
  262. package/dist/generators/cache/cache-manager.js +0 -286
  263. package/dist/generators/cache/cache-manager.js.map +0 -1
  264. package/dist/generators/dsl-writer/index.d.ts +0 -33
  265. package/dist/generators/dsl-writer/index.d.ts.map +0 -1
  266. package/dist/generators/dsl-writer/index.js +0 -226
  267. package/dist/generators/dsl-writer/index.js.map +0 -1
  268. package/dist/generators/scaffold-generator/index.d.ts +0 -162
  269. package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
  270. package/dist/generators/scaffold-generator/index.js +0 -877
  271. package/dist/generators/scaffold-generator/index.js.map +0 -1
  272. package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
  273. package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
  274. package/dist/generators/selector-mapper/ai-mapper.js +0 -457
  275. package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
  276. package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
  277. package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
  278. package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
  279. package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
  280. package/dist/generators/selector-mapper/index.d.ts +0 -8
  281. package/dist/generators/selector-mapper/index.d.ts.map +0 -1
  282. package/dist/generators/selector-mapper/index.js +0 -12
  283. package/dist/generators/selector-mapper/index.js.map +0 -1
  284. package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
  285. package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
  286. package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
  287. package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
  288. package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
  289. package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
  290. package/dist/generators/test-generator/ai-step-mapper.js +0 -204
  291. package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
  292. package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
  293. package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
  294. package/dist/generators/test-generator/auth-setup-generator.js +0 -82
  295. package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
  296. package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
  297. package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
  298. package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
  299. package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
  300. package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
  301. package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
  302. package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
  303. package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
  304. package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
  305. package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
  306. package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
  307. package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
  308. package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
  309. package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
  310. package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
  311. package/dist/generators/ui-model-builder/react-scanner.js +0 -797
  312. package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
  313. package/dist/orchestrator/cache-manager.d.ts +0 -15
  314. package/dist/orchestrator/cache-manager.d.ts.map +0 -1
  315. package/dist/orchestrator/cache-manager.js +0 -62
  316. package/dist/orchestrator/cache-manager.js.map +0 -1
  317. package/dist/orchestrator/pipeline.d.ts +0 -56
  318. package/dist/orchestrator/pipeline.d.ts.map +0 -1
  319. package/dist/orchestrator/pipeline.js +0 -298
  320. package/dist/orchestrator/pipeline.js.map +0 -1
  321. package/dist/orchestrator/reporter.d.ts +0 -15
  322. package/dist/orchestrator/reporter.d.ts.map +0 -1
  323. package/dist/orchestrator/reporter.js +0 -30
  324. package/dist/orchestrator/reporter.js.map +0 -1
  325. package/src/cli/commands/cache-clear.ts +0 -22
  326. package/src/cli/commands/full.ts +0 -35
  327. package/src/cli/commands/live-scan.ts +0 -82
  328. package/src/cli/commands/map.ts +0 -97
  329. package/src/cli/commands/validate.ts +0 -43
  330. package/src/cli/utils.ts +0 -106
  331. package/src/config/ai-providers.yaml +0 -56
  332. package/src/config/config-loader.ts +0 -248
  333. package/src/config/config-schema.ts +0 -148
  334. package/src/config/default.config.yaml +0 -107
  335. package/src/config/framework.config.yaml +0 -52
  336. package/src/config/routes.yaml +0 -31
  337. package/src/core/live-scanner/config-reader.ts +0 -57
  338. package/src/core/live-scanner/element-finder.ts +0 -534
  339. package/src/core/live-scanner/index.ts +0 -7
  340. package/src/core/live-scanner/matrix-reader.ts +0 -65
  341. package/src/core/live-scanner/matrix-writer.ts +0 -77
  342. package/src/core/live-scanner/role-fallback.ts +0 -44
  343. package/src/core/live-scanner/scanner.ts +0 -321
  344. package/src/core/live-scanner/step-replayer.ts +0 -503
  345. package/src/core/live-scanner/types.ts +0 -58
  346. package/src/core/selector-base/annotation-handler.ts +0 -127
  347. package/src/core/selector-base/base-generator.ts +0 -234
  348. package/src/core/selector-base/gherkin-parser.ts +0 -57
  349. package/src/core/selector-mapper/priority-mapper.ts +0 -607
  350. package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
  351. package/src/core/ui-scanner/react-scanner.ts +0 -156
  352. package/src/core/ui-scanner/scanner-interface.ts +0 -133
  353. package/src/core/ui-scanner/strict-scanner.ts +0 -629
  354. package/src/core/validator/data-validator.ts +0 -202
  355. package/src/core/validator/feature-validator.ts +0 -176
  356. package/src/core/validator/index.ts +0 -57
  357. package/src/core/validator/screen-validator.ts +0 -209
  358. package/src/core/validator/selector-validator.ts +0 -209
  359. package/src/external/ai-provider.ts +0 -90
  360. package/src/external/anthropic-provider.ts +0 -114
  361. package/src/generators/README.md +0 -410
  362. package/src/generators/cache/cache-manager.ts +0 -322
  363. package/src/generators/dsl-writer/index.ts +0 -253
  364. package/src/generators/scaffold-generator/index.ts +0 -1029
  365. package/src/generators/selector-mapper/ai-mapper.ts +0 -528
  366. package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
  367. package/src/generators/selector-mapper/index.ts +0 -10
  368. package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
  369. package/src/generators/test-generator/ai-step-mapper.ts +0 -224
  370. package/src/generators/test-generator/auth-setup-generator.ts +0 -59
  371. package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
  372. package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
  373. package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
  374. package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
  375. package/src/generators/ui-model-builder/react-scanner.ts +0 -959
  376. package/src/orchestrator/cache-manager.ts +0 -32
  377. package/src/orchestrator/pipeline.ts +0 -354
  378. package/src/orchestrator/reporter.ts +0 -36
@@ -1,38 +1,17 @@
1
1
  /**
2
- * Test Generator Interface
3
- * Defines contract for test framework code generators
2
+ * Test Generator Types
3
+ * Core type definitions for the test generation compiler
4
4
  */
5
5
 
6
- import { RuntimeConfig } from '../../config/config-schema';
7
- import { ParsedFeature } from '../../core/selector-base/gherkin-parser';
8
- import * as path from 'path';
9
-
10
6
  /**
11
- * Main Test Generator Interface
12
- */
13
- export interface TestGenerator {
14
- readonly framework: string;
15
-
16
- generate(
17
- feature: ParsedFeature,
18
- selectors: Record<string, any>,
19
- testData: Record<string, any>,
20
- config: RuntimeConfig
21
- ): Promise<GeneratedTest>;
22
-
23
- getFileExtension(): string;
24
-
25
- validate(): boolean;
26
- }
27
-
28
- /**
29
- * Generated Test Result (executor-level)
7
+ * Generated Test Result
30
8
  */
31
9
  export interface GeneratedTest {
32
- feature: string;
33
- outputPath: string;
10
+ featureName: string;
11
+ filePath: string;
34
12
  code: string;
35
- stats: GenerationStats;
13
+ sourceFile?: string;
14
+ stepCount?: number;
36
15
  }
37
16
 
38
17
  /**
@@ -42,90 +21,6 @@ export interface GenerationStats {
42
21
  totalScenarios: number;
43
22
  totalSteps: number;
44
23
  dictionaryMatched: number;
45
- aiGenerated: number;
46
24
  todoCount: number;
47
25
  generationTime: number;
48
26
  }
49
-
50
- /**
51
- * Test Generator Factory
52
- */
53
- export class TestGeneratorFactory {
54
- static create(framework: string, config: RuntimeConfig): TestGenerator {
55
- switch (framework) {
56
- case 'playwright': {
57
- const { CodeGenerator } = require('./code-generator');
58
-
59
- return {
60
- framework: 'playwright',
61
-
62
- async generate(
63
- feature: ParsedFeature,
64
- selectors: Record<string, any>,
65
- testData: Record<string, any>,
66
- cfg: RuntimeConfig
67
- ): Promise<GeneratedTest> {
68
- const startTime = Date.now();
69
-
70
- let screenName: string | undefined;
71
- if (feature.sourceFile) {
72
- const sourceDir = path.dirname(feature.sourceFile);
73
- const parts = sourceDir.split(path.sep);
74
- const screensIndex = parts.indexOf('screens');
75
- if (screensIndex >= 0 && screensIndex < parts.length - 2) {
76
- screenName = parts[screensIndex + 1];
77
- }
78
- }
79
-
80
- const generator = new CodeGenerator({
81
- useAI: cfg.testGenerator.enableAIFallback,
82
- verbose: cfg.verbose,
83
- screenName,
84
- });
85
-
86
- const outputDir = cfg.paths.specsDir;
87
- const result = await generator.generateTest(feature, outputDir);
88
- generator.writeTest(result);
89
-
90
- const countSteps = (f: ParsedFeature) =>
91
- f.scenarios.reduce((sum: number, s: any) => sum + (s.steps ? s.steps.length : 0), 0);
92
- const countTodos = (code: string) => (code.match(/\/\/ TODO/g) || []).length;
93
-
94
- const stats: GenerationStats = {
95
- totalScenarios: feature.scenarios.length,
96
- totalSteps: countSteps(feature),
97
- dictionaryMatched: 0,
98
- aiGenerated: 0,
99
- todoCount: countTodos(result.code),
100
- generationTime: Date.now() - startTime,
101
- };
102
-
103
- return {
104
- feature: feature.name,
105
- outputPath: result.filePath,
106
- code: result.code,
107
- stats,
108
- };
109
- },
110
-
111
- getFileExtension() {
112
- return '.spec.ts';
113
- },
114
-
115
- validate() {
116
- return true;
117
- },
118
- };
119
- }
120
-
121
- case 'appium':
122
- throw new Error('Appium generator not yet implemented');
123
-
124
- case 'integration':
125
- throw new Error('Integration test generator not yet implemented');
126
-
127
- default:
128
- throw new Error(`Unsupported test framework: ${framework}`);
129
- }
130
- }
131
- }
@@ -190,15 +190,33 @@ function convertJapaneseToRomaji(text: string): string {
190
190
 
191
191
  import { SelectorType } from '../../../utils/selector-types';
192
192
 
193
- // New structured selector format
193
+ // Structured selector format v2
194
194
  interface SelectorEntry {
195
- locator?: string; // CSS locator (optional, empty string means use type/value)
196
- type?: SelectorType; // Locator strategy
197
- value?: string; // Natural language value for the locator (e.g., 'button', 'link' for role)
198
- name?: string; // Accessible name for role-based selectors (e.g., 'Login', 'Submit')
199
- nth?: number; // Element index (0 = no index, 1+ = append .nth())
200
- exact?: boolean; // Whether to use exact matching (default: false)
201
- inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
195
+ locator?: string; // CSS locator (optional, empty string means use type/value)
196
+ type?: SelectorType; // Locator strategy
197
+ value?: string; // Natural language value for the locator (e.g., 'button', 'link' for role)
198
+ name?: string; // Accessible name for role-based selectors (e.g., 'Login', 'Submit')
199
+ nth?: number; // Element index (0 = no index, 1+ = append .nth())
200
+ exact?: boolean; // Whether to use exact matching (default: false)
201
+ inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
202
+
203
+ // === v2: Disambiguation ===
204
+ scope?: string; // Parent landmark aria-label to scope within (e.g., 'desktop navigation')
205
+ match?: 'exact' | 'partial'; // For getByText matching (default: partial)
206
+
207
+ // === v2: Complex Elements ===
208
+ variant?: 'native' | 'custom' | 'dragdrop'; // Dropdown/upload subtype
209
+ trigger?: string; // Visible button that triggers hidden file input
210
+ frame?: string; // iframe selector for cross-frame elements
211
+ contenteditable?: boolean; // Rich text editor (contenteditable div)
212
+
213
+ // === v2: Table ===
214
+ columns?: Record<string, { index: number; header: string; elements?: Record<string, SelectorEntry> }>;
215
+ pagination?: Record<string, string>;
216
+
217
+ // === v2: Assertion Helpers ===
218
+ attribute?: string; // Attribute to check (for "has" assertions)
219
+ pattern?: string; // Regex for attribute value
202
220
  }
203
221
 
204
222
  // New selector file structure: flat key-value pairs
@@ -220,12 +238,24 @@ interface LegacySelectorFile {
220
238
  export interface ResolvedSelector {
221
239
  strategy: 'testid' | 'id' | 'placeholder' | 'label' | 'text' | 'css' | 'role' | 'locator';
222
240
  value: string;
223
- role?: string; // For role-based selectors (e.g., 'button', 'link')
224
- name?: string; // For accessible name in role selectors
225
- locator?: string; // CSS locator for fallback
226
- nth?: number; // Index for .nth() if multiple matches exist
227
- exact?: boolean; // Whether to use exact matching (default: false)
241
+ role?: string; // For role-based selectors (e.g., 'button', 'link')
242
+ name?: string; // For accessible name in role selectors
243
+ locator?: string; // CSS locator for fallback
244
+ nth?: number; // Index for .nth() if multiple matches exist
245
+ exact?: boolean; // Whether to use exact matching (default: false)
228
246
  inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
247
+
248
+ // === v2 fields ===
249
+ scope?: string; // Parent landmark to scope within
250
+ match?: 'exact' | 'partial'; // For getByText exact matching
251
+ variant?: 'native' | 'custom' | 'dragdrop'; // Dropdown/upload type
252
+ trigger?: string; // Button that triggers hidden file input
253
+ frame?: string; // iframe selector
254
+ contenteditable?: boolean; // Rich text editor
255
+ columns?: Record<string, { index: number; header: string; elements?: Record<string, any> }>;
256
+ pagination?: Record<string, string>;
257
+ attribute?: string; // Attribute to check
258
+ pattern?: string; // Regex for attribute value
229
259
  }
230
260
 
231
261
  /**
@@ -520,17 +550,32 @@ export class SelectorResolver {
520
550
  // Check if name exists in entry (even if empty string), use it; otherwise use originalLabel
521
551
  const name = entry.name !== undefined && entry.name !== null ? entry.name : originalLabel;
522
552
  const nth = entry.nth || 0;
523
- const exact = entry.exact === true;
553
+ const exact = entry.exact === true || entry.match === 'exact';
524
554
  const inputMethod = entry.inputMethod;
525
555
 
526
- // Helper to attach inputMethod only when present
527
- const withInputMethod = (resolved: ResolvedSelector): ResolvedSelector =>
528
- inputMethod ? { ...resolved, inputMethod } : resolved;
556
+ // v2 fields
557
+ const v2Fields: Partial<ResolvedSelector> = {};
558
+ if (entry.scope) v2Fields.scope = entry.scope;
559
+ if (entry.match) v2Fields.match = entry.match;
560
+ if (entry.variant) v2Fields.variant = entry.variant;
561
+ if (entry.trigger) v2Fields.trigger = entry.trigger;
562
+ if (entry.frame) v2Fields.frame = entry.frame;
563
+ if (entry.contenteditable) v2Fields.contenteditable = true;
564
+ if (entry.columns) v2Fields.columns = entry.columns;
565
+ if (entry.pagination) v2Fields.pagination = entry.pagination;
566
+ if (entry.attribute) v2Fields.attribute = entry.attribute;
567
+ if (entry.pattern) v2Fields.pattern = entry.pattern;
568
+
569
+ // Helper to attach v2 fields and inputMethod
570
+ const withExtras = (resolved: ResolvedSelector): ResolvedSelector => {
571
+ if (inputMethod) resolved.inputMethod = inputMethod;
572
+ return { ...resolved, ...v2Fields };
573
+ };
529
574
 
530
575
  // If type is 'locator', use locator field (or value as fallback) as the CSS locator directly
531
576
  if (type === 'locator') {
532
577
  const locatorValue = locator && locator.trim() ? locator : value;
533
- return withInputMethod({
578
+ return withExtras({
534
579
  strategy: 'locator',
535
580
  value: locatorValue,
536
581
  locator: locatorValue,
@@ -540,7 +585,7 @@ export class SelectorResolver {
540
585
 
541
586
  // If custom locator is provided and type is not 'locator', use it as CSS selector
542
587
  if (locator && locator.trim()) {
543
- return withInputMethod({
588
+ return withExtras({
544
589
  strategy: 'css',
545
590
  value: locator,
546
591
  locator: locator,
@@ -551,7 +596,7 @@ export class SelectorResolver {
551
596
  // Use type-based strategy
552
597
  switch (type) {
553
598
  case 'placeholder':
554
- return withInputMethod({
599
+ return withExtras({
555
600
  strategy: 'placeholder',
556
601
  value,
557
602
  nth,
@@ -559,7 +604,7 @@ export class SelectorResolver {
559
604
  });
560
605
 
561
606
  case 'role':
562
- return withInputMethod({
607
+ return withExtras({
563
608
  strategy: 'role',
564
609
  role: value,
565
610
  name: name, // Use the name field for accessible name
@@ -569,14 +614,14 @@ export class SelectorResolver {
569
614
  });
570
615
 
571
616
  case 'testid':
572
- return withInputMethod({
617
+ return withExtras({
573
618
  strategy: 'testid',
574
619
  value,
575
620
  nth,
576
621
  });
577
622
 
578
623
  case 'label':
579
- return withInputMethod({
624
+ return withExtras({
580
625
  strategy: 'label',
581
626
  value,
582
627
  nth,
@@ -584,7 +629,7 @@ export class SelectorResolver {
584
629
  });
585
630
 
586
631
  case 'text':
587
- return withInputMethod({
632
+ return withExtras({
588
633
  strategy: 'text',
589
634
  value,
590
635
  nth,
@@ -593,7 +638,7 @@ export class SelectorResolver {
593
638
 
594
639
  default:
595
640
  // Fallback to placeholder
596
- return withInputMethod({
641
+ return withExtras({
597
642
  strategy: 'placeholder',
598
643
  value,
599
644
  nth,
@@ -46,6 +46,9 @@ export class ProjectInitializer {
46
46
  // Create README
47
47
  this.createReadme();
48
48
 
49
+ // Create AI rules files
50
+ this.createAIRules();
51
+
49
52
  // Display summary
50
53
  this.displaySummary(normalizedProjectName);
51
54
  }
@@ -111,7 +114,8 @@ export class ProjectInitializer {
111
114
  'specs/generated/',
112
115
  'specs/.auth/',
113
116
  'test-results/',
114
- 'playwright-report/'
117
+ 'playwright-report/',
118
+ '.playwright-mcp/'
115
119
  ];
116
120
 
117
121
  if (!fs.existsSync(gitignorePath)) {
@@ -178,10 +182,73 @@ export class ProjectInitializer {
178
182
  if (projectName) {
179
183
  console.log(` ${stepIndex++}. cd ${projectName}`);
180
184
  }
181
- console.log(` ${stepIndex++}. Review README.md for workflow overview`);
182
- console.log(` ${stepIndex++}. Create your first screen with: sungen add --screen <name>`);
183
- console.log(` ${stepIndex++}. Generate mapped tests with: sungen map --screen <name> | sungen map --all`);
184
- console.log(` ${stepIndex++}. Generate tests with: sungen generate --screen <name> | sungen generate --all\n`);
185
+ console.log(` ${stepIndex++}. Create your first screen: sungen add --screen <name> --path <url-path>`);
186
+ console.log(` ${stepIndex++}. Use AI (Copilot/Claude) to generate Gherkin + selectors from the live page`);
187
+ console.log(` ${stepIndex++}. Compile tests: sungen generate --screen <name>`);
188
+ console.log(` ${stepIndex++}. Run tests: npx playwright test\n`);
189
+ }
190
+
191
+ /**
192
+ * Create AI rules files for GitHub Copilot and Claude Code
193
+ */
194
+ private createAIRules(): void {
195
+ const rulesContent = this.getAIRulesContent();
196
+
197
+ // GitHub Copilot: .github/copilot-instructions.md
198
+ const githubDir = path.join(this.cwd, '.github');
199
+ const copilotPath = path.join(githubDir, 'copilot-instructions.md');
200
+ if (!fs.existsSync(copilotPath)) {
201
+ if (!fs.existsSync(githubDir)) {
202
+ fs.mkdirSync(githubDir, { recursive: true });
203
+ }
204
+ fs.writeFileSync(copilotPath, rulesContent, 'utf-8');
205
+ this.createdItems.push('.github/copilot-instructions.md');
206
+ } else {
207
+ this.skippedItems.push('.github/copilot-instructions.md');
208
+ }
209
+
210
+ // Claude Code: CLAUDE.md
211
+ const claudePath = path.join(this.cwd, 'CLAUDE.md');
212
+ if (!fs.existsSync(claudePath)) {
213
+ fs.writeFileSync(claudePath, rulesContent, 'utf-8');
214
+ this.createdItems.push('CLAUDE.md');
215
+ } else {
216
+ this.skippedItems.push('CLAUDE.md');
217
+ }
218
+
219
+ // Gherkin Dictionary: docs/gherkin-dictionary.md
220
+ const docsDir = path.join(this.cwd, 'docs');
221
+ const dictPath = path.join(docsDir, 'gherkin-dictionary.md');
222
+ if (!fs.existsSync(dictPath)) {
223
+ // Copy from sungen package if available, otherwise generate stub
224
+ const packageDictPath = path.join(__dirname, '..', '..', 'docs', 'gherkin-dictionary.md');
225
+ if (!fs.existsSync(docsDir)) {
226
+ fs.mkdirSync(docsDir, { recursive: true });
227
+ }
228
+ if (fs.existsSync(packageDictPath)) {
229
+ fs.copyFileSync(packageDictPath, dictPath);
230
+ } else {
231
+ fs.writeFileSync(dictPath, '# Sungen Gherkin Dictionary\n\nSee https://github.com/sun-asterisk/sungen for the full dictionary.\n', 'utf-8');
232
+ }
233
+ this.createdItems.push('docs/gherkin-dictionary.md');
234
+ } else {
235
+ this.skippedItems.push('docs/gherkin-dictionary.md');
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Read a template file from the templates directory
241
+ */
242
+ private readTemplate(filename: string): string {
243
+ const templatePath = path.join(__dirname, 'templates', filename);
244
+ return fs.readFileSync(templatePath, 'utf-8');
245
+ }
246
+
247
+ /**
248
+ * Get AI rules content (shared between Copilot and Claude)
249
+ */
250
+ private getAIRulesContent(): string {
251
+ return this.readTemplate('ai-rules.md');
185
252
  }
186
253
 
187
254
  /**
@@ -207,172 +274,20 @@ export class ProjectInitializer {
207
274
  * Get Playwright configuration template
208
275
  */
209
276
  private getPlaywrightConfigTemplate(): string {
210
- return `import { defineConfig, devices } from '@playwright/test';
211
-
212
- /**
213
- * Read environment variables from file.
214
- * https://github.com/motdotla/dotenv
215
- */
216
- // import dotenv from 'dotenv';
217
- // import path from 'path';
218
- // dotenv.config({ path: path.resolve(__dirname, '.env') });
219
-
220
- /**
221
- * See https://playwright.dev/docs/test-configuration.
222
- */
223
- export default defineConfig({
224
- testDir: './specs/generated',
225
- /* Run tests in files in parallel */
226
- fullyParallel: true,
227
- /* Fail the build on CI if you accidentally left test.only in the source code. */
228
- forbidOnly: !!process.env.CI,
229
- /* Retry on CI only */
230
- retries: process.env.CI ? 2 : 0,
231
- /* Opt out of parallel tests on CI. */
232
- workers: process.env.CI ? 1 : undefined,
233
- /* Reporter to use. See https://playwright.dev/docs/test-reporters */
234
- reporter: 'html',
235
- /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
236
- use: {
237
- /* Base URL to use in actions like \`await page.goto('')\`. */
238
- baseURL: 'https://example.com',
239
-
240
- /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
241
- trace: 'on-first-retry',
242
- },
243
-
244
- /* Configure projects for major browsers */
245
- projects: [
246
- {
247
- name: 'chromium',
248
- use: { ...devices['Desktop Chrome'] },
249
- },
250
-
251
- /*
252
- // {
253
- // name: 'firefox',
254
- // use: { ...devices['Desktop Firefox'] },
255
- // },
256
-
257
- // {
258
- // name: 'webkit',
259
- // use: { ...devices['Desktop Safari'] },
260
- // },
261
-
262
- /* Test against mobile viewports.
263
- // {
264
- // name: 'Mobile Chrome',
265
- // use: { ...devices['Pixel 5'] },
266
- // },
267
- // {
268
- // name: 'Mobile Safari',
269
- // use: { ...devices['iPhone 12'] },
270
- // },
271
-
272
- /* Test against branded browsers. */
273
- // {
274
- // name: 'Microsoft Edge',
275
- // use: { ...devices['Desktop Edge'], channel: 'msedge' },
276
- // },
277
- // {
278
- // name: 'Google Chrome',
279
- // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
280
- // },
281
- ],
282
-
283
- /* Run your local dev server before starting the tests */
284
- // webServer: {
285
- // command: 'npm run start',
286
- // url: 'http://localhost:3000',
287
- // reuseExistingServer: !process.env.CI,
288
- // },
289
- });
290
- `;
277
+ return this.readTemplate('playwright.config.ts');
291
278
  }
292
279
 
293
280
  /**
294
281
  * Get .gitignore template
295
282
  */
296
283
  private getGitignoreTemplate(): string {
297
- return `# Dependencies
298
- node_modules/
299
-
300
- # Build output
301
- dist/
302
- build/
303
-
304
- # Environment variables
305
- .env
306
- .env.local
307
-
308
- # IDE
309
- .vscode/
310
- .idea/
311
- *.swp
312
- *.swo
313
- `;
284
+ return this.readTemplate('gitignore');
314
285
  }
315
286
 
316
287
  /**
317
288
  * Get README template
318
289
  */
319
290
  private getReadmeTemplate(): string {
320
- return `# Sungen Test Automation
321
-
322
- This project uses [Sungen](https://github.com/sun-asterisk/sungen) for AI-native E2E test generation.
323
-
324
- ## Directory Structure
325
-
326
- \`\`\`
327
- ├── qa/
328
- │ └── screens/ # Screen definitions and selectors
329
- └── specs/
330
- └── generated/ # Auto-generated Playwright tests
331
- \`\`\`
332
-
333
- ## Workflow
334
-
335
- ### 1. Add new Screens
336
- Define a new screen for your application:
337
-
338
- \`\`\`bash
339
- sungen add --screen login
340
- \`\`\`
341
-
342
- ### 2. Generate mapped or full tests
343
- Generate mapper elements for a specific screen or all screens:
344
-
345
- \`\`\`bash
346
- sungen map --screen login
347
- # or
348
- sungen map --all
349
- \`\`\`
350
-
351
- ### 4. Generate full Playwright tests
352
- Generate complete tests based on mapped elements:
353
-
354
- \`\`\`bash
355
- sungen generate --screen login
356
- # or for all screens
357
- sungen generate --all
358
- \`\`\`
359
-
360
- ## Configuration
361
-
362
- Edit \`sungen.config.yaml\` to customize:
363
- - Source root directory
364
- - UI framework (react/vue/html)
365
- - AI provider settings
366
- - Test generation options
367
-
368
- ## Documentation
369
-
370
- - [Sungen Documentation](https://github.com/sun-asterisk/sungen)
371
- - [Playwright Documentation](https://playwright.dev)
372
-
373
- ## Learn More
374
-
375
- Visit the [Sungen GitHub repository](https://github.com/sun-asterisk/sungen) for detailed guides and examples.
376
- `;
291
+ return this.readTemplate('readme.md');
377
292
  }
378
293
  }