@sun-asterisk/sungen 3.2.8 → 3.2.10-beta.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 (151) hide show
  1. package/dist/capabilities/discover.js +1 -1
  2. package/dist/capabilities/discover.js.map +1 -1
  3. package/dist/capabilities/registry.d.ts +9 -0
  4. package/dist/capabilities/registry.d.ts.map +1 -1
  5. package/dist/capabilities/registry.js +4 -0
  6. package/dist/capabilities/registry.js.map +1 -1
  7. package/dist/cli/commands/delivery.d.ts.map +1 -1
  8. package/dist/cli/commands/delivery.js +15 -5
  9. package/dist/cli/commands/delivery.js.map +1 -1
  10. package/dist/cli/commands/generate.d.ts.map +1 -1
  11. package/dist/cli/commands/generate.js +16 -0
  12. package/dist/cli/commands/generate.js.map +1 -1
  13. package/dist/exporters/spec-parser.d.ts.map +1 -1
  14. package/dist/exporters/spec-parser.js +16 -5
  15. package/dist/exporters/spec-parser.js.map +1 -1
  16. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -1
  17. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -1
  18. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -1
  19. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/capture-row-column.hbs +2 -0
  20. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-element-with-text.hbs +1 -1
  21. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-with-alert-action.hbs +2 -0
  22. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/recipe-sequence.hbs +3 -0
  23. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row-nth.hbs +2 -0
  24. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/unknown-element-action.hbs +1 -1
  25. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +3 -0
  26. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -1
  27. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-table-refresh.hbs +3 -0
  28. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/has-text-value.hbs +1 -0
  29. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +1 -1
  30. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -1
  31. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-blur.hbs +1 -0
  32. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-click-text.hbs +3 -0
  33. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-click.hbs +1 -0
  34. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-text.hbs +1 -0
  35. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-value.hbs +1 -0
  36. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-for-each.hbs +5 -0
  37. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-hover.hbs +1 -0
  38. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-press.hbs +1 -0
  39. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-scroll-into-view.hbs +1 -0
  40. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-type.hbs +1 -0
  41. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-wait-for.hbs +1 -0
  42. package/dist/generators/test-generator/app-profile.d.ts +89 -0
  43. package/dist/generators/test-generator/app-profile.d.ts.map +1 -0
  44. package/dist/generators/test-generator/app-profile.js +157 -0
  45. package/dist/generators/test-generator/app-profile.js.map +1 -0
  46. package/dist/generators/test-generator/code-generator.d.ts +4 -0
  47. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  48. package/dist/generators/test-generator/code-generator.js +7 -0
  49. package/dist/generators/test-generator/code-generator.js.map +1 -1
  50. package/dist/generators/test-generator/diagnostics.d.ts +36 -0
  51. package/dist/generators/test-generator/diagnostics.d.ts.map +1 -0
  52. package/dist/generators/test-generator/diagnostics.js +44 -0
  53. package/dist/generators/test-generator/diagnostics.js.map +1 -0
  54. package/dist/generators/test-generator/patterns/types.d.ts +12 -0
  55. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
  56. package/dist/generators/test-generator/recipe-expander.d.ts +32 -0
  57. package/dist/generators/test-generator/recipe-expander.d.ts.map +1 -0
  58. package/dist/generators/test-generator/recipe-expander.js +118 -0
  59. package/dist/generators/test-generator/recipe-expander.js.map +1 -0
  60. package/dist/generators/test-generator/step-mapper.d.ts +17 -0
  61. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  62. package/dist/generators/test-generator/step-mapper.js +70 -0
  63. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  64. package/dist/generators/test-generator/template-engine.d.ts +5 -1
  65. package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
  66. package/dist/generators/test-generator/template-engine.js +27 -3
  67. package/dist/generators/test-generator/template-engine.js.map +1 -1
  68. package/dist/generators/test-generator/utils/selector-resolver.d.ts +10 -1
  69. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  70. package/dist/generators/test-generator/utils/selector-resolver.js +32 -0
  71. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  72. package/dist/harness/catalog/drivers.yaml +1 -1
  73. package/dist/harness/query-catalog.d.ts +32 -2
  74. package/dist/harness/query-catalog.d.ts.map +1 -1
  75. package/dist/harness/query-catalog.js +0 -0
  76. package/dist/harness/query-catalog.js.map +1 -1
  77. package/dist/index.d.ts +5 -2
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +5 -1
  80. package/dist/index.js.map +1 -1
  81. package/dist/orchestrator/templates/ai-src/commands/create-data-test.md +83 -0
  82. package/dist/orchestrator/templates/ai-src/commands/create-test.md +2 -2
  83. package/dist/orchestrator/templates/ai-src/commands/run-test.md +1 -1
  84. package/dist/orchestrator/templates/ai-src/config/claude.md +3 -1
  85. package/dist/orchestrator/templates/ai-src/config/copilot.md +3 -1
  86. package/dist/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +93 -0
  87. package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +12 -1
  88. package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +66 -3
  89. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +22 -0
  90. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +14 -1
  91. package/dist/orchestrator/templates/specs-db.d.ts +204 -6
  92. package/dist/orchestrator/templates/specs-db.d.ts.map +1 -1
  93. package/dist/orchestrator/templates/specs-db.js +495 -54
  94. package/dist/orchestrator/templates/specs-db.js.map +1 -1
  95. package/dist/orchestrator/templates/specs-db.ts +507 -54
  96. package/dist/orchestrator/templates/specs-test-data.ts +39 -3
  97. package/package.json +10 -4
  98. package/src/capabilities/discover.ts +1 -1
  99. package/src/capabilities/registry.ts +13 -0
  100. package/src/cli/commands/delivery.ts +13 -5
  101. package/src/cli/commands/generate.ts +15 -0
  102. package/src/exporters/spec-parser.ts +17 -5
  103. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-accept-action.hbs +1 -1
  104. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-dismiss-action.hbs +1 -1
  105. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/alert-fill-action.hbs +1 -1
  106. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/capture-row-column.hbs +2 -0
  107. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-element-with-text.hbs +1 -1
  108. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-with-alert-action.hbs +2 -0
  109. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/recipe-sequence.hbs +3 -0
  110. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row-nth.hbs +2 -0
  111. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/unknown-element-action.hbs +1 -1
  112. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +3 -0
  113. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -1
  114. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-table-refresh.hbs +3 -0
  115. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/has-text-value.hbs +1 -0
  116. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +1 -1
  117. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -1
  118. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-blur.hbs +1 -0
  119. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-click-text.hbs +3 -0
  120. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-click.hbs +1 -0
  121. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-text.hbs +1 -0
  122. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-value.hbs +1 -0
  123. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-for-each.hbs +5 -0
  124. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-hover.hbs +1 -0
  125. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-press.hbs +1 -0
  126. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-scroll-into-view.hbs +1 -0
  127. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-type.hbs +1 -0
  128. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-wait-for.hbs +1 -0
  129. package/src/generators/test-generator/app-profile.ts +185 -0
  130. package/src/generators/test-generator/code-generator.ts +9 -0
  131. package/src/generators/test-generator/diagnostics.ts +51 -0
  132. package/src/generators/test-generator/patterns/types.ts +12 -0
  133. package/src/generators/test-generator/recipe-expander.ts +129 -0
  134. package/src/generators/test-generator/step-mapper.ts +73 -0
  135. package/src/generators/test-generator/template-engine.ts +29 -3
  136. package/src/generators/test-generator/utils/selector-resolver.ts +49 -2
  137. package/src/harness/catalog/drivers.yaml +1 -1
  138. package/src/harness/query-catalog.ts +0 -0
  139. package/src/index.ts +5 -2
  140. package/src/orchestrator/templates/ai-src/commands/create-data-test.md +83 -0
  141. package/src/orchestrator/templates/ai-src/commands/create-test.md +2 -2
  142. package/src/orchestrator/templates/ai-src/commands/run-test.md +1 -1
  143. package/src/orchestrator/templates/ai-src/config/claude.md +3 -1
  144. package/src/orchestrator/templates/ai-src/config/copilot.md +3 -1
  145. package/src/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +93 -0
  146. package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +12 -1
  147. package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +66 -3
  148. package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +22 -0
  149. package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +14 -1
  150. package/src/orchestrator/templates/specs-db.ts +507 -54
  151. package/src/orchestrator/templates/specs-test-data.ts +39 -3
@@ -48,9 +48,27 @@ export class TestDataLoader {
48
48
  if (value === undefined || value === null) {
49
49
  throw new Error(`Test data key not found: ${key}`);
50
50
  }
51
+ // A projected array (e.g. `{{q.rows[*].name}}`) serializes as a JSON list so the full
52
+ // ordered set is preserved for the assert-compare — String([...]) would flatten it to a
53
+ // lossy comma-join that can't be distinguished from a scalar containing commas.
54
+ if (Array.isArray(value)) return this.interpolate(JSON.stringify(value));
51
55
  return this.interpolate(String(value));
52
56
  }
53
57
 
58
+ /**
59
+ * Resolve a key to its RAW, uncoerced value (array/object/number kept as-is) — for binding
60
+ * DB query parameters, where type-strict stores (MySQL numeric columns, MongoDB) require the
61
+ * native type. get() stringifies for Gherkin text; raw() must not. Throws on missing, mirroring
62
+ * get()'s guard.
63
+ */
64
+ raw(key: string): any {
65
+ const value = this.resolve(key);
66
+ if (value === undefined || value === null) {
67
+ throw new Error(`Test data key not found: ${key}`);
68
+ }
69
+ return value;
70
+ }
71
+
54
72
  /**
55
73
  * Substitute embedded `{{ref}}` cross-references inside a resolved string value.
56
74
  * Each ref is looked up via resolve() (flat key, @cases row column, or dotted path),
@@ -78,6 +96,7 @@ export class TestDataLoader {
78
96
  * `q.count` / `q.length` → number of rows
79
97
  * `q.first.col` / `q.last.col` / `q[2].col` → a specific row's column
80
98
  * `q.col` → shorthand for the first row's column
99
+ * `q.rows[*].col` → the `col` of EVERY row, projected to an ordered array
81
100
  */
82
101
  private resolve(key: string): any {
83
102
  // 1. Exact flat key — captured vars (set()) live under a literal, possibly dotted, key.
@@ -88,9 +107,26 @@ export class TestDataLoader {
88
107
  return this.data[key];
89
108
  }
90
109
  // 2. Structured path: head from the row (cases) or shared data, then walk segments.
91
- const tokens = String(key).replace(/\[(\d+)\]/g, '.$1').split('.');
92
- let cur: any = (this.row && tokens[0] in this.row) ? this.row[tokens[0]] : this.data[tokens[0]];
93
- for (let i = 1; i < tokens.length && cur != null; i++) cur = TestDataLoader.step(cur, tokens[i]);
110
+ // `[n]` `.n` (numeric index); `[*]` → `.*` (project the rest of the path over each element).
111
+ const tokens = String(key).replace(/\[(\d+)\]/g, '.$1').replace(/\[\*\]/g, '.*').split('.');
112
+ const cur: any = (this.row && tokens[0] in this.row) ? this.row[tokens[0]] : this.data[tokens[0]];
113
+ return TestDataLoader.walk(cur, tokens, 1);
114
+ }
115
+
116
+ /**
117
+ * Walk the remaining path tokens from `i`. A `*` token on an array projects: the rest of the
118
+ * path is mapped over every element and the collected array returned (recurses for nested `[*]`).
119
+ * Non-`*` tokens use the linear single-step navigation, so numeric/first/last/object access is
120
+ * unchanged.
121
+ */
122
+ private static walk(cur: any, tokens: string[], i: number): any {
123
+ for (; i < tokens.length && cur != null; i++) {
124
+ if (tokens[i] === '*' && Array.isArray(cur)) {
125
+ const rest = tokens.slice(i + 1);
126
+ return cur.map((el) => TestDataLoader.walk(el, rest, 0));
127
+ }
128
+ cur = TestDataLoader.step(cur, tokens[i]);
129
+ }
94
130
  return cur;
95
131
  }
96
132