@sun-asterisk/sungen 3.2.24 → 3.2.26
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.
- package/dist/capabilities/context-router.d.ts.map +1 -1
- package/dist/capabilities/context-router.js +15 -7
- package/dist/capabilities/context-router.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +23 -4
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/capability.d.ts.map +1 -1
- package/dist/cli/commands/capability.js +6 -48
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/changed.d.ts +14 -0
- package/dist/cli/commands/changed.d.ts.map +1 -0
- package/dist/cli/commands/changed.js +128 -0
- package/dist/cli/commands/changed.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +25 -1
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.js +1 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/results-merge.d.ts +19 -0
- package/dist/cli/commands/results-merge.d.ts.map +1 -0
- package/dist/cli/commands/results-merge.js +191 -0
- package/dist/cli/commands/results-merge.js.map +1 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +100 -12
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/exporters/api-catalog-loader.d.ts.map +1 -1
- package/dist/exporters/api-catalog-loader.js +10 -3
- package/dist/exporters/api-catalog-loader.js.map +1 -1
- package/dist/exporters/api-testcase-formatter.d.ts +9 -0
- package/dist/exporters/api-testcase-formatter.d.ts.map +1 -1
- package/dist/exporters/api-testcase-formatter.js +55 -3
- package/dist/exporters/api-testcase-formatter.js.map +1 -1
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +10 -1
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/json-exporter.d.ts.map +1 -1
- package/dist/exporters/json-exporter.js +6 -1
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +14 -1
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/export.js +1 -1
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/matrix/map-loader.d.ts.map +1 -1
- package/dist/exporters/matrix/map-loader.js +5 -0
- package/dist/exporters/matrix/map-loader.js.map +1 -1
- package/dist/exporters/matrix/render-csv.d.ts.map +1 -1
- package/dist/exporters/matrix/render-csv.js +5 -1
- package/dist/exporters/matrix/render-csv.js.map +1 -1
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
- package/dist/exporters/matrix/render-xlsx.js +4 -1
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +18 -0
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.map +1 -1
- package/dist/exporters/playwright-report-parser.d.ts +17 -2
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
- package/dist/exporters/playwright-report-parser.js +68 -8
- package/dist/exporters/playwright-report-parser.js.map +1 -1
- package/dist/exporters/results-merge.d.ts +46 -0
- package/dist/exporters/results-merge.d.ts.map +1 -0
- package/dist/exporters/results-merge.js +148 -0
- package/dist/exporters/results-merge.js.map +1 -0
- package/dist/exporters/selector-key-resolver.d.ts +4 -0
- package/dist/exporters/selector-key-resolver.d.ts.map +1 -1
- package/dist/exporters/selector-key-resolver.js +101 -1
- package/dist/exporters/selector-key-resolver.js.map +1 -1
- package/dist/exporters/types.d.ts +8 -1
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.js +5 -4
- package/dist/exporters/xlsx-report-builder.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +2 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +52 -1
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +20 -10
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/appium/appium-adapter.d.ts +2 -11
- package/dist/generators/test-generator/adapters/appium/appium-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/appium/appium-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/appium/templates/imports.hbs +3 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/date-picker-unsupported.hbs +4 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/lifecycle-missing-app-id.hbs +5 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/matches-format-assertion.hbs +15 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-filtered-assertion.hbs +5 -2
- package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +185 -26
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +2 -11
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +17 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/attribute-assertion.hbs +6 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-value-assertion.hbs +18 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +5 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/matches-format-assertion.hbs +5 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +4 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-text.hbs +1 -1
- package/dist/generators/test-generator/code-generator.d.ts +6 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +80 -7
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +60 -6
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +59 -5
- package/dist/generators/test-generator/diagnostics.js.map +1 -1
- package/dist/generators/test-generator/patterns/expect-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/expect-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/expect-patterns.js +36 -2
- package/dist/generators/test-generator/patterns/expect-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +19 -12
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +58 -38
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +23 -0
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/unsupported-step-code.d.ts +18 -0
- package/dist/generators/test-generator/patterns/unsupported-step-code.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/unsupported-step-code.js +23 -0
- package/dist/generators/test-generator/patterns/unsupported-step-code.js.map +1 -0
- package/dist/generators/test-generator/recipe-expander.js +9 -1
- package/dist/generators/test-generator/recipe-expander.js.map +1 -1
- package/dist/generators/test-generator/reset-tier.d.ts +68 -0
- package/dist/generators/test-generator/reset-tier.d.ts.map +1 -0
- package/dist/generators/test-generator/reset-tier.js +94 -0
- package/dist/generators/test-generator/reset-tier.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +39 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +144 -5
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts +2 -10
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +16 -2
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/utils/format-pattern.d.ts +35 -0
- package/dist/generators/test-generator/utils/format-pattern.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/format-pattern.js +82 -0
- package/dist/generators/test-generator/utils/format-pattern.js.map +1 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.d.ts +42 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.js +142 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.js.map +1 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.d.ts +18 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.js +25 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.js.map +1 -0
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts +9 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.js +124 -63
- package/dist/generators/test-generator/utils/runtime-data-transformer.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +20 -1
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/spec-syntax-check.d.ts +14 -0
- package/dist/generators/test-generator/utils/spec-syntax-check.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/spec-syntax-check.js +26 -0
- package/dist/generators/test-generator/utils/spec-syntax-check.js.map +1 -0
- package/dist/harness/annotation-overrides.d.ts +0 -12
- package/dist/harness/annotation-overrides.d.ts.map +1 -1
- package/dist/harness/annotation-overrides.js +9 -5
- package/dist/harness/annotation-overrides.js.map +1 -1
- package/dist/harness/audit.d.ts +7 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +78 -10
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +2 -1
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +8 -3
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/capability.d.ts +11 -0
- package/dist/harness/capability.d.ts.map +1 -1
- package/dist/harness/capability.js +8 -0
- package/dist/harness/capability.js.map +1 -1
- package/dist/harness/catalog/drivers.yaml +5 -0
- package/dist/harness/flow-contract.d.ts +18 -1
- package/dist/harness/flow-contract.d.ts.map +1 -1
- package/dist/harness/flow-contract.js +72 -9
- package/dist/harness/flow-contract.js.map +1 -1
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +5 -1
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/quality-gates.d.ts +12 -1
- package/dist/harness/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +62 -7
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/run-manifest.d.ts +58 -0
- package/dist/harness/run-manifest.d.ts.map +1 -0
- package/dist/harness/run-manifest.js +264 -0
- package/dist/harness/run-manifest.js.map +1 -0
- package/dist/harness/spec-branches.d.ts +88 -0
- package/dist/harness/spec-branches.d.ts.map +1 -0
- package/dist/harness/spec-branches.js +280 -0
- package/dist/harness/spec-branches.js.map +1 -0
- package/dist/harness/spec-coverage.d.ts +1 -1
- package/dist/harness/spec-coverage.js +4 -4
- package/dist/harness/spec-coverage.js.map +1 -1
- package/dist/harness/viewpoint-baseline.d.ts +9 -0
- package/dist/harness/viewpoint-baseline.d.ts.map +1 -1
- package/dist/harness/viewpoint-baseline.js +33 -3
- package/dist/harness/viewpoint-baseline.js.map +1 -1
- package/dist/harness/viewpoint-ledger.d.ts +1 -1
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +88 -9
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/lockstep-version.d.ts +22 -0
- package/dist/orchestrator/lockstep-version.d.ts.map +1 -0
- package/dist/orchestrator/lockstep-version.js +58 -0
- package/dist/orchestrator/lockstep-version.js.map +1 -0
- package/dist/orchestrator/project-deps-sync.d.ts +39 -0
- package/dist/orchestrator/project-deps-sync.d.ts.map +1 -0
- package/dist/orchestrator/project-deps-sync.js +175 -0
- package/dist/orchestrator/project-deps-sync.js.map +1 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +5 -2
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/add-flow.md +16 -0
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +9 -0
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +9 -2
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +109 -0
- package/dist/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/dist/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-api-design/SKILL.md +49 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +14 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +110 -6
- package/dist/orchestrator/templates/ai-src/skills/sungen-locale/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +8 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +40 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +15 -0
- package/dist/orchestrator/templates/env.appium.example +10 -0
- package/dist/orchestrator/templates/specs-api.d.ts +4 -2
- package/dist/orchestrator/templates/specs-api.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-api.js +233 -10
- package/dist/orchestrator/templates/specs-api.js.map +1 -1
- package/dist/orchestrator/templates/specs-api.ts +214 -11
- package/dist/orchestrator/templates/specs-regex-escape.d.ts +13 -0
- package/dist/orchestrator/templates/specs-regex-escape.d.ts.map +1 -0
- package/dist/orchestrator/templates/specs-regex-escape.js +19 -0
- package/dist/orchestrator/templates/specs-regex-escape.js.map +1 -0
- package/dist/orchestrator/templates/specs-regex-escape.ts +16 -0
- package/dist/orchestrator/templates/specs-test-data.ts +53 -6
- package/dist/orchestrator/templates/wdio.conf.ts +28 -9
- package/package.json +8 -6
- package/src/capabilities/context-router.ts +13 -5
- package/src/cli/commands/audit.ts +22 -3
- package/src/cli/commands/capability.ts +4 -38
- package/src/cli/commands/changed.ts +104 -0
- package/src/cli/commands/delivery.ts +27 -2
- package/src/cli/commands/generate.ts +1 -1
- package/src/cli/commands/results-merge.ts +153 -0
- package/src/cli/commands/update.ts +72 -13
- package/src/cli/index.ts +4 -0
- package/src/exporters/api-catalog-loader.ts +10 -2
- package/src/exporters/api-testcase-formatter.ts +59 -3
- package/src/exporters/csv-exporter.ts +11 -2
- package/src/exporters/json-exporter.ts +7 -2
- package/src/exporters/matrix/build.ts +13 -1
- package/src/exporters/matrix/export.ts +1 -1
- package/src/exporters/matrix/map-loader.ts +5 -0
- package/src/exporters/matrix/render-csv.ts +5 -1
- package/src/exporters/matrix/render-xlsx.ts +4 -1
- package/src/exporters/matrix/types.ts +18 -0
- package/src/exporters/playwright-report-parser.ts +68 -9
- package/src/exporters/results-merge.ts +150 -0
- package/src/exporters/selector-key-resolver.ts +81 -1
- package/src/exporters/types.ts +8 -1
- package/src/exporters/xlsx-report-builder.ts +5 -4
- package/src/generators/gherkin-parser/index.ts +55 -1
- package/src/generators/test-generator/adapters/adapter-interface.ts +23 -1
- package/src/generators/test-generator/adapters/appium/appium-adapter.ts +2 -2
- package/src/generators/test-generator/adapters/appium/templates/imports.hbs +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/date-picker-unsupported.hbs +4 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/lifecycle-missing-app-id.hbs +5 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/matches-format-assertion.hbs +15 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-filtered-assertion.hbs +5 -2
- package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +185 -26
- package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +2 -2
- package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +17 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/attribute-assertion.hbs +6 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-value-assertion.hbs +18 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +5 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/matches-format-assertion.hbs +5 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +4 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-text.hbs +1 -1
- package/src/generators/test-generator/code-generator.ts +86 -7
- package/src/generators/test-generator/diagnostics.ts +60 -6
- package/src/generators/test-generator/patterns/expect-patterns.ts +37 -2
- package/src/generators/test-generator/patterns/index.ts +58 -33
- package/src/generators/test-generator/patterns/types.ts +36 -0
- package/src/generators/test-generator/patterns/unsupported-step-code.ts +19 -0
- package/src/generators/test-generator/recipe-expander.ts +9 -1
- package/src/generators/test-generator/reset-tier.ts +93 -0
- package/src/generators/test-generator/step-mapper.ts +149 -6
- package/src/generators/test-generator/template-engine.ts +18 -3
- package/src/generators/test-generator/utils/format-pattern.ts +79 -0
- package/src/generators/test-generator/utils/js-literal-scanner.ts +132 -0
- package/src/generators/test-generator/utils/mask-refs-for-matching.ts +21 -0
- package/src/generators/test-generator/utils/runtime-data-transformer.ts +126 -76
- package/src/generators/test-generator/utils/selector-resolver.ts +22 -1
- package/src/generators/test-generator/utils/spec-syntax-check.ts +22 -0
- package/src/harness/annotation-overrides.ts +10 -5
- package/src/harness/audit.ts +82 -12
- package/src/harness/capability-plan.ts +10 -5
- package/src/harness/capability.ts +16 -0
- package/src/harness/catalog/drivers.yaml +5 -0
- package/src/harness/flow-contract.ts +87 -9
- package/src/harness/parse.ts +5 -1
- package/src/harness/quality-gates.ts +64 -6
- package/src/harness/run-manifest.ts +254 -0
- package/src/harness/spec-branches.ts +346 -0
- package/src/harness/spec-coverage.ts +4 -4
- package/src/harness/viewpoint-baseline.ts +41 -6
- package/src/harness/viewpoint-ledger.ts +82 -9
- package/src/index.ts +1 -0
- package/src/orchestrator/lockstep-version.ts +46 -0
- package/src/orchestrator/project-deps-sync.ts +175 -0
- package/src/orchestrator/project-initializer.ts +5 -2
- package/src/orchestrator/templates/ai-src/commands/add-flow.md +16 -0
- package/src/orchestrator/templates/ai-src/commands/create-test.md +9 -0
- package/src/orchestrator/templates/ai-src/commands/delivery.md +9 -2
- package/src/orchestrator/templates/ai-src/commands/run-test.md +109 -0
- package/src/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/src/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-api-design/SKILL.md +49 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +14 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +110 -6
- package/src/orchestrator/templates/ai-src/skills/sungen-locale/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +8 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +40 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +15 -0
- package/src/orchestrator/templates/env.appium.example +10 -0
- package/src/orchestrator/templates/specs-api.ts +214 -11
- package/src/orchestrator/templates/specs-regex-escape.ts +16 -0
- package/src/orchestrator/templates/specs-test-data.ts +53 -6
- package/src/orchestrator/templates/wdio.conf.ts +28 -9
|
@@ -12,8 +12,11 @@ import { PlaywrightResult } from './types';
|
|
|
12
12
|
* Candidate order (first existing wins):
|
|
13
13
|
* 1. <genDir>/<featureBaseName>-test-result.<SUNGEN_ENV>.json (env runs)
|
|
14
14
|
* 2. <genDir>/<featureBaseName>-test-result.json (per-feature reporter)
|
|
15
|
-
* 3. <
|
|
16
|
-
*
|
|
15
|
+
* 3. <genDir>/<featureBaseName>-test-result.<os>[.<SUNGEN_ENV>].json — mobile per-OS
|
|
16
|
+
* reporter files (wdio writes one per capability; a mobile project has NO base file).
|
|
17
|
+
* MOBILE_PLATFORM picks the OS explicitly; otherwise android, then ios.
|
|
18
|
+
* 4. <cwd>/test-results/results.<SUNGEN_ENV>.json
|
|
19
|
+
* 5. <cwd>/test-results/results.json (playwright default)
|
|
17
20
|
*/
|
|
18
21
|
export declare function resolveResultsPath(cwd: string, genDir: string, featureBaseName: string): string | null;
|
|
19
22
|
/**
|
|
@@ -27,6 +30,12 @@ export declare function loadPlaywrightReport(reportPath: string): Map<string, Pl
|
|
|
27
30
|
* Returns null if the file is missing/invalid or no projects are listed.
|
|
28
31
|
*/
|
|
29
32
|
export declare function loadReportProjectName(reportPath: string): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* If the full title starts with a file-path-looking suite title like
|
|
35
|
+
* "specs/generated/kudos/kudos.spec.ts > Feature Name > ...",
|
|
36
|
+
* strip that leading segment so matching works against "Feature Name > ...".
|
|
37
|
+
*/
|
|
38
|
+
export declare function stripLeadingFilePathSuite(fullTitle: string): string;
|
|
30
39
|
/**
|
|
31
40
|
* CSV "Test Result" column mapping.
|
|
32
41
|
*/
|
|
@@ -59,4 +68,10 @@ export declare function parseExpectedReceived(raw: string): {
|
|
|
59
68
|
* Plus the trace path.
|
|
60
69
|
*/
|
|
61
70
|
export declare function formatNote(result: PlaywrightResult | undefined, expectedFallback?: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* One-cell error rendering for the matrix deliverable: newlines collapsed and
|
|
73
|
+
* clipped to the same cap as Note fields. Replaces ad-hoc `slice(0, 200)` calls
|
|
74
|
+
* that could cut a joined multi-error message mid-assertion.
|
|
75
|
+
*/
|
|
76
|
+
export declare function clipNoteField(s: string): string;
|
|
62
77
|
//# sourceMappingURL=playwright-report-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-report-parser.d.ts","sourceRoot":"","sources":["../../src/exporters/playwright-report-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C
|
|
1
|
+
{"version":3,"file":"playwright-report-parser.d.ts","sourceRoot":"","sources":["../../src/exporters/playwright-report-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBtG;AAwDD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAmE7F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASvE;AA2BD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAc7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUxE;AAQD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAM3F;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EAAE,gBAAgB,SAAK,GAAG,MAAM,CAwC9F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -39,10 +39,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.resolveResultsPath = resolveResultsPath;
|
|
40
40
|
exports.loadPlaywrightReport = loadPlaywrightReport;
|
|
41
41
|
exports.loadReportProjectName = loadReportProjectName;
|
|
42
|
+
exports.stripLeadingFilePathSuite = stripLeadingFilePathSuite;
|
|
42
43
|
exports.statusToTestResult = statusToTestResult;
|
|
43
44
|
exports.formatExecutedDate = formatExecutedDate;
|
|
44
45
|
exports.parseExpectedReceived = parseExpectedReceived;
|
|
45
46
|
exports.formatNote = formatNote;
|
|
47
|
+
exports.clipNoteField = clipNoteField;
|
|
46
48
|
const fs = __importStar(require("fs"));
|
|
47
49
|
const path = __importStar(require("path"));
|
|
48
50
|
/**
|
|
@@ -55,8 +57,11 @@ const path = __importStar(require("path"));
|
|
|
55
57
|
* Candidate order (first existing wins):
|
|
56
58
|
* 1. <genDir>/<featureBaseName>-test-result.<SUNGEN_ENV>.json (env runs)
|
|
57
59
|
* 2. <genDir>/<featureBaseName>-test-result.json (per-feature reporter)
|
|
58
|
-
* 3. <
|
|
59
|
-
*
|
|
60
|
+
* 3. <genDir>/<featureBaseName>-test-result.<os>[.<SUNGEN_ENV>].json — mobile per-OS
|
|
61
|
+
* reporter files (wdio writes one per capability; a mobile project has NO base file).
|
|
62
|
+
* MOBILE_PLATFORM picks the OS explicitly; otherwise android, then ios.
|
|
63
|
+
* 4. <cwd>/test-results/results.<SUNGEN_ENV>.json
|
|
64
|
+
* 5. <cwd>/test-results/results.json (playwright default)
|
|
60
65
|
*/
|
|
61
66
|
function resolveResultsPath(cwd, genDir, featureBaseName) {
|
|
62
67
|
const env = process.env.SUNGEN_ENV;
|
|
@@ -64,6 +69,12 @@ function resolveResultsPath(cwd, genDir, featureBaseName) {
|
|
|
64
69
|
if (env)
|
|
65
70
|
candidates.push(path.join(genDir, `${featureBaseName}-test-result.${env}.json`));
|
|
66
71
|
candidates.push(path.join(genDir, `${featureBaseName}-test-result.json`));
|
|
72
|
+
const mobileOs = (process.env.MOBILE_PLATFORM || '').toLowerCase();
|
|
73
|
+
for (const os of mobileOs === 'android' || mobileOs === 'ios' ? [mobileOs] : ['android', 'ios']) {
|
|
74
|
+
if (env)
|
|
75
|
+
candidates.push(path.join(genDir, `${featureBaseName}-test-result.${os}.${env}.json`));
|
|
76
|
+
candidates.push(path.join(genDir, `${featureBaseName}-test-result.${os}.json`));
|
|
77
|
+
}
|
|
67
78
|
if (env)
|
|
68
79
|
candidates.push(path.join(cwd, 'test-results', `results.${env}.json`));
|
|
69
80
|
candidates.push(path.join(cwd, 'test-results', 'results.json'));
|
|
@@ -122,7 +133,31 @@ function loadPlaywrightReport(reportPath) {
|
|
|
122
133
|
const results = test?.results || [];
|
|
123
134
|
const res = results[results.length - 1];
|
|
124
135
|
const status = normalizeStatus(res?.status);
|
|
125
|
-
|
|
136
|
+
// Collect EVERY failure message of the attempt, not just the first: a test
|
|
137
|
+
// timeout wraps the real assertion failure, so `error` alone holds only
|
|
138
|
+
// "Test timeout of 15000ms exceeded." while the Locator/Expected/Received
|
|
139
|
+
// detail QA needs sits in errors[1+]. Stack frames are stripped PER message
|
|
140
|
+
// before joining — otherwise the first message's stack swallows the rest
|
|
141
|
+
// when downstream consumers cut at the first "at " frame.
|
|
142
|
+
const rawMessages = (res?.errors?.length ? res.errors.map((e) => e.message) : [res?.error?.message])
|
|
143
|
+
.map((m) => stripAnsi(m || ''))
|
|
144
|
+
.filter(Boolean);
|
|
145
|
+
const distinct = [];
|
|
146
|
+
const seenKeys = new Set();
|
|
147
|
+
for (const m of rawMessages) {
|
|
148
|
+
const stripped = m.split(/\n\s*at\s/)[0].trim();
|
|
149
|
+
// Key ignores a leading `Error:` — "Error: page closed" and "page closed"
|
|
150
|
+
// are the same failure and must not render as two Note bullets.
|
|
151
|
+
const key = stripped.replace(/^Error:\s*/i, '');
|
|
152
|
+
if (!key || seenKeys.has(key))
|
|
153
|
+
continue;
|
|
154
|
+
seenKeys.add(key);
|
|
155
|
+
distinct.push(stripped);
|
|
156
|
+
}
|
|
157
|
+
// Single message: keep the legacy shape (stack intact) so every existing
|
|
158
|
+
// consumer renders byte-identical output. Multiple: join the stack-stripped
|
|
159
|
+
// distinct messages so none can hide behind another's stack.
|
|
160
|
+
const errorMsg = distinct.length > 1 ? distinct.join('\n') : stripAnsi(res?.error?.message || rawMessages[0] || '');
|
|
126
161
|
const trace = res?.attachments?.find((a) => a.name === 'trace' || a.contentType === 'application/zip')?.path;
|
|
127
162
|
// Strip the leading file-path suite title if present.
|
|
128
163
|
// The top-level suite title is usually a file path like "specs/generated/kudos/kudos.spec.ts".
|
|
@@ -134,6 +169,7 @@ function loadPlaywrightReport(reportPath) {
|
|
|
134
169
|
duration: typeof res?.duration === 'number' ? res.duration : undefined,
|
|
135
170
|
startTime: res?.startTime,
|
|
136
171
|
error: errorMsg,
|
|
172
|
+
errorMessages: distinct.length > 0 ? distinct : undefined,
|
|
137
173
|
tracePath: trace,
|
|
138
174
|
projectName: test?.projectName,
|
|
139
175
|
});
|
|
@@ -269,11 +305,23 @@ function formatNote(result, expectedFallback = '') {
|
|
|
269
305
|
return '';
|
|
270
306
|
if (result.status !== 'failed' && result.status !== 'timedOut')
|
|
271
307
|
return '';
|
|
272
|
-
//
|
|
273
|
-
//
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
308
|
+
// Per-message: stack frames dropped (frames start with "at ") + a leading `Error:` stripped.
|
|
309
|
+
// Keep newlines inside each message so parseExpectedReceived can delimit Expected/Received.
|
|
310
|
+
const messages = (result.errorMessages?.length ? result.errorMessages : [result.error || ''])
|
|
311
|
+
.map((m) => m.split(/\n\s*at\s/)[0].replace(/^Error:\s*/i, '').trim())
|
|
312
|
+
.filter(Boolean);
|
|
313
|
+
// The message that carries the assertion detail drives Expected/Actual; the other
|
|
314
|
+
// messages (e.g. the "Test timeout of 15000ms exceeded." wrapper) must still be
|
|
315
|
+
// shown — a real assertion failure rendered as a bare timeout reads as flaky.
|
|
316
|
+
// Prefer a message carrying BOTH halves: a half-match (Expected in one message,
|
|
317
|
+
// Received in another) would otherwise put the wrong text in Actual. With
|
|
318
|
+
// expect.soft the first assertion drives the split and the later assertion
|
|
319
|
+
// messages render as `• Error:` bullets — content preserved, columns describe #1.
|
|
320
|
+
const halves = (m) => { const er = parseExpectedReceived(m); return (er.expected ? 1 : 0) + (er.received ? 1 : 0); };
|
|
321
|
+
const assertion = messages.find((m) => halves(m) === 2) ?? messages.find((m) => halves(m) >= 1) ?? messages[0] ?? '';
|
|
322
|
+
const wrappers = messages.filter((m) => m !== assertion);
|
|
323
|
+
const { expected, received } = parseExpectedReceived(assertion);
|
|
324
|
+
const actual = received || clip(assertion); // received value, else the raw error
|
|
277
325
|
// Newline-separated bullets so each field lands on its own row when the cell wraps — matches the
|
|
278
326
|
// Test Data column's `• key: value` formatting. Excel/CSV honour `\n` inside quoted cells; the
|
|
279
327
|
// dashboard modal renders with whitespace-pre-wrap.
|
|
@@ -292,8 +340,20 @@ function formatNote(result, expectedFallback = '') {
|
|
|
292
340
|
}
|
|
293
341
|
if (actual)
|
|
294
342
|
parts.push(`• Actual result: ${actual}`);
|
|
343
|
+
// Non-assertion companions of an assertion failure (timeout wrapper etc.), one
|
|
344
|
+
// clipped bullet each so no cell field can blow past the XLSX-safe cap.
|
|
345
|
+
for (const w of wrappers)
|
|
346
|
+
parts.push(`• Error: ${clip(w)}`);
|
|
295
347
|
if (result.tracePath)
|
|
296
348
|
parts.push(`• Trace: ${result.tracePath}`);
|
|
297
349
|
return parts.join('\n');
|
|
298
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* One-cell error rendering for the matrix deliverable: newlines collapsed and
|
|
353
|
+
* clipped to the same cap as Note fields. Replaces ad-hoc `slice(0, 200)` calls
|
|
354
|
+
* that could cut a joined multi-error message mid-assertion.
|
|
355
|
+
*/
|
|
356
|
+
function clipNoteField(s) {
|
|
357
|
+
return clip(s);
|
|
358
|
+
}
|
|
299
359
|
//# sourceMappingURL=playwright-report-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-report-parser.js","sourceRoot":"","sources":["../../src/exporters/playwright-report-parser.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"playwright-report-parser.js","sourceRoot":"","sources":["../../src/exporters/playwright-report-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge two Playwright JSON reports by FULL TEST TITLE — the fix for subset
|
|
3
|
+
* re-runs: Playwright's JSON reporter overwrites the per-target result file,
|
|
4
|
+
* so re-running the 3 failed cases of a 100-case screen used to throw away
|
|
5
|
+
* the 97 passing results (QA then re-ran everything, or asked an AI to merge
|
|
6
|
+
* by hand — non-deterministic).
|
|
7
|
+
*
|
|
8
|
+
* Semantics (deterministic):
|
|
9
|
+
* - same title in both → the NEW spec wins wholesale (its results, its
|
|
10
|
+
* attempts, its timing);
|
|
11
|
+
* - title only in base → kept as-is;
|
|
12
|
+
* - title only in new → appended (its suite structure preserved).
|
|
13
|
+
* Titles compare AFTER stripping the leading file-path suite segment, so a
|
|
14
|
+
* base and a new report generated from different cwd/suite paths still match.
|
|
15
|
+
* `@cases` rows carry a ` — <label>` title suffix and merge as independent
|
|
16
|
+
* entries — re-running one dataset row keeps the other rows.
|
|
17
|
+
*
|
|
18
|
+
* The merge never deletes: a base title missing from the current spec (a
|
|
19
|
+
* scenario renamed by a spec edit) is a GHOST the caller may WARN about, but
|
|
20
|
+
* pruning is not this function's job — the delivery builds rows from the
|
|
21
|
+
* feature, so ghosts never render; only the dead `stats` block would drift,
|
|
22
|
+
* and it is recomputed below.
|
|
23
|
+
*
|
|
24
|
+
* Everything outside suites/specs/tests is passed through untouched from the
|
|
25
|
+
* BASE report (config, metadata, unknown future fields) — tolerance over
|
|
26
|
+
* strictness, the shape belongs to Playwright.
|
|
27
|
+
*/
|
|
28
|
+
export interface MergeOutcome {
|
|
29
|
+
merged: any;
|
|
30
|
+
replaced: string[];
|
|
31
|
+
added: string[];
|
|
32
|
+
kept: string[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Merge `next` into a DEEP COPY of `base` (neither input is mutated).
|
|
36
|
+
* Throws on inputs that are not report-shaped objects.
|
|
37
|
+
*/
|
|
38
|
+
export declare function mergeResultsReports(base: any, next: any): MergeOutcome;
|
|
39
|
+
/**
|
|
40
|
+
* Ghost detection for the WARN (never a prune): base-kept titles that no
|
|
41
|
+
* longer correspond to a CURRENT spec title. A `@cases` report title carries
|
|
42
|
+
* a ` — <label>` suffix while the spec title is the base form, so a ghost is
|
|
43
|
+
* a title that neither equals a spec title nor extends one with that suffix.
|
|
44
|
+
*/
|
|
45
|
+
export declare function findGhostTitles(keptTitles: string[], specTitles: string[]): string[];
|
|
46
|
+
//# sourceMappingURL=results-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"results-merge.d.ts","sourceRoot":"","sources":["../../src/exporters/results-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAWH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAuDD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,YAAY,CAqCtE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAGpF"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Merge two Playwright JSON reports by FULL TEST TITLE — the fix for subset
|
|
4
|
+
* re-runs: Playwright's JSON reporter overwrites the per-target result file,
|
|
5
|
+
* so re-running the 3 failed cases of a 100-case screen used to throw away
|
|
6
|
+
* the 97 passing results (QA then re-ran everything, or asked an AI to merge
|
|
7
|
+
* by hand — non-deterministic).
|
|
8
|
+
*
|
|
9
|
+
* Semantics (deterministic):
|
|
10
|
+
* - same title in both → the NEW spec wins wholesale (its results, its
|
|
11
|
+
* attempts, its timing);
|
|
12
|
+
* - title only in base → kept as-is;
|
|
13
|
+
* - title only in new → appended (its suite structure preserved).
|
|
14
|
+
* Titles compare AFTER stripping the leading file-path suite segment, so a
|
|
15
|
+
* base and a new report generated from different cwd/suite paths still match.
|
|
16
|
+
* `@cases` rows carry a ` — <label>` title suffix and merge as independent
|
|
17
|
+
* entries — re-running one dataset row keeps the other rows.
|
|
18
|
+
*
|
|
19
|
+
* The merge never deletes: a base title missing from the current spec (a
|
|
20
|
+
* scenario renamed by a spec edit) is a GHOST the caller may WARN about, but
|
|
21
|
+
* pruning is not this function's job — the delivery builds rows from the
|
|
22
|
+
* feature, so ghosts never render; only the dead `stats` block would drift,
|
|
23
|
+
* and it is recomputed below.
|
|
24
|
+
*
|
|
25
|
+
* Everything outside suites/specs/tests is passed through untouched from the
|
|
26
|
+
* BASE report (config, metadata, unknown future fields) — tolerance over
|
|
27
|
+
* strictness, the shape belongs to Playwright.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.mergeResultsReports = mergeResultsReports;
|
|
31
|
+
exports.findGhostTitles = findGhostTitles;
|
|
32
|
+
const playwright_report_parser_1 = require("./playwright-report-parser");
|
|
33
|
+
/** Collect every spec node with its stripped full title and parent array. */
|
|
34
|
+
function collectSpecs(report) {
|
|
35
|
+
const out = [];
|
|
36
|
+
const walk = (suites, stack) => {
|
|
37
|
+
if (!Array.isArray(suites))
|
|
38
|
+
return;
|
|
39
|
+
for (const suite of suites) {
|
|
40
|
+
if (!suite || typeof suite !== 'object')
|
|
41
|
+
continue;
|
|
42
|
+
const nextStack = typeof suite.title === 'string' && suite.title ? [...stack, suite.title] : stack;
|
|
43
|
+
if (Array.isArray(suite.specs)) {
|
|
44
|
+
suite.specs.forEach((spec, index) => {
|
|
45
|
+
if (!spec || typeof spec.title !== 'string')
|
|
46
|
+
return;
|
|
47
|
+
const fullTitle = (0, playwright_report_parser_1.stripLeadingFilePathSuite)([...nextStack, spec.title].join(' > '));
|
|
48
|
+
out.push({ title: fullTitle, parent: suite.specs, index, node: spec });
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
walk(suite.suites, nextStack);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
walk(report?.suites, []);
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/** Drop consumed specs from a suite tree; prune suites left with nothing. */
|
|
58
|
+
function pruneConsumed(suites, consumed) {
|
|
59
|
+
const kept = [];
|
|
60
|
+
for (const suite of suites) {
|
|
61
|
+
if (!suite || typeof suite !== 'object')
|
|
62
|
+
continue;
|
|
63
|
+
if (Array.isArray(suite.specs))
|
|
64
|
+
suite.specs = suite.specs.filter((s) => !consumed.has(s));
|
|
65
|
+
if (Array.isArray(suite.suites))
|
|
66
|
+
suite.suites = pruneConsumed(suite.suites, consumed);
|
|
67
|
+
const hasSpecs = Array.isArray(suite.specs) && suite.specs.length > 0;
|
|
68
|
+
const hasSuites = Array.isArray(suite.suites) && suite.suites.length > 0;
|
|
69
|
+
if (hasSpecs || hasSuites)
|
|
70
|
+
kept.push(suite);
|
|
71
|
+
}
|
|
72
|
+
return kept;
|
|
73
|
+
}
|
|
74
|
+
/** Recompute the report-level stats counters from the merged tree's final attempts. */
|
|
75
|
+
function recomputeStats(merged) {
|
|
76
|
+
if (!merged.stats || typeof merged.stats !== 'object')
|
|
77
|
+
return;
|
|
78
|
+
let expected = 0, unexpected = 0, skipped = 0, flaky = 0;
|
|
79
|
+
for (const ref of collectSpecs(merged)) {
|
|
80
|
+
for (const test of ref.node.tests ?? []) {
|
|
81
|
+
const results = test?.results ?? [];
|
|
82
|
+
const last = results[results.length - 1];
|
|
83
|
+
const status = last?.status;
|
|
84
|
+
if (status === 'passed') {
|
|
85
|
+
if (results.some((r) => r?.status === 'failed' || r?.status === 'timedOut'))
|
|
86
|
+
flaky++;
|
|
87
|
+
else
|
|
88
|
+
expected++;
|
|
89
|
+
}
|
|
90
|
+
else if (status === 'skipped')
|
|
91
|
+
skipped++;
|
|
92
|
+
else if (status)
|
|
93
|
+
unexpected++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
merged.stats = { ...merged.stats, expected, unexpected, skipped, flaky };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Merge `next` into a DEEP COPY of `base` (neither input is mutated).
|
|
100
|
+
* Throws on inputs that are not report-shaped objects.
|
|
101
|
+
*/
|
|
102
|
+
function mergeResultsReports(base, next) {
|
|
103
|
+
for (const [label, r] of [['base', base], ['new', next]]) {
|
|
104
|
+
if (!r || typeof r !== 'object' || Array.isArray(r)) {
|
|
105
|
+
throw new Error(`results merge: the ${label} report is not a JSON object.`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const merged = JSON.parse(JSON.stringify(base));
|
|
109
|
+
const nextCopy = JSON.parse(JSON.stringify(next));
|
|
110
|
+
// Last occurrence wins within one report — the same tie-break walkSuites uses.
|
|
111
|
+
const newByTitle = new Map();
|
|
112
|
+
for (const ref of collectSpecs(nextCopy))
|
|
113
|
+
newByTitle.set(ref.title, ref);
|
|
114
|
+
const replaced = [];
|
|
115
|
+
const kept = [];
|
|
116
|
+
const consumed = new Set();
|
|
117
|
+
for (const ref of collectSpecs(merged)) {
|
|
118
|
+
const incoming = newByTitle.get(ref.title);
|
|
119
|
+
if (incoming) {
|
|
120
|
+
ref.parent[ref.index] = incoming.node; // the new spec wins wholesale
|
|
121
|
+
consumed.add(incoming.node);
|
|
122
|
+
replaced.push(ref.title);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
kept.push(ref.title);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const added = [];
|
|
129
|
+
for (const [title, ref] of newByTitle) {
|
|
130
|
+
if (!consumed.has(ref.node))
|
|
131
|
+
added.push(title);
|
|
132
|
+
}
|
|
133
|
+
if (added.length > 0 && Array.isArray(nextCopy.suites)) {
|
|
134
|
+
merged.suites = [...(Array.isArray(merged.suites) ? merged.suites : []), ...pruneConsumed(nextCopy.suites, consumed)];
|
|
135
|
+
}
|
|
136
|
+
recomputeStats(merged);
|
|
137
|
+
return { merged, replaced, added, kept };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Ghost detection for the WARN (never a prune): base-kept titles that no
|
|
141
|
+
* longer correspond to a CURRENT spec title. A `@cases` report title carries
|
|
142
|
+
* a ` — <label>` suffix while the spec title is the base form, so a ghost is
|
|
143
|
+
* a title that neither equals a spec title nor extends one with that suffix.
|
|
144
|
+
*/
|
|
145
|
+
function findGhostTitles(keptTitles, specTitles) {
|
|
146
|
+
return keptTitles.filter((title) => !specTitles.some((spec) => title === spec || title.startsWith(`${spec} — `)));
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=results-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"results-merge.js","sourceRoot":"","sources":["../../src/exporters/results-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
* • `value` for `type: 'role'` (role name like 'button', not display)
|
|
19
19
|
* • Entries with no `name` and no usable `value`
|
|
20
20
|
* • Composite templates with 2+ vars (ambiguous which to use)
|
|
21
|
+
* • Locators whose single var is SCOPE text — inside `:has(...)`/`:not(...)`,
|
|
22
|
+
* in a non-final segment, or in an XPath nested predicate / pre-step
|
|
23
|
+
* position (see locatorVarIsScopeText) — substituting those renames the
|
|
24
|
+
* ref to text of a DIFFERENT element (a column header naming a table)
|
|
21
25
|
*/
|
|
22
26
|
/**
|
|
23
27
|
* How to derive the display string for a selector key:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector-key-resolver.d.ts","sourceRoot":"","sources":["../../src/exporters/selector-key-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"selector-key-resolver.d.ts","sourceRoot":"","sources":["../../src/exporters/selector-key-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AA4I7D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,GAAG,cAAc,CA+C5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAgBR"}
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
* • `value` for `type: 'role'` (role name like 'button', not display)
|
|
20
20
|
* • Entries with no `name` and no usable `value`
|
|
21
21
|
* • Composite templates with 2+ vars (ambiguous which to use)
|
|
22
|
+
* • Locators whose single var is SCOPE text — inside `:has(...)`/`:not(...)`,
|
|
23
|
+
* in a non-final segment, or in an XPath nested predicate / pre-step
|
|
24
|
+
* position (see locatorVarIsScopeText) — substituting those renames the
|
|
25
|
+
* ref to text of a DIFFERENT element (a column header naming a table)
|
|
22
26
|
*/
|
|
23
27
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
24
28
|
if (k2 === undefined) k2 = k;
|
|
@@ -111,12 +115,108 @@ function resolveField(value, isLocator) {
|
|
|
111
115
|
}
|
|
112
116
|
if (vars.length === 1) {
|
|
113
117
|
// Sole `{{var}}` or composite like `has-text("{{var}}")`. Both resolve
|
|
114
|
-
// to the same var's locale-specific display text
|
|
118
|
+
// to the same var's locale-specific display text — but ONLY when the var
|
|
119
|
+
// is the target element's OWN text. A var inside a `:has(...)` argument
|
|
120
|
+
// or in an ancestor segment names a DIFFERENT element (a column header
|
|
121
|
+
// scoping a table), and substituting it renames the ref to unrelated text.
|
|
122
|
+
if (isLocator && locatorVarIsScopeText(value))
|
|
123
|
+
return null;
|
|
115
124
|
return { varName: vars[0] };
|
|
116
125
|
}
|
|
117
126
|
// 2+ vars in one template — ambiguous which to use; skip rather than guess.
|
|
118
127
|
return null;
|
|
119
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* True when a locator's single `{{var}}` (FIRST occurrence — repeats of the
|
|
131
|
+
* same var judge by that one, erring toward fidelity) belongs to a SCOPE
|
|
132
|
+
* rather than the target element's own display text.
|
|
133
|
+
*
|
|
134
|
+
* CSS / Playwright engines:
|
|
135
|
+
* - inside a `:has(...)` or `:not(...)` argument at any depth — that text
|
|
136
|
+
* describes ANOTHER element (or the text this one must NOT contain);
|
|
137
|
+
* `:has-text(...)` / `:text(...)` ARE the element's own text and pass;
|
|
138
|
+
* - in a non-final segment — a combinator (space, `>`, `>>`, `+`, `~`) at
|
|
139
|
+
* top level (outside parens, brackets and quotes) follows the var with a
|
|
140
|
+
* real selector after it. A bare trailing match flag (`"{{x}}" i`) or an
|
|
141
|
+
* attribute-internal space (`[name="{{x}}" i]`) is NOT a combinator.
|
|
142
|
+
*
|
|
143
|
+
* XPath (`xpath=` / `//…`):
|
|
144
|
+
* - the var sits in a NESTED predicate (bracket depth ≥ 2, e.g.
|
|
145
|
+
* `//table[.//th[text()="{{col}}"]]` — the th labels the table); or
|
|
146
|
+
* - a location step (`/`) follows the var at top level
|
|
147
|
+
* (`//th[text()="{{col}}"]/ancestor::table`).
|
|
148
|
+
*
|
|
149
|
+
* One left-to-right scan tracking quote state (with backslash-run counting so
|
|
150
|
+
* a literal trailing `\\` can't wedge the scanner in "quoted"), paren frames,
|
|
151
|
+
* and bracket depth.
|
|
152
|
+
*/
|
|
153
|
+
function locatorVarIsScopeText(locator) {
|
|
154
|
+
const m = varPattern().exec(locator);
|
|
155
|
+
if (!m)
|
|
156
|
+
return false;
|
|
157
|
+
const varIndex = m.index;
|
|
158
|
+
const isXpath = /^\s*(?:xpath=|\(*\/\/)/i.test(locator);
|
|
159
|
+
let quote = null;
|
|
160
|
+
const scopeFrames = []; // one entry per open paren: is it a :has(/:not( frame?
|
|
161
|
+
let bracketDepth = 0;
|
|
162
|
+
let passedVar = false;
|
|
163
|
+
const escaped = (i) => {
|
|
164
|
+
let n = 0;
|
|
165
|
+
for (let j = i - 1; j >= 0 && locator[j] === '\\'; j--)
|
|
166
|
+
n++;
|
|
167
|
+
return n % 2 === 1;
|
|
168
|
+
};
|
|
169
|
+
for (let i = 0; i < locator.length; i++) {
|
|
170
|
+
if (i === varIndex) {
|
|
171
|
+
passedVar = true;
|
|
172
|
+
if (!isXpath && scopeFrames.some(Boolean))
|
|
173
|
+
return true;
|
|
174
|
+
if (isXpath && bracketDepth >= 2)
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
const c = locator[i];
|
|
178
|
+
if (quote) {
|
|
179
|
+
if (c === quote && !escaped(i))
|
|
180
|
+
quote = null;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (c === '"' || c === "'") {
|
|
184
|
+
quote = c;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (c === '(') {
|
|
188
|
+
const pseudo = locator.slice(Math.max(0, i - 4), i).toLowerCase();
|
|
189
|
+
scopeFrames.push(!isXpath && (pseudo === ':has' || pseudo === ':not'));
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (c === ')') {
|
|
193
|
+
scopeFrames.pop();
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (c === '[') {
|
|
197
|
+
bracketDepth++;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (c === ']') {
|
|
201
|
+
bracketDepth = Math.max(0, bracketDepth - 1);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (!passedVar || scopeFrames.length > 0 || bracketDepth > 0)
|
|
205
|
+
continue;
|
|
206
|
+
if (isXpath) {
|
|
207
|
+
if (c === '/')
|
|
208
|
+
return true; // a location step after the var → the target comes later
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (c === ' ' || c === '>' || c === '+' || c === '~') {
|
|
212
|
+
const rest = locator.slice(i).replace(/^[\s>+~]+/, '');
|
|
213
|
+
// Bare Playwright match flags after a quoted value are not a new segment.
|
|
214
|
+
if (rest.length > 0 && !/^[is](?:\s|$)/.test(rest))
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
120
220
|
/**
|
|
121
221
|
* Build the SelectorKey → resolution map from a selectors YAML file.
|
|
122
222
|
* Returns an empty map when the file is missing or malformed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector-key-resolver.js","sourceRoot":"","sources":["../../src/exporters/selector-key-resolver.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"selector-key-resolver.js","sourceRoot":"","sources":["../../src/exporters/selector-key-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -116,6 +116,13 @@ export interface PlaywrightResult {
|
|
|
116
116
|
duration?: number;
|
|
117
117
|
startTime?: string;
|
|
118
118
|
error?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Every distinct failure message of the final attempt (ANSI/stack stripped).
|
|
121
|
+
* Playwright's top-level `error` is only the FIRST error — when a timeout
|
|
122
|
+
* wraps an assertion, the assertion detail (Locator/Expected/Received) lives
|
|
123
|
+
* in `results[].errors[1+]` and would otherwise never reach the deliverable.
|
|
124
|
+
*/
|
|
125
|
+
errorMessages?: string[];
|
|
119
126
|
tracePath?: string;
|
|
120
127
|
projectName?: string;
|
|
121
128
|
}
|
|
@@ -167,7 +174,7 @@ export interface ApiCatalogEntry {
|
|
|
167
174
|
/** Request-body wire format — decides the Content-Type the request sends.
|
|
168
175
|
* Absent/`json` → application/json, `form` → application/x-www-form-urlencoded,
|
|
169
176
|
* `multipart` → multipart/form-data. */
|
|
170
|
-
encoding?: 'json' | 'form' | 'multipart';
|
|
177
|
+
encoding?: 'json' | 'form' | 'multipart' | 'xml';
|
|
171
178
|
/** Multipart file parts (multipart/form-data). A field value may be a single file spec, its string
|
|
172
179
|
* shorthand, or an array of specs (multiple files under one field name). Typed loosely — guard before use. */
|
|
173
180
|
files?: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exporters/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exporters/types.ts"],"names":[],"mappings":"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"}
|