@sun-asterisk/sungen 3.2.31 → 3.2.33

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 (363) hide show
  1. package/dist/cli/commands/audit.d.ts +1 -0
  2. package/dist/cli/commands/audit.d.ts.map +1 -1
  3. package/dist/cli/commands/audit.js +13 -2
  4. package/dist/cli/commands/audit.js.map +1 -1
  5. package/dist/cli/commands/capability.d.ts.map +1 -1
  6. package/dist/cli/commands/capability.js +46 -17
  7. package/dist/cli/commands/capability.js.map +1 -1
  8. package/dist/cli/commands/delivery.d.ts.map +1 -1
  9. package/dist/cli/commands/delivery.js +39 -18
  10. package/dist/cli/commands/delivery.js.map +1 -1
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +14 -7
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts.map +1 -1
  15. package/dist/cli/commands/init.js +2 -0
  16. package/dist/cli/commands/init.js.map +1 -1
  17. package/dist/cli/commands/results-merge.d.ts.map +1 -1
  18. package/dist/cli/commands/results-merge.js +2 -12
  19. package/dist/cli/commands/results-merge.js.map +1 -1
  20. package/dist/cli/commands/results-sanitize.d.ts.map +1 -1
  21. package/dist/cli/commands/results-sanitize.js +2 -13
  22. package/dist/cli/commands/results-sanitize.js.map +1 -1
  23. package/dist/cli/commands/setup-mobile-env.d.ts +15 -0
  24. package/dist/cli/commands/setup-mobile-env.d.ts.map +1 -0
  25. package/dist/cli/commands/setup-mobile-env.js +65 -0
  26. package/dist/cli/commands/setup-mobile-env.js.map +1 -0
  27. package/dist/cli/index.js +2 -0
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
  30. package/dist/dashboard/snapshot-builder.js +6 -10
  31. package/dist/dashboard/snapshot-builder.js.map +1 -1
  32. package/dist/exporters/feature-parser.d.ts +21 -0
  33. package/dist/exporters/feature-parser.d.ts.map +1 -1
  34. package/dist/exporters/feature-parser.js +32 -1
  35. package/dist/exporters/feature-parser.js.map +1 -1
  36. package/dist/exporters/locale-variants.d.ts +7 -1
  37. package/dist/exporters/locale-variants.d.ts.map +1 -1
  38. package/dist/exporters/locale-variants.js +23 -16
  39. package/dist/exporters/locale-variants.js.map +1 -1
  40. package/dist/exporters/matrix/build.d.ts.map +1 -1
  41. package/dist/exporters/matrix/build.js +13 -7
  42. package/dist/exporters/matrix/build.js.map +1 -1
  43. package/dist/exporters/matrix/carry-manual-results.d.ts +70 -0
  44. package/dist/exporters/matrix/carry-manual-results.d.ts.map +1 -0
  45. package/dist/exporters/matrix/carry-manual-results.js +232 -0
  46. package/dist/exporters/matrix/carry-manual-results.js.map +1 -0
  47. package/dist/exporters/matrix/export.d.ts +2 -0
  48. package/dist/exporters/matrix/export.d.ts.map +1 -1
  49. package/dist/exporters/matrix/export.js +7 -1
  50. package/dist/exporters/matrix/export.js.map +1 -1
  51. package/dist/exporters/matrix/wording.d.ts +7 -0
  52. package/dist/exporters/matrix/wording.d.ts.map +1 -1
  53. package/dist/exporters/matrix/wording.js +27 -1
  54. package/dist/exporters/matrix/wording.js.map +1 -1
  55. package/dist/exporters/xlsx-exporter.d.ts +2 -0
  56. package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
  57. package/dist/exporters/xlsx-exporter.js +7 -2
  58. package/dist/exporters/xlsx-exporter.js.map +1 -1
  59. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +2 -2
  60. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/all-contain-assertion.hbs +1 -2
  61. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/all-contain-element.hbs +8 -5
  62. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/count-assertion.hbs +5 -1
  63. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/disabled-with-filter-assertion.hbs +1 -1
  64. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +1 -1
  65. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/hidden-with-filter-assertion.hbs +1 -1
  66. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +1 -1
  67. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +8 -2
  68. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/list-item-count-assertion.hbs +5 -2
  69. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/state-with-filter-assertion.hbs +1 -1
  70. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-filtered-assertion.hbs +1 -1
  71. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-with-role-variable-assertion.hbs +7 -3
  72. package/dist/generators/test-generator/adapters/appium/templates/steps/partials/await-elements.hbs +12 -0
  73. package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +94 -4
  74. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/capture-variable.hbs +7 -1
  75. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +7 -1
  76. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/row-scoped-column-assertion.hbs +23 -1
  77. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +8 -4
  78. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +4 -4
  79. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/default.hbs +1 -1
  80. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/id.hbs +1 -1
  81. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +4 -4
  82. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +17 -2
  83. package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +14 -0
  84. package/dist/generators/test-generator/code-generator.d.ts +2 -1
  85. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  86. package/dist/generators/test-generator/code-generator.js +122 -15
  87. package/dist/generators/test-generator/code-generator.js.map +1 -1
  88. package/dist/generators/test-generator/diagnostics.d.ts +70 -4
  89. package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
  90. package/dist/generators/test-generator/diagnostics.js +69 -3
  91. package/dist/generators/test-generator/diagnostics.js.map +1 -1
  92. package/dist/generators/test-generator/patterns/index.d.ts +13 -3
  93. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  94. package/dist/generators/test-generator/patterns/index.js +16 -10
  95. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  96. package/dist/generators/test-generator/patterns/types.d.ts +15 -0
  97. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
  98. package/dist/generators/test-generator/patterns/with-parent-scope.d.ts +5 -0
  99. package/dist/generators/test-generator/patterns/with-parent-scope.d.ts.map +1 -1
  100. package/dist/generators/test-generator/patterns/with-parent-scope.js +6 -0
  101. package/dist/generators/test-generator/patterns/with-parent-scope.js.map +1 -1
  102. package/dist/generators/test-generator/step-mapper.d.ts +81 -0
  103. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  104. package/dist/generators/test-generator/step-mapper.js +187 -13
  105. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  106. package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
  107. package/dist/generators/test-generator/template-engine.js +18 -0
  108. package/dist/generators/test-generator/template-engine.js.map +1 -1
  109. package/dist/generators/test-generator/utils/data-resolver.d.ts +25 -0
  110. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  111. package/dist/generators/test-generator/utils/data-resolver.js +39 -8
  112. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  113. package/dist/generators/test-generator/utils/selector-entry-fields.d.ts.map +1 -1
  114. package/dist/generators/test-generator/utils/selector-entry-fields.js +1 -0
  115. package/dist/generators/test-generator/utils/selector-entry-fields.js.map +1 -1
  116. package/dist/generators/test-generator/utils/selector-resolver.d.ts +84 -4
  117. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  118. package/dist/generators/test-generator/utils/selector-resolver.js +229 -82
  119. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  120. package/dist/harness/audit.d.ts.map +1 -1
  121. package/dist/harness/audit.js +35 -8
  122. package/dist/harness/audit.js.map +1 -1
  123. package/dist/harness/capability.d.ts +7 -1
  124. package/dist/harness/capability.d.ts.map +1 -1
  125. package/dist/harness/capability.js +15 -12
  126. package/dist/harness/capability.js.map +1 -1
  127. package/dist/harness/catalog/universal-viewpoints.yaml +5 -5
  128. package/dist/harness/config-file.d.ts +17 -0
  129. package/dist/harness/config-file.d.ts.map +1 -0
  130. package/dist/harness/config-file.js +100 -0
  131. package/dist/harness/config-file.js.map +1 -0
  132. package/dist/harness/depth-lint.d.ts.map +1 -1
  133. package/dist/harness/depth-lint.js +2 -1
  134. package/dist/harness/depth-lint.js.map +1 -1
  135. package/dist/harness/flow-check.d.ts.map +1 -1
  136. package/dist/harness/flow-check.js +6 -2
  137. package/dist/harness/flow-check.js.map +1 -1
  138. package/dist/harness/keyword-match.d.ts +59 -0
  139. package/dist/harness/keyword-match.d.ts.map +1 -0
  140. package/dist/harness/keyword-match.js +86 -0
  141. package/dist/harness/keyword-match.js.map +1 -0
  142. package/dist/harness/next-step.d.ts.map +1 -1
  143. package/dist/harness/next-step.js +2 -1
  144. package/dist/harness/next-step.js.map +1 -1
  145. package/dist/harness/parse.d.ts.map +1 -1
  146. package/dist/harness/parse.js +42 -7
  147. package/dist/harness/parse.js.map +1 -1
  148. package/dist/harness/perf.d.ts +7 -1
  149. package/dist/harness/perf.d.ts.map +1 -1
  150. package/dist/harness/perf.js +13 -10
  151. package/dist/harness/perf.js.map +1 -1
  152. package/dist/harness/quality-gates.d.ts +9 -2
  153. package/dist/harness/quality-gates.d.ts.map +1 -1
  154. package/dist/harness/quality-gates.js +16 -4
  155. package/dist/harness/quality-gates.js.map +1 -1
  156. package/dist/harness/query-catalog.js +0 -0
  157. package/dist/harness/query-catalog.js.map +1 -1
  158. package/dist/harness/read-text.d.ts +6 -0
  159. package/dist/harness/read-text.d.ts.map +1 -1
  160. package/dist/harness/read-text.js +7 -1
  161. package/dist/harness/read-text.js.map +1 -1
  162. package/dist/harness/secret-scan.d.ts +27 -1
  163. package/dist/harness/secret-scan.d.ts.map +1 -1
  164. package/dist/harness/secret-scan.js +57 -4
  165. package/dist/harness/secret-scan.js.map +1 -1
  166. package/dist/harness/sensors.d.ts +12 -0
  167. package/dist/harness/sensors.d.ts.map +1 -1
  168. package/dist/harness/sensors.js +41 -18
  169. package/dist/harness/sensors.js.map +1 -1
  170. package/dist/harness/spec-branches.d.ts +7 -20
  171. package/dist/harness/spec-branches.d.ts.map +1 -1
  172. package/dist/harness/spec-branches.js +85 -13
  173. package/dist/harness/spec-branches.js.map +1 -1
  174. package/dist/harness/spec-coverage.d.ts +16 -0
  175. package/dist/harness/spec-coverage.d.ts.map +1 -1
  176. package/dist/harness/spec-coverage.js +131 -12
  177. package/dist/harness/spec-coverage.js.map +1 -1
  178. package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
  179. package/dist/harness/viewpoint-ledger.js +2 -1
  180. package/dist/harness/viewpoint-ledger.js.map +1 -1
  181. package/dist/harness/write-atomic.d.ts +2 -0
  182. package/dist/harness/write-atomic.d.ts.map +1 -0
  183. package/dist/harness/write-atomic.js +62 -0
  184. package/dist/harness/write-atomic.js.map +1 -0
  185. package/dist/orchestrator/ai-skills/writer.d.ts.map +1 -1
  186. package/dist/orchestrator/ai-skills/writer.js +15 -7
  187. package/dist/orchestrator/ai-skills/writer.js.map +1 -1
  188. package/dist/orchestrator/appium-environment-setup.d.ts +24 -0
  189. package/dist/orchestrator/appium-environment-setup.d.ts.map +1 -0
  190. package/dist/orchestrator/appium-environment-setup.js +157 -0
  191. package/dist/orchestrator/appium-environment-setup.js.map +1 -0
  192. package/dist/orchestrator/assets-drift.d.ts.map +1 -1
  193. package/dist/orchestrator/assets-drift.js +11 -6
  194. package/dist/orchestrator/assets-drift.js.map +1 -1
  195. package/dist/orchestrator/mobile-runtime-scaffolder.d.ts +2 -0
  196. package/dist/orchestrator/mobile-runtime-scaffolder.d.ts.map +1 -1
  197. package/dist/orchestrator/mobile-runtime-scaffolder.js.map +1 -1
  198. package/dist/orchestrator/project-deps-sync.d.ts.map +1 -1
  199. package/dist/orchestrator/project-deps-sync.js +22 -1
  200. package/dist/orchestrator/project-deps-sync.js.map +1 -1
  201. package/dist/orchestrator/project-initializer.d.ts +9 -0
  202. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  203. package/dist/orchestrator/project-initializer.js +63 -7
  204. package/dist/orchestrator/project-initializer.js.map +1 -1
  205. package/dist/orchestrator/security-overrides-catalog.d.ts +39 -0
  206. package/dist/orchestrator/security-overrides-catalog.d.ts.map +1 -0
  207. package/dist/orchestrator/security-overrides-catalog.js +63 -0
  208. package/dist/orchestrator/security-overrides-catalog.js.map +1 -0
  209. package/dist/orchestrator/security-overrides.d.ts +51 -0
  210. package/dist/orchestrator/security-overrides.d.ts.map +1 -0
  211. package/dist/orchestrator/security-overrides.js +165 -0
  212. package/dist/orchestrator/security-overrides.js.map +1 -0
  213. package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -0
  214. package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +8 -2
  215. package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +64 -2
  216. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +13 -1
  217. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +20 -5
  218. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +3 -3
  219. package/dist/orchestrator/templates/appium-environment/README.md +83 -0
  220. package/dist/orchestrator/templates/appium-environment/scripts/common/install-appium.ps1 +44 -0
  221. package/dist/orchestrator/templates/appium-environment/scripts/common/install-appium.sh +50 -0
  222. package/dist/orchestrator/templates/appium-environment/scripts/common/lib.ps1 +108 -0
  223. package/dist/orchestrator/templates/appium-environment/scripts/common/lib.sh +141 -0
  224. package/dist/orchestrator/templates/appium-environment/scripts/common/verify-appium.ps1 +39 -0
  225. package/dist/orchestrator/templates/appium-environment/scripts/common/verify-appium.sh +43 -0
  226. package/dist/orchestrator/templates/appium-environment/scripts/common/verify-node.ps1 +13 -0
  227. package/dist/orchestrator/templates/appium-environment/scripts/common/verify-node.sh +16 -0
  228. package/dist/orchestrator/templates/appium-environment/scripts/macos/install-android.sh +110 -0
  229. package/dist/orchestrator/templates/appium-environment/scripts/macos/install-ios.sh +32 -0
  230. package/dist/orchestrator/templates/appium-environment/scripts/macos/verify-android.sh +32 -0
  231. package/dist/orchestrator/templates/appium-environment/scripts/macos/verify-ios.sh +15 -0
  232. package/dist/orchestrator/templates/appium-environment/scripts/windows/install-android.ps1 +153 -0
  233. package/dist/orchestrator/templates/appium-environment/scripts/windows/verify-android.ps1 +26 -0
  234. package/dist/orchestrator/templates/appium-environment/setup.ps1 +58 -0
  235. package/dist/orchestrator/templates/appium-environment/setup.sh +88 -0
  236. package/dist/orchestrator/templates/specs-checked-state.d.ts +1 -1
  237. package/dist/orchestrator/templates/specs-checked-state.d.ts.map +1 -1
  238. package/dist/orchestrator/templates/specs-checked-state.js +26 -3
  239. package/dist/orchestrator/templates/specs-checked-state.js.map +1 -1
  240. package/dist/orchestrator/templates/specs-checked-state.ts +31 -6
  241. package/dist/orchestrator/templates/specs-locale-fixture.ts +21 -9
  242. package/dist/orchestrator/templates/specs-mock.d.ts +2 -1
  243. package/dist/orchestrator/templates/specs-mock.d.ts.map +1 -1
  244. package/dist/orchestrator/templates/specs-mock.js +10 -3
  245. package/dist/orchestrator/templates/specs-mock.js.map +1 -1
  246. package/dist/orchestrator/templates/specs-mock.ts +12 -4
  247. package/dist/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
  248. package/dist/orchestrator/templates/specs-url-assert.d.ts +17 -1
  249. package/dist/orchestrator/templates/specs-url-assert.d.ts.map +1 -1
  250. package/dist/orchestrator/templates/specs-url-assert.js +14 -2
  251. package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
  252. package/dist/orchestrator/templates/specs-url-assert.ts +24 -2
  253. package/dist/orchestrator/templates/wdio.conf.ts +24 -1
  254. package/package.json +3 -3
  255. package/src/cli/commands/audit.ts +12 -3
  256. package/src/cli/commands/capability.ts +63 -19
  257. package/src/cli/commands/delivery.ts +38 -16
  258. package/src/cli/commands/generate.ts +15 -7
  259. package/src/cli/commands/init.ts +3 -0
  260. package/src/cli/commands/results-merge.ts +2 -8
  261. package/src/cli/commands/results-sanitize.ts +2 -9
  262. package/src/cli/commands/setup-mobile-env.ts +64 -0
  263. package/src/cli/index.ts +2 -0
  264. package/src/dashboard/snapshot-builder.ts +6 -8
  265. package/src/exporters/feature-parser.ts +32 -2
  266. package/src/exporters/locale-variants.ts +23 -17
  267. package/src/exporters/matrix/build.ts +14 -8
  268. package/src/exporters/matrix/carry-manual-results.ts +229 -0
  269. package/src/exporters/matrix/export.ts +10 -4
  270. package/src/exporters/matrix/wording.ts +26 -1
  271. package/src/exporters/xlsx-exporter.ts +7 -2
  272. package/src/generators/test-generator/adapters/adapter-interface.ts +2 -2
  273. package/src/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +2 -2
  274. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/all-contain-assertion.hbs +1 -2
  275. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/all-contain-element.hbs +8 -5
  276. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/count-assertion.hbs +5 -1
  277. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/disabled-with-filter-assertion.hbs +1 -1
  278. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +1 -1
  279. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/hidden-with-filter-assertion.hbs +1 -1
  280. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +1 -1
  281. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +8 -2
  282. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/list-item-count-assertion.hbs +5 -2
  283. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/state-with-filter-assertion.hbs +1 -1
  284. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-filtered-assertion.hbs +1 -1
  285. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-with-role-variable-assertion.hbs +7 -3
  286. package/src/generators/test-generator/adapters/appium/templates/steps/partials/await-elements.hbs +12 -0
  287. package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +94 -4
  288. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/capture-variable.hbs +7 -1
  289. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +7 -1
  290. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/row-scoped-column-assertion.hbs +23 -1
  291. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +8 -4
  292. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +4 -4
  293. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/default.hbs +1 -1
  294. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/id.hbs +1 -1
  295. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +4 -4
  296. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +17 -2
  297. package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +14 -0
  298. package/src/generators/test-generator/code-generator.ts +119 -19
  299. package/src/generators/test-generator/diagnostics.ts +70 -4
  300. package/src/generators/test-generator/patterns/index.ts +16 -9
  301. package/src/generators/test-generator/patterns/types.ts +15 -0
  302. package/src/generators/test-generator/patterns/with-parent-scope.ts +6 -0
  303. package/src/generators/test-generator/step-mapper.ts +196 -13
  304. package/src/generators/test-generator/template-engine.ts +18 -0
  305. package/src/generators/test-generator/utils/data-resolver.ts +41 -12
  306. package/src/generators/test-generator/utils/selector-entry-fields.ts +1 -0
  307. package/src/generators/test-generator/utils/selector-resolver.ts +256 -85
  308. package/src/harness/audit.ts +41 -12
  309. package/src/harness/capability.ts +23 -12
  310. package/src/harness/catalog/universal-viewpoints.yaml +5 -5
  311. package/src/harness/config-file.ts +66 -0
  312. package/src/harness/depth-lint.ts +2 -1
  313. package/src/harness/flow-check.ts +6 -2
  314. package/src/harness/keyword-match.ts +85 -0
  315. package/src/harness/next-step.ts +2 -1
  316. package/src/harness/parse.ts +42 -7
  317. package/src/harness/perf.ts +15 -7
  318. package/src/harness/quality-gates.ts +16 -4
  319. package/src/harness/query-catalog.ts +0 -0
  320. package/src/harness/read-text.ts +7 -1
  321. package/src/harness/secret-scan.ts +60 -4
  322. package/src/harness/sensors.ts +50 -19
  323. package/src/harness/spec-branches.ts +72 -14
  324. package/src/harness/spec-coverage.ts +133 -13
  325. package/src/harness/viewpoint-ledger.ts +2 -1
  326. package/src/harness/write-atomic.ts +22 -0
  327. package/src/orchestrator/ai-skills/writer.ts +18 -3
  328. package/src/orchestrator/appium-environment-setup.ts +127 -0
  329. package/src/orchestrator/assets-drift.ts +10 -5
  330. package/src/orchestrator/mobile-runtime-scaffolder.ts +2 -0
  331. package/src/orchestrator/project-deps-sync.ts +23 -1
  332. package/src/orchestrator/project-initializer.ts +69 -7
  333. package/src/orchestrator/security-overrides-catalog.ts +69 -0
  334. package/src/orchestrator/security-overrides.ts +149 -0
  335. package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -0
  336. package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +8 -2
  337. package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +64 -2
  338. package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +13 -1
  339. package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +20 -5
  340. package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +3 -3
  341. package/src/orchestrator/templates/appium-environment/README.md +83 -0
  342. package/src/orchestrator/templates/appium-environment/scripts/common/install-appium.ps1 +44 -0
  343. package/src/orchestrator/templates/appium-environment/scripts/common/install-appium.sh +50 -0
  344. package/src/orchestrator/templates/appium-environment/scripts/common/lib.ps1 +108 -0
  345. package/src/orchestrator/templates/appium-environment/scripts/common/lib.sh +141 -0
  346. package/src/orchestrator/templates/appium-environment/scripts/common/verify-appium.ps1 +39 -0
  347. package/src/orchestrator/templates/appium-environment/scripts/common/verify-appium.sh +43 -0
  348. package/src/orchestrator/templates/appium-environment/scripts/common/verify-node.ps1 +13 -0
  349. package/src/orchestrator/templates/appium-environment/scripts/common/verify-node.sh +16 -0
  350. package/src/orchestrator/templates/appium-environment/scripts/macos/install-android.sh +110 -0
  351. package/src/orchestrator/templates/appium-environment/scripts/macos/install-ios.sh +32 -0
  352. package/src/orchestrator/templates/appium-environment/scripts/macos/verify-android.sh +32 -0
  353. package/src/orchestrator/templates/appium-environment/scripts/macos/verify-ios.sh +15 -0
  354. package/src/orchestrator/templates/appium-environment/scripts/windows/install-android.ps1 +153 -0
  355. package/src/orchestrator/templates/appium-environment/scripts/windows/verify-android.ps1 +26 -0
  356. package/src/orchestrator/templates/appium-environment/setup.ps1 +58 -0
  357. package/src/orchestrator/templates/appium-environment/setup.sh +88 -0
  358. package/src/orchestrator/templates/specs-checked-state.ts +31 -6
  359. package/src/orchestrator/templates/specs-locale-fixture.ts +21 -9
  360. package/src/orchestrator/templates/specs-mock.ts +12 -4
  361. package/src/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
  362. package/src/orchestrator/templates/specs-url-assert.ts +24 -2
  363. package/src/orchestrator/templates/wdio.conf.ts +24 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-resolver.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/data-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-resolver.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/data-resolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"selector-entry-fields.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-entry-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI3D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CA6BpD,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAe,CAAC;AAEzE,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAGjD,CAAC;AAEH,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAA4C,CAAC;AAE/F,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CAmBvF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,oBAAoB,CAAA;CAAE,GAC7D,IAAI,CAaN"}
1
+ {"version":3,"file":"selector-entry-fields.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-entry-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI3D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CA8BpD,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAe,CAAC;AAEzE,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAGjD,CAAC;AAEH,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAA4C,CAAC;AAE/F,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CAmBvF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,oBAAoB,CAAA;CAAE,GAC7D,IAAI,CAaN"}
@@ -38,6 +38,7 @@ exports.CONSUMED_ENTRY_FIELDS = new Set([
38
38
  'scope', // dialog/landmark scoping in the locator partial
39
39
  'match', // collapses into `exact` for getByText
40
40
  'anchor', // page assertions — the rendered-content proof (#662)
41
+ 'query', // page assertions — `any` drops the bare-page no-query rule (#748)
41
42
  'android', // appium adapter → androidSelector (#392)
42
43
  'ios', // appium adapter → iosSelector (#392)
43
44
  'variant', // widget recipes / native select / upload subtype
@@ -1 +1 @@
1
- {"version":3,"file":"selector-entry-fields.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-entry-fields.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selector-entry-fields.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-entry-fields.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,46 @@
1
1
  import { SelectorType } from '../../../utils/selector-types';
2
2
  import { DiagnosticsCollector } from '../diagnostics';
3
+ interface SelectorEntry {
4
+ locator?: string;
5
+ type?: SelectorType;
6
+ value?: string;
7
+ name?: string;
8
+ nth?: number;
9
+ exact?: boolean;
10
+ inputMethod?: string;
11
+ scope?: string;
12
+ match?: 'exact' | 'partial';
13
+ anchor?: SelectorEntry;
14
+ query?: 'any';
15
+ android?: SelectorEntry;
16
+ ios?: SelectorEntry;
17
+ variant?: string;
18
+ trigger?: string;
19
+ frame?: string;
20
+ contenteditable?: boolean;
21
+ columns?: Record<string, {
22
+ index: number;
23
+ header: string;
24
+ elements?: Record<string, SelectorEntry>;
25
+ }>;
26
+ pagination?: Record<string, string>;
27
+ rows?: string;
28
+ checked?: {
29
+ class?: string;
30
+ attribute?: string;
31
+ };
32
+ selected?: {
33
+ class?: string;
34
+ attribute?: string;
35
+ };
36
+ attribute?: string;
37
+ pattern?: string;
38
+ expanded?: {
39
+ class?: string;
40
+ attribute?: string;
41
+ state?: 'none';
42
+ };
43
+ }
3
44
  /**
4
45
  * Roles whose accessible name comes from their own CONTENT, not from a label — so a name the
5
46
  * compiler invented from the `[Reference]` text can never match a real element.
@@ -59,11 +100,8 @@ export interface ResolvedSelector {
59
100
  checkedClass?: string;
60
101
  checkedAttribute?: string;
61
102
  anchor?: ResolvedSelector;
103
+ query?: 'any';
62
104
  }
63
- /**
64
- * SelectorResolver - Resolves selector references to direct Playwright locator code
65
- * Supports natural language references with auto-generated keys
66
- */
67
105
  export declare class SelectorResolver {
68
106
  private selectorCache;
69
107
  private selectorsDir;
@@ -158,6 +196,32 @@ export declare class SelectorResolver {
158
196
  * [Email] field → getByPlaceholder('...')
159
197
  */
160
198
  private static inferFromElementType;
199
+ /**
200
+ * Does the compiler have an OPINION about this element type — is it an alias it normalizes, or a
201
+ * type auto-infer can serve?
202
+ *
203
+ * The distinction decides whether the last-resort sweep may run, and it exists because
204
+ * `step.elementType` is not always an element type. The parser takes the first word after `]`
205
+ * (gherkin-parser/index.ts), so `see [Quick Panel] is hidden` arrives here with the "type" `is`
206
+ * and `drag [Item] to [Drop Zone]` with `to`. Nine such function words appear across the shipped
207
+ * features. A word the compiler cannot reason about carries no type information at all, so it must
208
+ * not be treated as a narrowing signal — a step like that has to keep the same open fallback a
209
+ * bare `[Ref]` gets, or a project whose label needs suffixed keys loses every state-clause step.
210
+ *
211
+ * Derived from the two maps rather than listed, so a new alias or strategy is known here the day
212
+ * it is added. tests/docs/element-type-vocabulary-parity.run.ts pins the maps against the parser's
213
+ * own list and the published table.
214
+ */
215
+ private static isKnownElementType;
216
+ /**
217
+ * Every selectors.yaml key that could legitimately hold the entry for `[label] <elementType>`.
218
+ *
219
+ * Shared by the lookup and by the not-found message, so the error can never advertise a key the
220
+ * resolver did not actually try — the two drifting apart is how #752 stayed invisible: the throw
221
+ * that would have named the missing key was unreachable, and when it did fire it listed two
222
+ * candidates while the resolver had its own idea of which to check.
223
+ */
224
+ private static typedKeyCandidates;
161
225
  /**
162
226
  * Normalize elementType aliases to canonical YAML suffix
163
227
  * Gherkin writers may use: title, label, heading, text → all map to "text"
@@ -212,6 +276,21 @@ export declare class SelectorResolver {
212
276
  * whose fallback is the failure it exists to fix, refuses outright.
213
277
  */
214
278
  private validatedStateSignal;
279
+ /**
280
+ * Report a selectors.yaml problem ONCE per entry+field, not once per step that resolves it.
281
+ *
282
+ * An entry is resolved again for every step that names it, so an unguarded `diagnostics.add`
283
+ * here repeats the same sentence a dozen times for one typo and buries everything else in the
284
+ * channel. `warnedContentNamed` is the existing de-dupe set; `key` namespaces the callers so two
285
+ * diagnostics about one entry cannot silence each other.
286
+ */
287
+ private warnOnce;
288
+ /**
289
+ * Resolve a selectors.yaml entry that is NOT reachable by key — a `columns.<col>.elements.cell`
290
+ * declaration, which lives nested under a table entry. Public for that one caller; everything
291
+ * addressable by name goes through `resolveSelector`.
292
+ */
293
+ resolveNestedEntry(entry: SelectorEntry, originalLabel: string): ResolvedSelector;
215
294
  private resolveFromEntry;
216
295
  /**
217
296
  * Resolve selector by priority chain (legacy)
@@ -257,4 +336,5 @@ export declare class SelectorResolver {
257
336
  */
258
337
  clearCache(): void;
259
338
  }
339
+ export {};
260
340
  //# sourceMappingURL=selector-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selector-resolver.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selector-resolver.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/selector-resolver.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,105 @@ exports.LIST_MEMBER_ROLES = new Set(['listitem', 'option', 'cell']);
63
63
  * SelectorResolver - Resolves selector references to direct Playwright locator code
64
64
  * Supports natural language references with auto-generated keys
65
65
  */
66
+ /**
67
+ * Read an OWN property of a lookup table, or undefined.
68
+ *
69
+ * Every type table here — the alias map, the strategy map, the reverse index, and the parsed
70
+ * selectors.yaml itself — is a bare object literal, so it inherits Object.prototype and answers for
71
+ * keys it does not have. `elementType` is whatever word the author wrote after `]`, and the three
72
+ * readers failed three different ways on an inherited one: normalizeElementType is declared
73
+ * `: string` and returned a FUNCTION to be interpolated into a selector key; inferFromElementType
74
+ * CALLED that function with no receiver and crashed the compiler with "Cannot convert undefined or
75
+ * null to object"; and `ALIAS_SPELLINGS[t] ?? []` sailed past its own `??` guard, because a
76
+ * function is neither null nor undefined, and died on `.map`.
77
+ *
78
+ * No real feature file says `[X] valueOf`. The rule is the point: a lookup table must not answer
79
+ * for a key it does not have, and one helper is cheaper to keep right than four call sites.
80
+ */
81
+ function own(table, key) {
82
+ return Object.prototype.hasOwnProperty.call(table, key) ? table[key] : undefined;
83
+ }
84
+ /**
85
+ * Gherkin element-type spelling → the canonical suffix used in selectors.yaml keys.
86
+ *
87
+ * Module-scope so the table has exactly ONE reader-facing definition and the reverse index below
88
+ * can be DERIVED from it. A second, hand-written reverse table is the failure mode issue #728
89
+ * recorded: a hand-maintained mirror of something the source already states drifts, quietly, for
90
+ * months. Declaration order is meaningful — it decides which alias wins when a selectors.yaml
91
+ * declares two spellings of one canonical type (see ALIAS_SPELLINGS).
92
+ */
93
+ const ELEMENT_TYPE_ALIASES = {
94
+ // Text-like aliases → "text"
95
+ 'title': 'text',
96
+ 'label': 'text',
97
+ 'caption': 'text',
98
+ // Heading aliases → "heading" (role-based)
99
+ 'heading': 'heading',
100
+ 'header': 'heading',
101
+ 'message': 'text',
102
+ // Table-related aliases
103
+ 'column': 'columnheader',
104
+ // List-related aliases
105
+ 'list-item': 'listitem',
106
+ // Image aliases
107
+ 'logo': 'img',
108
+ 'image': 'img',
109
+ 'icon': 'img',
110
+ // Button aliases
111
+ 'btn': 'button',
112
+ // Field aliases
113
+ 'input': 'field',
114
+ 'textbox': 'field',
115
+ 'textarea': 'field',
116
+ 'editor': 'field',
117
+ // Search alias → searchbox role
118
+ 'search': 'searchbox',
119
+ // Toggle alias → switch role
120
+ 'toggle': 'switch',
121
+ // Alert alias → alertdialog role.
122
+ // UNREACHABLE in practice, kept for the same reason it is not changed: in sungen's grammar
123
+ // `alert` means the BROWSER system dialog, so `see [X] alert` matches a dedicated step pattern
124
+ // and compiles to `page.on('dialog', …)` without ever entering the selector resolver
125
+ // (verified by compiling the step; target-dictionary.mdx documents it as `page.on('dialog')`).
126
+ // This entry only answers a step form that reaches the resolver with the type `alert`, and
127
+ // none does. Removing it would be a behaviour change with no caller to benefit, so it stays.
128
+ 'alert': 'alertdialog',
129
+ // Modal/drawer alias → dialog role
130
+ 'modal': 'dialog',
131
+ 'drawer': 'dialog',
132
+ // Dropdown/select alias -> combobox role
133
+ 'dropdown': 'combobox',
134
+ 'select': 'combobox',
135
+ // Data aliases
136
+ 'item': 'listitem',
137
+ 'card': 'article',
138
+ 'cell': 'cell',
139
+ 'section': 'region',
140
+ // Feedback aliases
141
+ 'badge': 'text',
142
+ 'tooltip': 'text',
143
+ 'tag': 'text',
144
+ // Trigger aliases
145
+ 'menuitem': 'menuitem',
146
+ // System aliases
147
+ 'progressbar': 'progressbar',
148
+ 'spinner': 'status',
149
+ 'breadcrumb': 'navigation',
150
+ };
151
+ /**
152
+ * Canonical type → every alias spelling that normalizes to it, in ELEMENT_TYPE_ALIASES declaration
153
+ * order. Derived, never authored. Identity entries ('heading': 'heading') are excluded: they are
154
+ * already covered by the canonical candidate and would only duplicate a lookup.
155
+ */
156
+ const ALIAS_SPELLINGS = (() => {
157
+ const out = {};
158
+ for (const [alias, canonical] of Object.entries(ELEMENT_TYPE_ALIASES)) {
159
+ if (alias === canonical)
160
+ continue;
161
+ (out[canonical] ?? (out[canonical] = [])).push(alias);
162
+ }
163
+ return out;
164
+ })();
66
165
  class SelectorResolver {
67
166
  constructor(selectorsDir, screenName, platform = 'web') {
68
167
  this.selectorCache = new Map();
@@ -255,68 +354,52 @@ class SelectorResolver {
255
354
  'status': () => ({ strategy: 'role', role: 'status', name: label, value: 'status' }),
256
355
  'navigation': () => ({ strategy: 'role', role: 'navigation', name: label, value: 'navigation' }),
257
356
  };
258
- const factory = strategyMap[normalized];
357
+ const factory = own(strategyMap, normalized);
259
358
  return factory ? factory() : null;
260
359
  }
360
+ /**
361
+ * Does the compiler have an OPINION about this element type — is it an alias it normalizes, or a
362
+ * type auto-infer can serve?
363
+ *
364
+ * The distinction decides whether the last-resort sweep may run, and it exists because
365
+ * `step.elementType` is not always an element type. The parser takes the first word after `]`
366
+ * (gherkin-parser/index.ts), so `see [Quick Panel] is hidden` arrives here with the "type" `is`
367
+ * and `drag [Item] to [Drop Zone]` with `to`. Nine such function words appear across the shipped
368
+ * features. A word the compiler cannot reason about carries no type information at all, so it must
369
+ * not be treated as a narrowing signal — a step like that has to keep the same open fallback a
370
+ * bare `[Ref]` gets, or a project whose label needs suffixed keys loses every state-clause step.
371
+ *
372
+ * Derived from the two maps rather than listed, so a new alias or strategy is known here the day
373
+ * it is added. tests/docs/element-type-vocabulary-parity.run.ts pins the maps against the parser's
374
+ * own list and the published table.
375
+ */
376
+ static isKnownElementType(elementType) {
377
+ if (own(ELEMENT_TYPE_ALIASES, elementType) !== undefined)
378
+ return true;
379
+ return SelectorResolver.inferFromElementType(elementType, '') !== null;
380
+ }
381
+ /**
382
+ * Every selectors.yaml key that could legitimately hold the entry for `[label] <elementType>`.
383
+ *
384
+ * Shared by the lookup and by the not-found message, so the error can never advertise a key the
385
+ * resolver did not actually try — the two drifting apart is how #752 stayed invisible: the throw
386
+ * that would have named the missing key was unreachable, and when it did fire it listed two
387
+ * candidates while the resolver had its own idea of which to check.
388
+ */
389
+ static typedKeyCandidates(key, elementType, normalizedType) {
390
+ return [...new Set([
391
+ `${key}--${normalizedType}`,
392
+ `${key}--${elementType}`,
393
+ ...(own(ALIAS_SPELLINGS, normalizedType) ?? []).map((alias) => `${key}--${alias}`),
394
+ ])];
395
+ }
261
396
  /**
262
397
  * Normalize elementType aliases to canonical YAML suffix
263
398
  * Gherkin writers may use: title, label, heading, text → all map to "text"
264
399
  * Similarly: btn → button, link → link, input/field → field
265
400
  */
266
401
  static normalizeElementType(elementType) {
267
- const aliasMap = {
268
- // Text-like aliases → "text"
269
- 'title': 'text',
270
- 'label': 'text',
271
- 'caption': 'text',
272
- // Heading aliases → "heading" (role-based)
273
- 'heading': 'heading',
274
- 'header': 'heading',
275
- 'message': 'text',
276
- // Table-related aliases
277
- 'column': 'columnheader',
278
- // List-related aliases
279
- 'list-item': 'listitem',
280
- // Image aliases
281
- 'logo': 'img',
282
- 'image': 'img',
283
- 'icon': 'img',
284
- // Button aliases
285
- 'btn': 'button',
286
- // Field aliases
287
- 'input': 'field',
288
- 'textbox': 'field',
289
- 'textarea': 'field',
290
- 'editor': 'field',
291
- // Search alias → searchbox role
292
- 'search': 'searchbox',
293
- // Toggle alias → switch role
294
- 'toggle': 'switch',
295
- // Alert alias → alertdialog role
296
- 'alert': 'alertdialog',
297
- // Modal/drawer alias → dialog role
298
- 'modal': 'dialog',
299
- 'drawer': 'dialog',
300
- // Dropdown/select alias -> combobox role
301
- 'dropdown': 'combobox',
302
- 'select': 'combobox',
303
- // Data aliases
304
- 'item': 'listitem',
305
- 'card': 'article',
306
- 'cell': 'cell',
307
- 'section': 'region',
308
- // Feedback aliases
309
- 'badge': 'text',
310
- 'tooltip': 'text',
311
- 'tag': 'text',
312
- // Trigger aliases
313
- 'menuitem': 'menuitem',
314
- // System aliases
315
- 'progressbar': 'progressbar',
316
- 'spinner': 'status',
317
- 'breadcrumb': 'navigation',
318
- };
319
- return aliasMap[elementType] || elementType;
402
+ return own(ELEMENT_TYPE_ALIASES, elementType) ?? elementType;
320
403
  }
321
404
  /**
322
405
  * Resolve natural language selector
@@ -333,30 +416,35 @@ class SelectorResolver {
333
416
  // Try nth-suffixed key first: hay.gui.loi.cam.on--3
334
417
  if (nth && nth > 0) {
335
418
  const nthKey = `${key}--${nth}`;
336
- const nthEntry = selectorFile[nthKey];
419
+ const nthEntry = own(selectorFile, nthKey);
337
420
  if (nthEntry) {
338
421
  return this.resolveFromEntry(nthEntry, displayLabel);
339
422
  }
340
423
  }
341
- // Try type-suffixed key first: add.campaign--button, add.campaign--text
424
+ // Try type-suffixed keys: add.campaign--button, add.campaign--text
425
+ //
426
+ // EVERY spelling of the step's type is tried, not just the two the step itself could have been
427
+ // written with (#752). The alias table maps a Gherkin spelling onto a canonical one, but it was
428
+ // only ever applied to the STEP; the file's keys were compared raw. So `confirm--modal` was
429
+ // invisible to `[Confirm] dialog` while `confirm--dialog` resolved for `[Confirm] modal` —
430
+ // the mapping is one-directional and the lookup inherited that. The hole was not specific to
431
+ // modal/drawer: all 30 non-identity aliases had it.
432
+ //
433
+ // Order is deterministic and NOT file order: canonical first (the spelling the compiler thinks
434
+ // in), then whatever the author literally typed, then the remaining aliases in alias-table
435
+ // declaration order. A file declaring both `--modal` and `--drawer` therefore resolves the same
436
+ // way on every machine.
342
437
  if (elementType) {
343
438
  const normalizedType = SelectorResolver.normalizeElementType(elementType);
344
- const typedKey = `${key}--${normalizedType}`;
345
- const typedEntry = selectorFile[typedKey];
346
- if (typedEntry) {
347
- return this.resolveFromEntry(typedEntry, displayLabel);
348
- }
349
- // If normalized differs from original, also try original as-is
350
- if (normalizedType !== elementType) {
351
- const originalKey = `${key}--${elementType}`;
352
- const originalEntry = selectorFile[originalKey];
353
- if (originalEntry) {
354
- return this.resolveFromEntry(originalEntry, displayLabel);
439
+ for (const candidate of SelectorResolver.typedKeyCandidates(key, elementType, normalizedType)) {
440
+ const typedEntry = own(selectorFile, candidate);
441
+ if (typedEntry) {
442
+ return this.resolveFromEntry(typedEntry, displayLabel);
355
443
  }
356
444
  }
357
445
  }
358
446
  // Fallback to base key
359
- const entry = selectorFile[key];
447
+ const entry = own(selectorFile, key);
360
448
  if (entry) {
361
449
  return this.resolveFromEntry(entry, displayLabel);
362
450
  }
@@ -393,19 +481,28 @@ class SelectorResolver {
393
481
  return inferred;
394
482
  }
395
483
  }
396
- // Last resort: find any suffixed key matching key--*
397
- const suffixedKeys = Object.keys(selectorFile).filter(k => k.startsWith(`${key}--`));
398
- if (suffixedKeys.length > 0) {
399
- return this.resolveFromEntry(selectorFile[suffixedKeys[0]], displayLabel);
400
- }
401
- const tried = [];
402
- if (elementType) {
403
- const normalizedType = SelectorResolver.normalizeElementType(elementType);
404
- tried.push(`${key}--${normalizedType}`);
405
- if (normalizedType !== elementType) {
406
- tried.push(`${key}--${elementType}`);
484
+ // Last resort: any suffixed key matching key--*, for a [Ref] the compiler could not type.
485
+ //
486
+ // Two cases reach here and they are the same case: a bare [Ref] with no word after it, and a
487
+ // [Ref] followed by a word that is not an element type. The parser cannot tell the two apart —
488
+ // it takes the FIRST word after `]`, so `see [Quick Panel] is hidden` arrives typed `is`. In
489
+ // both, nothing is known about what kind of element is wanted, so any suffixed key is as good a
490
+ // guess as the next, and a project whose label needs suffixed keys keeps its state-clause steps.
491
+ //
492
+ // A step the compiler CAN type gets no such guess. The candidate scan above already tried every
493
+ // spelling that normalizes to that type, so whatever is still sitting under `key--` is a
494
+ // DIFFERENT element, and handing it back is the silent-wrong-answer shape of #752 itself.
495
+ // Falling through to the throw is better: it names the keys that were tried, and "add an entry"
496
+ // is an instruction the author can act on.
497
+ if (!elementType || !SelectorResolver.isKnownElementType(elementType)) {
498
+ const suffixedKeys = Object.keys(selectorFile).filter(k => k.startsWith(`${key}--`));
499
+ if (suffixedKeys.length > 0) {
500
+ return this.resolveFromEntry(selectorFile[suffixedKeys[0]], displayLabel);
407
501
  }
408
502
  }
503
+ const tried = elementType
504
+ ? SelectorResolver.typedKeyCandidates(key, elementType, SelectorResolver.normalizeElementType(elementType))
505
+ : [];
409
506
  const suffix = tried.length > 0 ? ` (also tried ${tried.join(', ')})` : '';
410
507
  throw new Error(`Selector "${label}" (key: ${key}) not found in ${featureName}.yaml${suffix}. ` +
411
508
  `Available selectors: ${Object.keys(selectorFile).join(', ')}`);
@@ -557,6 +654,28 @@ class SelectorResolver {
557
654
  }
558
655
  return out.class || out.attribute ? out : undefined;
559
656
  }
657
+ /**
658
+ * Report a selectors.yaml problem ONCE per entry+field, not once per step that resolves it.
659
+ *
660
+ * An entry is resolved again for every step that names it, so an unguarded `diagnostics.add`
661
+ * here repeats the same sentence a dozen times for one typo and buries everything else in the
662
+ * channel. `warnedContentNamed` is the existing de-dupe set; `key` namespaces the callers so two
663
+ * diagnostics about one entry cannot silence each other.
664
+ */
665
+ warnOnce(key, code, message) {
666
+ if (this.warnedContentNamed.has(key))
667
+ return;
668
+ this.warnedContentNamed.add(key);
669
+ this.diagnostics?.add(code, message, { feature: this.featureName });
670
+ }
671
+ /**
672
+ * Resolve a selectors.yaml entry that is NOT reachable by key — a `columns.<col>.elements.cell`
673
+ * declaration, which lives nested under a table entry. Public for that one caller; everything
674
+ * addressable by name goes through `resolveSelector`.
675
+ */
676
+ resolveNestedEntry(entry, originalLabel) {
677
+ return this.resolveFromEntry(entry, originalLabel);
678
+ }
560
679
  resolveFromEntry(entry, originalLabel) {
561
680
  // Default values
562
681
  const locator = entry.locator || '';
@@ -635,6 +754,28 @@ class SelectorResolver {
635
754
  // accessible name, so it resolves against its own name (or nothing).
636
755
  if (entry.anchor)
637
756
  v2Fields.anchor = this.resolveFromEntry(entry.anchor, entry.anchor.name ?? '');
757
+ // Gated on the entry KIND, like the value check below: `query:` means nothing on a non-page
758
+ // entry, and both the field and its diagnostic are worded purely in page terms. Today's two
759
+ // consumers re-check `selectorType === 'page'` at the read site (the `anchor:` precedent), so
760
+ // this is belt-and-braces — but a third consumer that forgets the guard would otherwise inherit
761
+ // a field that was never meant for it.
762
+ if (type === 'page' && entry.query !== undefined) {
763
+ const declared = String(entry.query).trim().toLowerCase();
764
+ // Exactly one value is legal today. A typo must NOT read as the permissive form: it would
765
+ // silently turn off the bare-page query assertion (#464) on a page the author meant to keep
766
+ // strict, which is the class of quiet weakening this whole diagnostic channel exists for.
767
+ if (declared === 'any')
768
+ v2Fields.query = 'any';
769
+ else
770
+ this.warnOnce(`w037:${originalLabel}:query`, 'SG-W037', `selector "${originalLabel}": query: ${JSON.stringify(String(entry.query))} is not a query rule — the only value is \`any\` ("the query is not part of this page's identity"). The declaration is ignored, so a bare \`see [${originalLabel}] page\` still requires the URL to carry NO query at all.`);
771
+ }
772
+ // A page `value` is the PATH only — pathToRegexSource strips a `?`/`#` before building the
773
+ // pattern. Silently, until now: an author who hit the bare-page query rule (#464) and reached
774
+ // for the obvious workaround got byte-identical output and no hint why, which is exactly how
775
+ // #748 was misdiagnosed in the field as a regex-escaping bug.
776
+ if (type === 'page' && typeof entry.value === 'string' && /[?#]/.test(entry.value)) {
777
+ this.warnOnce(`w037:${originalLabel}:value`, 'SG-W037', `selector "${originalLabel}": the page value ${JSON.stringify(entry.value)} carries a query/fragment, which is DROPPED — a page value is the path only, and the pattern is matched against \`u.pathname\`, which never holds one. Writing it here changes nothing. To assert the query, declare it on the step (\`see [${originalLabel}] page with {{v}}\`); to say the query is not part of this page's identity, add \`query: any\` to the entry.`);
778
+ }
638
779
  // Helper to attach v2 fields and inputMethod
639
780
  const withExtras = (resolved) => {
640
781
  if (inputMethod)
@@ -776,9 +917,15 @@ class SelectorResolver {
776
917
  nth,
777
918
  exact,
778
919
  });
779
- // Mobile (Appium) native strategies — pass through unchanged; the appium adapter's
780
- // `appium-selector` switch renders the right WDIO selector (`~` / raw xpath / `android=` /
781
- // `-ios predicate string:` / `id=`). On web these types never appear. See issue #392.
920
+ // Native strategies — pass through unchanged; the appium adapter's `appium-selector` switch
921
+ // renders the right WDIO selector (`~` / raw xpath / `android=` / `-ios predicate string:` /
922
+ // `id=`). See issue #392.
923
+ //
924
+ // `id` is NOT mobile-only, whatever this comment used to claim: the legacy branch at the
925
+ // bottom of resolveByPriority extracts `#id` out of a web `locator:` and returns
926
+ // `strategy: 'id'`, and the playwright adapter ships an `id` partial to serve it. The two
927
+ // paths disagree on whether `value` carries the hash, which is why the partial reads the
928
+ // selector through `cssIdSelector` rather than off `value` directly.
782
929
  case 'accessibility-id':
783
930
  case 'xpath':
784
931
  case 'android-uiautomator':