@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,629 +0,0 @@
1
- /**
2
- * Strict UI Scanner - v3.1
3
- *
4
- * Priority-based, deterministic scanner with strict filtering
5
- *
6
- * Key Principles:
7
- * 1. Only scan INTERACTIVE elements (input, button, a, select, textarea)
8
- * 2. Only include elements with data-testid OR role attributes
9
- * 3. Discard generic containers (div, span) unless they have id
10
- * 4. 80-90% noise reduction vs deep scanner
11
- *
12
- * Philosophy: AI is a fallback, not the primary solution
13
- */
14
-
15
- import * as parser from '@babel/parser';
16
- import traverse from '@babel/traverse';
17
- import * as t from '@babel/types';
18
- import * as fs from 'fs';
19
- import * as path from 'path';
20
-
21
- // ============================================================================
22
- // TYPES
23
- // ============================================================================
24
-
25
- export interface StrictScanConfig {
26
- sourceRoot: string;
27
- projectRoot: string;
28
- strictMode: boolean;
29
- filterRules: {
30
- allowedTags: string[];
31
- requireAttributes: string[];
32
- allowGenericWithId: boolean;
33
- };
34
- verbose?: boolean;
35
- }
36
-
37
- export interface StrictUIElement {
38
- // Flat, locator-centric schema
39
- logicalName: string; // e.g., "email-input"
40
- primaryLocator: string; // e.g., "[data-testid='login-email']"
41
- fallbackStrategy: string; // e.g., "role=textbox[name='email']"
42
-
43
- // Metadata
44
- tag: string; // e.g., "input"
45
- elementType: string; // e.g., "email", "button", "link"
46
-
47
- // Discovery info
48
- discoveryMethod: 'direct-id' | 'accessibility' | 'heuristic';
49
- confidence: 'high' | 'medium' | 'low';
50
-
51
- // Source tracking
52
- sourceFile: string;
53
-
54
- // Optional attributes
55
- label?: string;
56
- placeholder?: string;
57
- ariaLabel?: string;
58
- role?: string;
59
- text?: string;
60
-
61
- // Raw props for reference
62
- props: Record<string, any>;
63
- }
64
-
65
- export interface StrictScanResult {
66
- screen: string;
67
- timestamp: number;
68
- framework: string;
69
- sourceFiles: string[];
70
- elements: StrictUIElement[];
71
- stats: {
72
- totalScanned: number;
73
- totalFiltered: number;
74
- totalIncluded: number;
75
- filterRate: number;
76
- directIdMatches: number;
77
- accessibilityMatches: number;
78
- heuristicMatches: number;
79
- scanDuration: number;
80
- };
81
- }
82
-
83
- // ============================================================================
84
- // STRICT FILTER
85
- // ============================================================================
86
-
87
- class StrictElementFilter {
88
- private config: StrictScanConfig;
89
-
90
- constructor(config: StrictScanConfig) {
91
- this.config = config;
92
- }
93
-
94
- /**
95
- * Determine if element should be included in scan results
96
- *
97
- * Priority filtering:
98
- * 1. Interactive tags (input, button, a, select, textarea)
99
- * 2. Elements with data-testid or role
100
- * 3. Generic containers (div, span) ONLY if they have id
101
- */
102
- shouldInclude(element: any): boolean {
103
- const tag = element.tag?.toLowerCase();
104
- const props = element.props || {};
105
-
106
- // Priority 1: Interactive elements
107
- const interactiveTags = this.config.filterRules.allowedTags;
108
- if (interactiveTags.includes(tag)) {
109
- return true;
110
- }
111
-
112
- // Priority 2: Elements with required attributes (data-testid or role)
113
- const hasRequiredAttr = this.config.filterRules.requireAttributes.some(
114
- attr => props[attr] !== undefined && props[attr] !== null
115
- );
116
- if (hasRequiredAttr) {
117
- return true;
118
- }
119
-
120
- // Priority 3: Generic containers with ID
121
- if (this.config.filterRules.allowGenericWithId) {
122
- const genericTags = ['div', 'span'];
123
- if (genericTags.includes(tag) && props.id) {
124
- return true;
125
- }
126
- }
127
-
128
- // Filter out everything else
129
- return false;
130
- }
131
-
132
- /**
133
- * Get filter reason for logging/debugging
134
- */
135
- getFilterReason(element: any): string {
136
- const tag = element.tag?.toLowerCase();
137
- const props = element.props || {};
138
-
139
- if (this.config.filterRules.allowedTags.includes(tag)) {
140
- return 'interactive-tag';
141
- }
142
-
143
- const hasRequiredAttr = this.config.filterRules.requireAttributes.some(
144
- attr => props[attr] !== undefined
145
- );
146
- if (hasRequiredAttr) {
147
- return 'has-required-attribute';
148
- }
149
-
150
- if (['div', 'span'].includes(tag) && props.id) {
151
- return 'generic-with-id';
152
- }
153
-
154
- return 'filtered-out';
155
- }
156
- }
157
-
158
- // ============================================================================
159
- // LOGICAL NAME GENERATOR
160
- // ============================================================================
161
-
162
- class LogicalNameGenerator {
163
- /**
164
- * Generate logical, human-readable name for element
165
- *
166
- * Examples:
167
- * - input[type=email] → "email-input"
168
- * - button[type=submit] → "submit-btn"
169
- * - a[href="/login"] → "login-link"
170
- */
171
- generate(element: any, index: number): string {
172
- const tag = element.tag?.toLowerCase();
173
- const props = element.props || {};
174
-
175
- let name = '';
176
-
177
- // Use data-testid if available (most stable)
178
- if (props['data-testid']) {
179
- return this.cleanName(props['data-testid']);
180
- }
181
-
182
- // Use name attribute
183
- if (props.name) {
184
- name = props.name;
185
- }
186
- // Use id attribute
187
- else if (props.id) {
188
- name = props.id;
189
- }
190
- // Use aria-label
191
- else if (props['aria-label']) {
192
- name = props['aria-label'];
193
- }
194
- // Use placeholder for inputs
195
- else if (props.placeholder && tag === 'input') {
196
- name = props.placeholder;
197
- }
198
- // Use text content for buttons/links
199
- else if (element.text && ['button', 'a'].includes(tag)) {
200
- name = element.text;
201
- }
202
- // Use type for inputs
203
- else if (props.type && tag === 'input') {
204
- name = props.type;
205
- }
206
- // Fallback to tag + index
207
- else {
208
- name = `${tag}-${index}`;
209
- }
210
-
211
- // Add suffix based on tag
212
- const suffix = this.getSuffix(tag);
213
-
214
- return this.cleanName(name) + suffix;
215
- }
216
-
217
- private getSuffix(tag: string): string {
218
- const suffixMap: Record<string, string> = {
219
- 'input': '-input',
220
- 'textarea': '-textarea',
221
- 'select': '-select',
222
- 'button': '-btn',
223
- 'a': '-link',
224
- };
225
-
226
- return suffixMap[tag] || '';
227
- }
228
-
229
- private cleanName(name: string): string {
230
- return name
231
- .toLowerCase()
232
- .replace(/[^a-z0-9]+/g, '-')
233
- .replace(/^-+|-+$/g, '');
234
- }
235
- }
236
-
237
- // ============================================================================
238
- // LOCATOR GENERATOR
239
- // ============================================================================
240
-
241
- class LocatorGenerator {
242
- /**
243
- * Generate primary locator (Playwright-compatible)
244
- *
245
- * Priority:
246
- * 1. data-testid (most stable)
247
- * 2. role + aria-label (semantic)
248
- * 3. id attribute
249
- * 4. name attribute
250
- * 5. type + other attributes
251
- */
252
- generatePrimary(element: any): { locator: string; method: string; confidence: string } {
253
- const tag = element.tag?.toLowerCase();
254
- const props = element.props || {};
255
-
256
- // Priority 1: data-testid (BEST - deterministic, stable)
257
- if (props['data-testid']) {
258
- return {
259
- locator: `[data-testid="${props['data-testid']}"]`,
260
- method: 'direct-id',
261
- confidence: 'high',
262
- };
263
- }
264
-
265
- // Priority 2: role + aria-label (GOOD - semantic, accessible)
266
- if (props.role && props['aria-label']) {
267
- return {
268
- locator: `[role="${props.role}"][aria-label="${props['aria-label']}"]`,
269
- method: 'accessibility',
270
- confidence: 'high',
271
- };
272
- }
273
-
274
- // Priority 2b: role only
275
- if (props.role) {
276
- return {
277
- locator: `[role="${props.role}"]`,
278
- method: 'accessibility',
279
- confidence: 'medium',
280
- };
281
- }
282
-
283
- // Priority 3: id attribute (OKAY - might change)
284
- if (props.id) {
285
- return {
286
- locator: `#${props.id}`,
287
- method: 'heuristic',
288
- confidence: 'medium',
289
- };
290
- }
291
-
292
- // Priority 4: name attribute (for form fields)
293
- if (props.name && ['input', 'select', 'textarea'].includes(tag)) {
294
- return {
295
- locator: `${tag}[name="${props.name}"]`,
296
- method: 'heuristic',
297
- confidence: 'medium',
298
- };
299
- }
300
-
301
- // Priority 5: type + placeholder (for inputs)
302
- if (tag === 'input' && props.type && props.placeholder) {
303
- return {
304
- locator: `input[type="${props.type}"][placeholder="${props.placeholder}"]`,
305
- method: 'heuristic',
306
- confidence: 'low',
307
- };
308
- }
309
-
310
- // Priority 6: tag + type
311
- if (props.type) {
312
- return {
313
- locator: `${tag}[type="${props.type}"]`,
314
- method: 'heuristic',
315
- confidence: 'low',
316
- };
317
- }
318
-
319
- // Fallback: tag only (WEAK)
320
- return {
321
- locator: tag,
322
- method: 'heuristic',
323
- confidence: 'low',
324
- };
325
- }
326
-
327
- /**
328
- * Generate fallback strategy (when primary fails)
329
- */
330
- generateFallback(element: any): string {
331
- const tag = element.tag?.toLowerCase();
332
- const props = element.props || {};
333
-
334
- const strategies: string[] = [];
335
-
336
- // Strategy 1: Text content
337
- if (element.text && ['button', 'a'].includes(tag)) {
338
- strategies.push(`${tag}:has-text("${element.text}")`);
339
- }
340
-
341
- // Strategy 2: Placeholder
342
- if (props.placeholder) {
343
- strategies.push(`${tag}[placeholder="${props.placeholder}"]`);
344
- }
345
-
346
- // Strategy 3: Name
347
- if (props.name) {
348
- strategies.push(`${tag}[name="${props.name}"]`);
349
- }
350
-
351
- // Strategy 4: Type
352
- if (props.type) {
353
- strategies.push(`${tag}[type="${props.type}"]`);
354
- }
355
-
356
- // Return first strategy or tag as ultimate fallback
357
- return strategies.length > 0 ? strategies[0] : tag;
358
- }
359
- }
360
-
361
- // ============================================================================
362
- // STRICT SCANNER
363
- // ============================================================================
364
-
365
- export class StrictScanner {
366
- private config: StrictScanConfig;
367
- private filter: StrictElementFilter;
368
- private nameGenerator: LogicalNameGenerator;
369
- private locatorGenerator: LocatorGenerator;
370
-
371
- private elements: StrictUIElement[] = [];
372
- private scannedFiles = new Set<string>();
373
- private stats = {
374
- totalScanned: 0,
375
- totalFiltered: 0,
376
- totalIncluded: 0,
377
- directIdMatches: 0,
378
- accessibilityMatches: 0,
379
- heuristicMatches: 0,
380
- };
381
-
382
- constructor(config: StrictScanConfig) {
383
- this.config = config;
384
- this.filter = new StrictElementFilter(config);
385
- this.nameGenerator = new LogicalNameGenerator();
386
- this.locatorGenerator = new LocatorGenerator();
387
- }
388
-
389
- /**
390
- * Scan a screen and generate strict UI model
391
- */
392
- async scan(screenName: string): Promise<StrictScanResult> {
393
- const startTime = Date.now();
394
-
395
- // Find entry file for screen
396
- const entryFile = this.findEntryFile(screenName);
397
- if (!entryFile) {
398
- throw new Error(`Entry file not found for screen: ${screenName}`);
399
- }
400
-
401
- // Scan recursively
402
- await this.scanFile(entryFile);
403
-
404
- const duration = Date.now() - startTime;
405
-
406
- return {
407
- screen: screenName,
408
- timestamp: Date.now(),
409
- framework: 'react',
410
- sourceFiles: Array.from(this.scannedFiles),
411
- elements: this.elements,
412
- stats: {
413
- ...this.stats,
414
- filterRate: this.stats.totalScanned > 0
415
- ? (this.stats.totalFiltered / this.stats.totalScanned) * 100
416
- : 0,
417
- scanDuration: duration,
418
- },
419
- };
420
- }
421
-
422
- private findEntryFile(screenName: string): string | null {
423
- // Convert screen name to path: auth-login -> auth/login
424
- const screenPath = screenName.replace(/-/g, '/');
425
-
426
- // Try common patterns
427
- const patterns = [
428
- `${screenPath}/page.tsx`,
429
- `${screenPath}/index.tsx`,
430
- `${screenPath}.tsx`,
431
- `${screenPath}/page.js`,
432
- `${screenPath}/index.js`,
433
- `${screenPath}.js`,
434
- ];
435
-
436
- for (const pattern of patterns) {
437
- const filePath = path.join(this.config.sourceRoot, pattern);
438
- if (fs.existsSync(filePath)) {
439
- return filePath;
440
- }
441
- }
442
-
443
- return null;
444
- }
445
-
446
- private async scanFile(filePath: string): Promise<void> {
447
- // Avoid re-scanning
448
- if (this.scannedFiles.has(filePath)) {
449
- return;
450
- }
451
-
452
- this.scannedFiles.add(filePath);
453
-
454
- // Read file
455
- const code = fs.readFileSync(filePath, 'utf-8');
456
-
457
- // Parse with Babel
458
- const ast = parser.parse(code, {
459
- sourceType: 'module',
460
- plugins: ['jsx', 'typescript'],
461
- });
462
-
463
- // Traverse AST and extract elements
464
- traverse(ast, {
465
- JSXElement: (path) => {
466
- this.processJSXElement(path.node, filePath);
467
- },
468
- });
469
- }
470
-
471
- private processJSXElement(node: any, sourceFile: string): void {
472
- const element = this.extractElementData(node);
473
-
474
- this.stats.totalScanned++;
475
-
476
- // Apply strict filter
477
- if (!this.filter.shouldInclude(element)) {
478
- this.stats.totalFiltered++;
479
-
480
- if (this.config.verbose) {
481
- const reason = this.filter.getFilterReason(element);
482
- console.log(`[FILTERED] ${element.tag} - ${reason}`);
483
- }
484
-
485
- return;
486
- }
487
-
488
- // Element passed filter - process it
489
- this.stats.totalIncluded++;
490
-
491
- const strictElement = this.buildStrictElement(element, sourceFile);
492
- this.elements.push(strictElement);
493
-
494
- // Update discovery stats
495
- if (strictElement.discoveryMethod === 'direct-id') {
496
- this.stats.directIdMatches++;
497
- } else if (strictElement.discoveryMethod === 'accessibility') {
498
- this.stats.accessibilityMatches++;
499
- } else {
500
- this.stats.heuristicMatches++;
501
- }
502
-
503
- if (this.config.verbose) {
504
- console.log(
505
- `[INCLUDED] ${strictElement.logicalName} - ${strictElement.discoveryMethod} (${strictElement.confidence})`
506
- );
507
- }
508
- }
509
-
510
- private extractElementData(node: any): any {
511
- // Extract tag name
512
- const openingElement = node.openingElement;
513
- const tag = this.getTagName(openingElement.name);
514
-
515
- // Extract props
516
- const props: Record<string, any> = {};
517
- for (const attr of openingElement.attributes || []) {
518
- if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {
519
- const name = attr.name.name;
520
- const value = this.getAttributeValue(attr.value);
521
- props[name] = value;
522
- }
523
- }
524
-
525
- // Extract text content
526
- const text = this.extractTextContent(node);
527
-
528
- return { tag, props, text };
529
- }
530
-
531
- private getTagName(name: any): string {
532
- if (t.isJSXIdentifier(name)) {
533
- return name.name;
534
- }
535
- if (t.isJSXMemberExpression(name)) {
536
- // Handle <Form.Input> → "input"
537
- return this.getTagName(name.property);
538
- }
539
- return 'unknown';
540
- }
541
-
542
- private getAttributeValue(value: any): any {
543
- if (!value) return true; // Boolean attribute
544
- if (t.isStringLiteral(value)) return value.value;
545
- if (t.isJSXExpressionContainer(value)) {
546
- if (t.isStringLiteral(value.expression)) {
547
- return value.expression.value;
548
- }
549
- if (t.isBooleanLiteral(value.expression)) {
550
- return value.expression.value;
551
- }
552
- if (t.isNumericLiteral(value.expression)) {
553
- return value.expression.value;
554
- }
555
- }
556
- return undefined;
557
- }
558
-
559
- private extractTextContent(node: any): string | null {
560
- const children = node.children || [];
561
-
562
- for (const child of children) {
563
- if (t.isJSXText(child)) {
564
- const text = child.value.trim();
565
- if (text) return text;
566
- }
567
- if (t.isJSXExpressionContainer(child)) {
568
- if (t.isStringLiteral(child.expression)) {
569
- return child.expression.value;
570
- }
571
- }
572
- }
573
-
574
- return null;
575
- }
576
-
577
- private buildStrictElement(element: any, sourceFile: string): StrictUIElement {
578
- // Generate logical name
579
- const logicalName = this.nameGenerator.generate(element, this.elements.length);
580
-
581
- // Generate locators
582
- const primary = this.locatorGenerator.generatePrimary(element);
583
- const fallback = this.locatorGenerator.generateFallback(element);
584
-
585
- // Determine element type
586
- const elementType = this.inferElementType(element);
587
-
588
- return {
589
- logicalName,
590
- primaryLocator: primary.locator,
591
- fallbackStrategy: fallback,
592
-
593
- tag: element.tag,
594
- elementType,
595
-
596
- discoveryMethod: primary.method as any,
597
- confidence: primary.confidence as any,
598
-
599
- sourceFile,
600
-
601
- label: element.props.label,
602
- placeholder: element.props.placeholder,
603
- ariaLabel: element.props['aria-label'],
604
- role: element.props.role,
605
- text: element.text,
606
-
607
- props: element.props,
608
- };
609
- }
610
-
611
- private inferElementType(element: any): string {
612
- const tag = element.tag?.toLowerCase();
613
- const props = element.props || {};
614
-
615
- if (tag === 'input' && props.type) {
616
- return props.type; // email, password, text, etc.
617
- }
618
-
619
- if (tag === 'button') {
620
- return props.type || 'button';
621
- }
622
-
623
- if (tag === 'a') {
624
- return 'link';
625
- }
626
-
627
- return tag;
628
- }
629
- }