@sun-asterisk/sungen 3.2.26 → 3.2.28

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 (62) hide show
  1. package/dist/cli/commands/next.js +2 -2
  2. package/dist/cli/commands/next.js.map +1 -1
  3. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/page-assertion.hbs +6 -0
  4. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +2 -1
  5. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +6 -2
  6. package/dist/generators/test-generator/code-generator.js +1 -1
  7. package/dist/generators/test-generator/code-generator.js.map +1 -1
  8. package/dist/generators/test-generator/step-mapper.js +4 -4
  9. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  10. package/dist/generators/test-generator/utils/selector-resolver.d.ts +1 -0
  11. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  12. package/dist/generators/test-generator/utils/selector-resolver.js +6 -1
  13. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  14. package/dist/harness/audit.js +4 -4
  15. package/dist/harness/audit.js.map +1 -1
  16. package/dist/harness/flow-contract.d.ts +0 -14
  17. package/dist/harness/flow-contract.d.ts.map +1 -1
  18. package/dist/harness/flow-contract.js +44 -9
  19. package/dist/harness/flow-contract.js.map +1 -1
  20. package/dist/harness/next-step.d.ts +8 -2
  21. package/dist/harness/next-step.d.ts.map +1 -1
  22. package/dist/harness/next-step.js +3 -2
  23. package/dist/harness/next-step.js.map +1 -1
  24. package/dist/harness/sensors.d.ts +1 -0
  25. package/dist/harness/sensors.d.ts.map +1 -1
  26. package/dist/harness/sensors.js +34 -1
  27. package/dist/harness/sensors.js.map +1 -1
  28. package/dist/orchestrator/templates/ai-src/commands/create-test.md +1 -1
  29. package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +21 -3
  30. package/dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +18 -0
  31. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +4 -0
  32. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +12 -2
  33. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-d-display.md +1 -0
  34. package/dist/orchestrator/templates/specs-url-assert.d.ts +31 -0
  35. package/dist/orchestrator/templates/specs-url-assert.d.ts.map +1 -1
  36. package/dist/orchestrator/templates/specs-url-assert.js +43 -0
  37. package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
  38. package/dist/orchestrator/templates/specs-url-assert.ts +54 -0
  39. package/dist/utils/ref-key.d.ts +30 -0
  40. package/dist/utils/ref-key.d.ts.map +1 -0
  41. package/dist/utils/ref-key.js +48 -0
  42. package/dist/utils/ref-key.js.map +1 -0
  43. package/package.json +3 -3
  44. package/src/cli/commands/next.ts +2 -2
  45. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/page-assertion.hbs +6 -0
  46. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +2 -1
  47. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +6 -2
  48. package/src/generators/test-generator/code-generator.ts +1 -1
  49. package/src/generators/test-generator/step-mapper.ts +2 -2
  50. package/src/generators/test-generator/utils/selector-resolver.ts +12 -1
  51. package/src/harness/audit.ts +4 -4
  52. package/src/harness/flow-contract.ts +41 -8
  53. package/src/harness/next-step.ts +11 -4
  54. package/src/harness/sensors.ts +34 -3
  55. package/src/orchestrator/templates/ai-src/commands/create-test.md +1 -1
  56. package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +21 -3
  57. package/src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +18 -0
  58. package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +4 -0
  59. package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +12 -2
  60. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-d-display.md +1 -0
  61. package/src/orchestrator/templates/specs-url-assert.ts +54 -0
  62. package/src/utils/ref-key.ts +43 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ONE vocabulary for what a `[Reference]` means.
3
+ *
4
+ * The compiler's documented key rule is "the lowercase of the `[Reference]` text, spaces
5
+ * preserved" (`SelectorResolver.generateKey`). The harness re-implemented that rule with its own
6
+ * regex — `/\[([a-z0-9_.-]+):/` — which has no space in it, so a multi-word screen such as
7
+ * `[Basic Info:Email]` compiled, ran and passed, and was NEVER seen by `touchesOutcome`,
8
+ * `reachesOutcome`, phase coverage, handoffs or the navigation-target check. A real project
9
+ * hyphenated every namespace with zero functional change and its audit went 6.9 → 8.9 (#660).
10
+ *
11
+ * Two rules, one place:
12
+ * - `normalizeRefLabel` IS the compiler's key rule. The compiler delegates here.
13
+ * - `screenKey` is the COMPARISON form the harness uses for a screen/namespace: separators are
14
+ * equivalent (`basic info` ≡ `basic-info` ≡ `basic_info`), because a contract author writes
15
+ * `outcome.screen: basic-info` as readily as the feature writes `[Basic Info:…]`, and the
16
+ * harness only ever asks "is this the same screen?" — never "which YAML key resolves?".
17
+ */
18
+
19
+ /** The compiler's selector-key rule: NFC, lowercase, trimmed, inner whitespace collapsed. */
20
+ export function normalizeRefLabel(label: string): string {
21
+ return label.normalize('NFC').toLowerCase().trim().replace(/\s+/g, ' ');
22
+ }
23
+
24
+ /** Comparison form for a screen / namespace name — separator-insensitive. */
25
+ export function screenKey(label: string): string {
26
+ return normalizeRefLabel(label).replace(/[\s_-]+/g, ' ').trim();
27
+ }
28
+
29
+ /**
30
+ * Every namespace a piece of step text references, in order, as `screenKey`s.
31
+ * `[Screen:Element]` → `screen`; a bare `[Screen]` page reference is included too when `bare`
32
+ * is set (a `see [Done] page` assertion names the screen without an element).
33
+ */
34
+ export function refNamespaces(text: string, opts: { bare?: boolean } = {}): string[] {
35
+ const out: string[] = [];
36
+ for (const m of text.matchAll(/\[([^\]]+)\]/g)) {
37
+ const inner = m[1];
38
+ const colon = inner.indexOf(':');
39
+ if (colon !== -1) out.push(screenKey(inner.slice(0, colon)));
40
+ else if (opts.bare) out.push(screenKey(inner));
41
+ }
42
+ return out;
43
+ }