@sun-asterisk/sungen 3.2.32 → 3.2.34-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.
- package/dist/cli/commands/audit.d.ts +5 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +64 -11
- 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 +40 -18
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/changed.d.ts.map +1 -1
- package/dist/cli/commands/changed.js +2 -3
- package/dist/cli/commands/changed.js.map +1 -1
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +2 -28
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/defect.d.ts +7 -0
- package/dist/cli/commands/defect.d.ts.map +1 -0
- package/dist/cli/commands/defect.js +68 -0
- package/dist/cli/commands/defect.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +113 -59
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +14 -7
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/results-merge.d.ts +9 -0
- package/dist/cli/commands/results-merge.d.ts.map +1 -1
- package/dist/cli/commands/results-merge.js +9 -12
- package/dist/cli/commands/results-merge.js.map +1 -1
- package/dist/cli/commands/results-sanitize.d.ts.map +1 -1
- package/dist/cli/commands/results-sanitize.js +2 -13
- package/dist/cli/commands/results-sanitize.js.map +1 -1
- package/dist/cli/commands/select.d.ts +12 -0
- package/dist/cli/commands/select.d.ts.map +1 -0
- package/dist/cli/commands/select.js +122 -0
- package/dist/cli/commands/select.js.map +1 -0
- package/dist/cli/commands/triage.d.ts +7 -0
- package/dist/cli/commands/triage.d.ts.map +1 -0
- package/dist/cli/commands/triage.js +98 -0
- package/dist/cli/commands/triage.js.map +1 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +3 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/viewpoint.d.ts +7 -0
- package/dist/cli/commands/viewpoint.d.ts.map +1 -0
- package/dist/cli/commands/viewpoint.js +70 -0
- package/dist/cli/commands/viewpoint.js.map +1 -0
- package/dist/cli/index.js +13 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
- package/dist/dashboard/snapshot-builder.js +6 -10
- package/dist/dashboard/snapshot-builder.js.map +1 -1
- package/dist/dashboard/templates/index.html +1 -1
- package/dist/dashboard/types.d.ts +1 -0
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.d.ts +4 -0
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +12 -11
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/feature-parser.d.ts +29 -0
- package/dist/exporters/feature-parser.d.ts.map +1 -1
- package/dist/exporters/feature-parser.js +44 -1
- package/dist/exporters/feature-parser.js.map +1 -1
- package/dist/exporters/json-exporter.d.ts.map +1 -1
- package/dist/exporters/json-exporter.js +7 -0
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/locale-variants.d.ts +7 -1
- package/dist/exporters/locale-variants.d.ts.map +1 -1
- package/dist/exporters/locale-variants.js +23 -16
- package/dist/exporters/locale-variants.js.map +1 -1
- package/dist/exporters/manual-hybrid-oracle.d.ts +54 -0
- package/dist/exporters/manual-hybrid-oracle.d.ts.map +1 -0
- package/dist/exporters/manual-hybrid-oracle.js +114 -0
- package/dist/exporters/manual-hybrid-oracle.js.map +1 -0
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +68 -19
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/carry-manual-results.d.ts +89 -0
- package/dist/exporters/matrix/carry-manual-results.d.ts.map +1 -0
- package/dist/exporters/matrix/carry-manual-results.js +302 -0
- package/dist/exporters/matrix/carry-manual-results.js.map +1 -0
- package/dist/exporters/matrix/export.d.ts +9 -1
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +21 -3
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/matrix/gates.js +6 -0
- package/dist/exporters/matrix/gates.js.map +1 -1
- package/dist/exporters/matrix/render-csv.js +1 -1
- package/dist/exporters/matrix/render-csv.js.map +1 -1
- package/dist/exporters/matrix/render-testcase-sheet.d.ts.map +1 -1
- package/dist/exporters/matrix/render-testcase-sheet.js +10 -4
- package/dist/exporters/matrix/render-testcase-sheet.js.map +1 -1
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
- package/dist/exporters/matrix/render-xlsx.js +3 -0
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +13 -1
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.map +1 -1
- package/dist/exporters/matrix/wording.d.ts +8 -1
- package/dist/exporters/matrix/wording.d.ts.map +1 -1
- package/dist/exporters/matrix/wording.js +37 -2
- package/dist/exporters/matrix/wording.js.map +1 -1
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
- package/dist/exporters/playwright-report-parser.js +1 -0
- package/dist/exporters/playwright-report-parser.js.map +1 -1
- package/dist/exporters/run-environment.d.ts +32 -0
- package/dist/exporters/run-environment.d.ts.map +1 -0
- package/dist/exporters/run-environment.js +125 -0
- package/dist/exporters/run-environment.js.map +1 -0
- package/dist/exporters/scenario-merger.d.ts +18 -0
- package/dist/exporters/scenario-merger.d.ts.map +1 -1
- package/dist/exporters/scenario-merger.js +49 -3
- package/dist/exporters/scenario-merger.js.map +1 -1
- package/dist/exporters/test-data-resolver.d.ts +0 -4
- package/dist/exporters/test-data-resolver.d.ts.map +1 -1
- package/dist/exporters/test-data-resolver.js +0 -7
- package/dist/exporters/test-data-resolver.js.map +1 -1
- package/dist/exporters/types.d.ts +5 -0
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.d.ts +2 -0
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.js +7 -2
- package/dist/exporters/xlsx-exporter.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +11 -4
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +49 -19
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +4 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +2 -2
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +8 -2
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-with-role-variable-assertion.hbs +7 -3
- package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +68 -4
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +7 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +8 -4
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/pick-option.hbs +13 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +5 -1
- package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +16 -0
- package/dist/generators/test-generator/code-generator.d.ts +2 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +90 -5
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +36 -5
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +35 -4
- package/dist/generators/test-generator/diagnostics.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +12 -2
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +15 -9
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +15 -0
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/with-parent-scope.d.ts +5 -0
- package/dist/generators/test-generator/patterns/with-parent-scope.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/with-parent-scope.js +6 -0
- package/dist/generators/test-generator/patterns/with-parent-scope.js.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +46 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +84 -9
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.d.ts +25 -0
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +39 -8
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-entry-fields.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-entry-fields.js +1 -0
- package/dist/generators/test-generator/utils/selector-entry-fields.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +37 -4
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +212 -79
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/harness/audit.d.ts +3 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +60 -19
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability.d.ts +7 -1
- package/dist/harness/capability.d.ts.map +1 -1
- package/dist/harness/capability.js +15 -12
- package/dist/harness/capability.js.map +1 -1
- package/dist/harness/catalog/universal-viewpoints.yaml +5 -5
- package/dist/harness/config-file.d.ts +17 -0
- package/dist/harness/config-file.d.ts.map +1 -0
- package/dist/harness/config-file.js +100 -0
- package/dist/harness/config-file.js.map +1 -0
- package/dist/harness/counted-assertions.d.ts +2 -0
- package/dist/harness/counted-assertions.d.ts.map +1 -0
- package/dist/harness/counted-assertions.js +38 -0
- package/dist/harness/counted-assertions.js.map +1 -0
- package/dist/harness/data-driven-lint.d.ts.map +1 -1
- package/dist/harness/data-driven-lint.js +69 -27
- package/dist/harness/data-driven-lint.js.map +1 -1
- package/dist/harness/defect-draft.d.ts +14 -0
- package/dist/harness/defect-draft.d.ts.map +1 -0
- package/dist/harness/defect-draft.js +143 -0
- package/dist/harness/defect-draft.js.map +1 -0
- package/dist/harness/defects.d.ts +24 -0
- package/dist/harness/defects.d.ts.map +1 -0
- package/dist/harness/defects.js +118 -0
- package/dist/harness/defects.js.map +1 -0
- package/dist/harness/depth-lint.d.ts.map +1 -1
- package/dist/harness/depth-lint.js +2 -1
- package/dist/harness/depth-lint.js.map +1 -1
- package/dist/harness/flow-check.d.ts.map +1 -1
- package/dist/harness/flow-check.js +6 -2
- package/dist/harness/flow-check.js.map +1 -1
- package/dist/harness/keyword-match.d.ts +59 -0
- package/dist/harness/keyword-match.d.ts.map +1 -0
- package/dist/harness/keyword-match.js +86 -0
- package/dist/harness/keyword-match.js.map +1 -0
- package/dist/harness/manifest.d.ts.map +1 -1
- package/dist/harness/manifest.js +2 -2
- package/dist/harness/manifest.js.map +1 -1
- package/dist/harness/next-step.d.ts +2 -4
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +50 -5
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/parse.d.ts +45 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +142 -24
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/perf.d.ts +7 -1
- package/dist/harness/perf.d.ts.map +1 -1
- package/dist/harness/perf.js +13 -10
- package/dist/harness/perf.js.map +1 -1
- package/dist/harness/quality-gates.d.ts +9 -2
- package/dist/harness/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +22 -8
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/query-catalog.js +0 -0
- package/dist/harness/query-catalog.js.map +1 -1
- package/dist/harness/read-text.d.ts +21 -0
- package/dist/harness/read-text.d.ts.map +1 -1
- package/dist/harness/read-text.js +32 -1
- package/dist/harness/read-text.js.map +1 -1
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +7 -1
- package/dist/harness/script-check.js.map +1 -1
- package/dist/harness/secret-scan.d.ts +27 -1
- package/dist/harness/secret-scan.d.ts.map +1 -1
- package/dist/harness/secret-scan.js +57 -4
- package/dist/harness/secret-scan.js.map +1 -1
- package/dist/harness/select-by-ids.d.ts +31 -0
- package/dist/harness/select-by-ids.d.ts.map +1 -0
- package/dist/harness/select-by-ids.js +106 -0
- package/dist/harness/select-by-ids.js.map +1 -0
- package/dist/harness/sensors.d.ts +20 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +133 -39
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/spec-branches.d.ts +0 -18
- package/dist/harness/spec-branches.d.ts.map +1 -1
- package/dist/harness/spec-branches.js +24 -3
- package/dist/harness/spec-branches.js.map +1 -1
- package/dist/harness/spec-coverage.d.ts.map +1 -1
- package/dist/harness/spec-coverage.js +14 -4
- package/dist/harness/spec-coverage.js.map +1 -1
- package/dist/harness/triage-signals.d.ts +20 -0
- package/dist/harness/triage-signals.d.ts.map +1 -0
- package/dist/harness/triage-signals.js +30 -0
- package/dist/harness/triage-signals.js.map +1 -0
- package/dist/harness/triage-unit.d.ts +23 -0
- package/dist/harness/triage-unit.d.ts.map +1 -0
- package/dist/harness/triage-unit.js +142 -0
- package/dist/harness/triage-unit.js.map +1 -0
- package/dist/harness/triage.d.ts +28 -0
- package/dist/harness/triage.d.ts.map +1 -0
- package/dist/harness/triage.js +99 -0
- package/dist/harness/triage.js.map +1 -0
- package/dist/harness/ui-inventory.d.ts +40 -0
- package/dist/harness/ui-inventory.d.ts.map +1 -0
- package/dist/harness/ui-inventory.js +191 -0
- package/dist/harness/ui-inventory.js.map +1 -0
- package/dist/harness/viewpoint-baseline.d.ts.map +1 -1
- package/dist/harness/viewpoint-baseline.js +7 -1
- package/dist/harness/viewpoint-baseline.js.map +1 -1
- package/dist/harness/viewpoint-draft-header.d.ts +7 -0
- package/dist/harness/viewpoint-draft-header.d.ts.map +1 -0
- package/dist/harness/viewpoint-draft-header.js +100 -0
- package/dist/harness/viewpoint-draft-header.js.map +1 -0
- package/dist/harness/viewpoint-ledger.d.ts +13 -3
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +106 -19
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/harness/viewpoint-mode.d.ts +9 -0
- package/dist/harness/viewpoint-mode.d.ts.map +1 -0
- package/dist/harness/viewpoint-mode.js +52 -0
- package/dist/harness/viewpoint-mode.js.map +1 -0
- package/dist/harness/viewpoint-priority.d.ts +19 -0
- package/dist/harness/viewpoint-priority.d.ts.map +1 -0
- package/dist/harness/viewpoint-priority.js +36 -0
- package/dist/harness/viewpoint-priority.js.map +1 -0
- package/dist/harness/viewpoint-review-open.d.ts +6 -0
- package/dist/harness/viewpoint-review-open.d.ts.map +1 -0
- package/dist/harness/viewpoint-review-open.js +90 -0
- package/dist/harness/viewpoint-review-open.js.map +1 -0
- package/dist/harness/viewpoint-scan-refs.d.ts +50 -0
- package/dist/harness/viewpoint-scan-refs.d.ts.map +1 -0
- package/dist/harness/viewpoint-scan-refs.js +200 -0
- package/dist/harness/viewpoint-scan-refs.js.map +1 -0
- package/dist/harness/viewpoint-scan.d.ts +41 -0
- package/dist/harness/viewpoint-scan.d.ts.map +1 -0
- package/dist/harness/viewpoint-scan.js +118 -0
- package/dist/harness/viewpoint-scan.js.map +1 -0
- package/dist/harness/write-atomic.d.ts +2 -0
- package/dist/harness/write-atomic.d.ts.map +1 -0
- package/dist/harness/write-atomic.js +62 -0
- package/dist/harness/write-atomic.js.map +1 -0
- package/dist/orchestrator/ai-skills/writer.d.ts.map +1 -1
- package/dist/orchestrator/ai-skills/writer.js +15 -7
- package/dist/orchestrator/ai-skills/writer.js.map +1 -1
- package/dist/orchestrator/assets-drift.d.ts.map +1 -1
- package/dist/orchestrator/assets-drift.js +11 -6
- package/dist/orchestrator/assets-drift.js.map +1 -1
- package/dist/orchestrator/flow-manager.d.ts +0 -1
- package/dist/orchestrator/flow-manager.d.ts.map +1 -1
- package/dist/orchestrator/flow-manager.js +3 -52
- package/dist/orchestrator/flow-manager.js.map +1 -1
- package/dist/orchestrator/project-deps-sync.d.ts.map +1 -1
- package/dist/orchestrator/project-deps-sync.js +22 -1
- package/dist/orchestrator/project-deps-sync.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +8 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +49 -7
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +8 -62
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/security-overrides-catalog.d.ts +39 -0
- package/dist/orchestrator/security-overrides-catalog.d.ts.map +1 -0
- package/dist/orchestrator/security-overrides-catalog.js +63 -0
- package/dist/orchestrator/security-overrides-catalog.js.map +1 -0
- package/dist/orchestrator/security-overrides.d.ts +51 -0
- package/dist/orchestrator/security-overrides.d.ts.map +1 -0
- package/dist/orchestrator/security-overrides.js +165 -0
- package/dist/orchestrator/security-overrides.js.map +1 -0
- package/dist/orchestrator/templates/ai-src/agents/discovery.md +11 -3
- package/dist/orchestrator/templates/ai-src/agents/reviewer.md +8 -0
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +32 -24
- package/dist/orchestrator/templates/ai-src/commands/review.md +2 -2
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +78 -15
- package/dist/orchestrator/templates/ai-src/skills/sungen-capture/mode-local.md +2 -2
- package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +25 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +26 -8
- package/dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +5 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +58 -14
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +13 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +42 -2
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +7 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +18 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +63 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +158 -0
- package/dist/orchestrator/templates/playwright.config.ts +4 -2
- package/dist/orchestrator/templates/specs-locale-fixture.ts +21 -9
- package/dist/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
- package/dist/orchestrator/templates/specs-url-assert.d.ts +17 -1
- package/dist/orchestrator/templates/specs-url-assert.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-url-assert.js +38 -4
- package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
- package/dist/orchestrator/templates/specs-url-assert.ts +47 -4
- package/dist/orchestrator/templates/wdio.conf.ts +24 -1
- package/dist/orchestrator/trace-mode-install.d.ts +14 -0
- package/dist/orchestrator/trace-mode-install.d.ts.map +1 -0
- package/dist/orchestrator/trace-mode-install.js +132 -0
- package/dist/orchestrator/trace-mode-install.js.map +1 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts +23 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts.map +1 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.js +48 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.js.map +1 -0
- package/dist/orchestrator/viewpoint-scaffold.d.ts +3 -0
- package/dist/orchestrator/viewpoint-scaffold.d.ts.map +1 -0
- package/dist/orchestrator/viewpoint-scaffold.js +70 -0
- package/dist/orchestrator/viewpoint-scaffold.js.map +1 -0
- package/package.json +3 -3
- package/src/cli/commands/audit.ts +59 -12
- package/src/cli/commands/capability.ts +54 -19
- package/src/cli/commands/changed.ts +2 -4
- package/src/cli/commands/dashboard.ts +1 -26
- package/src/cli/commands/defect.ts +49 -0
- package/src/cli/commands/delivery.ts +106 -56
- package/src/cli/commands/generate.ts +15 -7
- package/src/cli/commands/results-merge.ts +9 -9
- package/src/cli/commands/results-sanitize.ts +2 -9
- package/src/cli/commands/select.ts +88 -0
- package/src/cli/commands/triage.ts +57 -0
- package/src/cli/commands/update.ts +3 -0
- package/src/cli/commands/viewpoint.ts +58 -0
- package/src/cli/index.ts +13 -2
- package/src/dashboard/snapshot-builder.ts +6 -8
- package/src/dashboard/templates/index.html +1 -1
- package/src/dashboard/types.ts +1 -0
- package/src/exporters/csv-exporter.ts +12 -11
- package/src/exporters/feature-parser.ts +44 -2
- package/src/exporters/json-exporter.ts +6 -1
- package/src/exporters/locale-variants.ts +23 -17
- package/src/exporters/manual-hybrid-oracle.ts +112 -0
- package/src/exporters/matrix/build.ts +71 -19
- package/src/exporters/matrix/carry-manual-results.ts +292 -0
- package/src/exporters/matrix/export.ts +24 -4
- package/src/exporters/matrix/gates.ts +6 -0
- package/src/exporters/matrix/render-csv.ts +1 -1
- package/src/exporters/matrix/render-testcase-sheet.ts +10 -4
- package/src/exporters/matrix/render-xlsx.ts +3 -0
- package/src/exporters/matrix/types.ts +13 -1
- package/src/exporters/matrix/wording.ts +36 -2
- package/src/exporters/playwright-report-parser.ts +1 -0
- package/src/exporters/run-environment.ts +89 -0
- package/src/exporters/scenario-merger.ts +51 -5
- package/src/exporters/test-data-resolver.ts +0 -6
- package/src/exporters/types.ts +5 -0
- package/src/exporters/xlsx-exporter.ts +7 -2
- package/src/generators/gherkin-parser/index.ts +50 -18
- package/src/generators/test-generator/adapters/adapter-interface.ts +6 -2
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +2 -2
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +8 -2
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-with-role-variable-assertion.hbs +7 -3
- package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +68 -4
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +7 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +8 -4
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/pick-option.hbs +13 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +5 -1
- package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +16 -0
- package/src/generators/test-generator/code-generator.ts +77 -5
- package/src/generators/test-generator/diagnostics.ts +36 -5
- package/src/generators/test-generator/patterns/index.ts +15 -8
- package/src/generators/test-generator/patterns/types.ts +15 -0
- package/src/generators/test-generator/patterns/with-parent-scope.ts +6 -0
- package/src/generators/test-generator/step-mapper.ts +90 -8
- package/src/generators/test-generator/utils/data-resolver.ts +41 -12
- package/src/generators/test-generator/utils/selector-entry-fields.ts +1 -0
- package/src/generators/test-generator/utils/selector-resolver.ts +238 -82
- package/src/harness/audit.ts +69 -24
- package/src/harness/capability.ts +23 -12
- package/src/harness/catalog/universal-viewpoints.yaml +5 -5
- package/src/harness/config-file.ts +66 -0
- package/src/harness/counted-assertions.ts +33 -0
- package/src/harness/data-driven-lint.ts +82 -24
- package/src/harness/defect-draft.ts +115 -0
- package/src/harness/defects.ts +94 -0
- package/src/harness/depth-lint.ts +2 -1
- package/src/harness/flow-check.ts +6 -2
- package/src/harness/keyword-match.ts +85 -0
- package/src/harness/manifest.ts +2 -2
- package/src/harness/next-step.ts +47 -5
- package/src/harness/parse.ts +151 -27
- package/src/harness/perf.ts +15 -7
- package/src/harness/quality-gates.ts +22 -8
- package/src/harness/query-catalog.ts +0 -0
- package/src/harness/read-text.ts +32 -1
- package/src/harness/script-check.ts +7 -1
- package/src/harness/secret-scan.ts +60 -4
- package/src/harness/select-by-ids.ts +83 -0
- package/src/harness/sensors.ts +141 -40
- package/src/harness/spec-branches.ts +6 -3
- package/src/harness/spec-coverage.ts +14 -4
- package/src/harness/triage-signals.ts +46 -0
- package/src/harness/triage-unit.ts +113 -0
- package/src/harness/triage.ts +127 -0
- package/src/harness/ui-inventory.ts +164 -0
- package/src/harness/viewpoint-baseline.ts +7 -1
- package/src/harness/viewpoint-draft-header.ts +55 -0
- package/src/harness/viewpoint-ledger.ts +113 -25
- package/src/harness/viewpoint-mode.ts +49 -0
- package/src/harness/viewpoint-priority.ts +38 -0
- package/src/harness/viewpoint-review-open.ts +51 -0
- package/src/harness/viewpoint-scan-refs.ts +154 -0
- package/src/harness/viewpoint-scan.ts +111 -0
- package/src/harness/write-atomic.ts +22 -0
- package/src/orchestrator/ai-skills/writer.ts +18 -3
- package/src/orchestrator/assets-drift.ts +10 -5
- package/src/orchestrator/flow-manager.ts +3 -53
- package/src/orchestrator/project-deps-sync.ts +23 -1
- package/src/orchestrator/project-initializer.ts +54 -6
- package/src/orchestrator/screen-manager.ts +7 -61
- package/src/orchestrator/security-overrides-catalog.ts +69 -0
- package/src/orchestrator/security-overrides.ts +149 -0
- package/src/orchestrator/templates/ai-src/agents/discovery.md +11 -3
- package/src/orchestrator/templates/ai-src/agents/reviewer.md +8 -0
- package/src/orchestrator/templates/ai-src/commands/create-test.md +32 -24
- package/src/orchestrator/templates/ai-src/commands/review.md +2 -2
- package/src/orchestrator/templates/ai-src/commands/run-test.md +78 -15
- package/src/orchestrator/templates/ai-src/skills/sungen-capture/mode-local.md +2 -2
- package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +25 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +26 -8
- package/src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +5 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +58 -14
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +13 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +42 -2
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +7 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +18 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +63 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +158 -0
- package/src/orchestrator/templates/playwright.config.ts +4 -2
- package/src/orchestrator/templates/specs-locale-fixture.ts +21 -9
- package/src/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
- package/src/orchestrator/templates/specs-url-assert.ts +47 -4
- package/src/orchestrator/templates/wdio.conf.ts +24 -1
- package/src/orchestrator/trace-mode-install.ts +94 -0
- package/src/orchestrator/viewpoint-pattern-catalog.ts +61 -0
- package/src/orchestrator/viewpoint-scaffold.ts +36 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.unitSecrets = unitSecrets;
|
|
37
|
+
exports.triageUnit = triageUnit;
|
|
38
|
+
exports.triageReportPath = triageReportPath;
|
|
39
|
+
exports.readTriageReport = readTriageReport;
|
|
40
|
+
exports.writeTriageReport = writeTriageReport;
|
|
41
|
+
/**
|
|
42
|
+
* `sungen triage` IO: find a unit's feature(s) and result file(s), join them on the same seam
|
|
43
|
+
* delivery and the dashboard use (`mergeFeatureAndSpec` + `resolveResultVariants`), classify each
|
|
44
|
+
* scenario, and persist `.sungen/triage/<unit>.json`. Read-only apart from that one report file.
|
|
45
|
+
*/
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const feature_parser_1 = require("../exporters/feature-parser");
|
|
49
|
+
const playwright_report_parser_1 = require("../exporters/playwright-report-parser");
|
|
50
|
+
const qa_env_secret_denylist_1 = require("../exporters/qa-env-secret-denylist");
|
|
51
|
+
const sensitive_key_1 = require("../exporters/sensitive-key");
|
|
52
|
+
const result_variants_1 = require("../exporters/result-variants");
|
|
53
|
+
const scenario_merger_1 = require("../exporters/scenario-merger");
|
|
54
|
+
const spec_parser_1 = require("../exporters/spec-parser");
|
|
55
|
+
const test_data_resolver_1 = require("../exporters/test-data-resolver");
|
|
56
|
+
const triage_1 = require("./triage");
|
|
57
|
+
/**
|
|
58
|
+
* Values that must never reach a triage evidence line or a defect record: the resolved `${QA_*}`
|
|
59
|
+
* secrets AND the literal values of credential-named test-data keys — an assertion on a password
|
|
60
|
+
* field prints that value in its Expected/Received.
|
|
61
|
+
*/
|
|
62
|
+
function unitSecrets(testData, cwd) {
|
|
63
|
+
const literal = Object.entries(testData)
|
|
64
|
+
.filter(([k, v]) => (0, sensitive_key_1.isSensitiveKey)(k) && typeof v === 'string' && v.length >= 3 && !v.includes('${'))
|
|
65
|
+
.map(([, v]) => String(v));
|
|
66
|
+
return [...new Set([...(0, qa_env_secret_denylist_1.collectQaEnvSecretDenylist)(testData, cwd).values, ...literal])].sort((a, b) => b.length - a.length);
|
|
67
|
+
}
|
|
68
|
+
function generatedDir(cwd, u) {
|
|
69
|
+
return path.join(cwd, 'specs', 'generated', u.unitId);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Every result file of one feature, labelled by variant: `<base>-test-result.json` (no label),
|
|
73
|
+
* `<base>-test-result.<os|env>[.<env>].json` (label = the middle part). A mobile unit has only
|
|
74
|
+
* per-OS files, so all of them are read rather than the first one found. Falls back to the shared
|
|
75
|
+
* lookup (incl. `test-results/results.json`) when the generated dir holds none.
|
|
76
|
+
*/
|
|
77
|
+
function resultFilesFor(cwd, genDir, base) {
|
|
78
|
+
const prefix = `${base}-test-result`;
|
|
79
|
+
const own = fs.existsSync(genDir)
|
|
80
|
+
? fs.readdirSync(genDir).filter((f) => f.startsWith(prefix) && f.endsWith('.json')).sort()
|
|
81
|
+
: [];
|
|
82
|
+
if (own.length > 0) {
|
|
83
|
+
return own.map((f) => {
|
|
84
|
+
const variant = f.slice(prefix.length, -'.json'.length).replace(/^\./, '');
|
|
85
|
+
return { file: path.join(genDir, f), ...(variant ? { variant } : {}) };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const shared = (0, playwright_report_parser_1.resolveResultsPath)(cwd, genDir, base);
|
|
89
|
+
return shared ? [{ file: shared }] : [];
|
|
90
|
+
}
|
|
91
|
+
function triageUnit(cwd, u) {
|
|
92
|
+
const genDir = generatedDir(cwd, u);
|
|
93
|
+
const featuresDir = path.join(u.dir, 'features');
|
|
94
|
+
const features = fs.existsSync(featuresDir) ? fs.readdirSync(featuresDir).filter((f) => f.endsWith('.feature')).sort() : [];
|
|
95
|
+
const rows = [];
|
|
96
|
+
const resultFiles = [];
|
|
97
|
+
for (const f of features) {
|
|
98
|
+
const base = f.replace(/\.feature$/, '');
|
|
99
|
+
const files = resultFilesFor(cwd, genDir, base);
|
|
100
|
+
if (files.length === 0)
|
|
101
|
+
continue;
|
|
102
|
+
const merged = (0, scenario_merger_1.mergeFeatureAndSpec)((0, feature_parser_1.parseFeatureMetadata)(path.join(featuresDir, f)), (0, spec_parser_1.parseSpecFile)(path.join(genDir, `${base}.spec.ts`)));
|
|
103
|
+
const dataFile = path.join(u.dir, 'test-data', `${base}.yaml`);
|
|
104
|
+
const testData = fs.existsSync(dataFile) ? (0, test_data_resolver_1.loadTestData)(dataFile) : {};
|
|
105
|
+
const secrets = unitSecrets(testData, cwd);
|
|
106
|
+
for (const { file, variant } of files) {
|
|
107
|
+
resultFiles.push(path.relative(cwd, file));
|
|
108
|
+
const results = (0, playwright_report_parser_1.loadPlaywrightReport)(file);
|
|
109
|
+
for (const m of merged) {
|
|
110
|
+
for (const v of (0, result_variants_1.resolveResultVariants)(m, results, testData)) {
|
|
111
|
+
const r = (0, triage_1.classifyScenario)({ unit: u.unitId, title: `${m.feature.name}${v.nameSuffix}`, tags: m.feature.tags, result: v.result, variant }, secrets);
|
|
112
|
+
if (r)
|
|
113
|
+
rows.push(r);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const counts = {};
|
|
119
|
+
for (const r of rows)
|
|
120
|
+
counts[r.class] = (counts[r.class] ?? 0) + 1;
|
|
121
|
+
return { unit: u.unitId, generatedAt: new Date().toISOString(), resultFiles, counts, rows };
|
|
122
|
+
}
|
|
123
|
+
function triageReportPath(cwd, unitId) {
|
|
124
|
+
return path.join(cwd, '.sungen', 'triage', `${unitId.replace(/\//g, '-')}.json`);
|
|
125
|
+
}
|
|
126
|
+
/** The last triage of a unit, or null when `sungen triage` has not run for it. */
|
|
127
|
+
function readTriageReport(cwd, unitId) {
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(fs.readFileSync(triageReportPath(cwd, unitId), 'utf-8'));
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Persist under `.sungen/triage/<unit>.json` (a flow `flows/x` → `flows-x.json`); returns the path. */
|
|
136
|
+
function writeTriageReport(cwd, report) {
|
|
137
|
+
const out = triageReportPath(cwd, report.unit);
|
|
138
|
+
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
139
|
+
fs.writeFileSync(out, `${JSON.stringify(report, null, 2)}\n`, 'utf-8');
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=triage-unit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-unit.js","sourceRoot":"","sources":["../../src/harness/triage-unit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PlaywrightResult } from '../exporters/types';
|
|
2
|
+
export type TriageClass = 'known-defect' | 'blocked-capability' | 'environment' | 'test-defect' | 'product-candidate' | 'unclassified' | 'flaky';
|
|
3
|
+
export interface TriageInput {
|
|
4
|
+
unit: string;
|
|
5
|
+
title: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
result?: PlaywrightResult;
|
|
8
|
+
/** Result-file variant (`android`, `ios`, an env name) when the unit has several. */
|
|
9
|
+
variant?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface TriageRow {
|
|
12
|
+
unit: string;
|
|
13
|
+
scenario: string;
|
|
14
|
+
variant?: string;
|
|
15
|
+
class: TriageClass;
|
|
16
|
+
ruleId: string;
|
|
17
|
+
evidence: string;
|
|
18
|
+
ids: string[];
|
|
19
|
+
legacy: string[];
|
|
20
|
+
defectId?: string;
|
|
21
|
+
tracePath?: string;
|
|
22
|
+
/** product-candidate only: the two halves of the assertion, for a defect draft. */
|
|
23
|
+
expected?: string;
|
|
24
|
+
received?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Classify one scenario. Null when it needs no triage (clean pass, or never ran). */
|
|
27
|
+
export declare function classifyScenario(input: TriageInput, secrets?: string[]): TriageRow | null;
|
|
28
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/harness/triage.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,MAAM,WAAW,GACnB,cAAc,GAAG,oBAAoB,GAAG,aAAa,GAAG,aAAa,GAAG,mBAAmB,GAAG,cAAc,GAAG,OAAO,CAAC;AAE3H,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoBD,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,SAAS,GAAG,IAAI,CAmD7F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classifyScenario = classifyScenario;
|
|
4
|
+
/**
|
|
5
|
+
* `sungen triage` — classify each red or flaky scenario of a run into exactly one class, with the
|
|
6
|
+
* rule that fired and one evidence line. Deterministic and read-only; it reports, it never gates.
|
|
7
|
+
*
|
|
8
|
+
* Order (first match wins):
|
|
9
|
+
* 1. known-defect `@known-defect` / `@known-defect:<id>` — an expected red.
|
|
10
|
+
* 2. blocked-capability `@manual:*` / `@requires:*`, or skipped by design.
|
|
11
|
+
* 3. environment the session or network never gave the test a usable app.
|
|
12
|
+
* 4. test-defect the test could not reach its element or data.
|
|
13
|
+
* 5. product-candidate an assertion whose Expected and Received both exist and differ.
|
|
14
|
+
* 6. unclassified anything else — left for the agent or QA, with the raw first message.
|
|
15
|
+
* A `passed` scenario that needed a retry is `flaky` (green, listed separately).
|
|
16
|
+
*
|
|
17
|
+
* 5 is tested before 3 and 4 in code: a parsed Expected/Received pair that differs means the app
|
|
18
|
+
* answered, which outranks any wrapper text (a test timeout around the assertion included).
|
|
19
|
+
*
|
|
20
|
+
* A bare test timeout (no locator, no assertion) is `unclassified` too: a slow environment, a page
|
|
21
|
+
* that hangs on a product bug and a test waiting on the wrong thing all print the same line.
|
|
22
|
+
*
|
|
23
|
+
* An assertion on an element that never appeared (`Received: <element(s) not found>`) is NOT a test
|
|
24
|
+
* defect: a wrong selector and a missing message look identical, so it is left for judgment rather
|
|
25
|
+
* than hiding a possible product bug behind "fix the selector".
|
|
26
|
+
*/
|
|
27
|
+
const api_testcase_formatter_1 = require("../exporters/api-testcase-formatter");
|
|
28
|
+
const playwright_report_parser_1 = require("../exporters/playwright-report-parser");
|
|
29
|
+
const triage_signals_1 = require("./triage-signals");
|
|
30
|
+
const EVIDENCE_MAX = 200;
|
|
31
|
+
const VIEWPOINT_ID = /\b(?:VP|FL)-[A-Z0-9]+(?:-[A-Z0-9]+)*\b/gi;
|
|
32
|
+
const ELEMENT_ABSENT = /Received:\s*<element\(s\) not found>/;
|
|
33
|
+
/** The part of a message the run itself wrote: before `Call log:`, without `Locator:` echo lines. */
|
|
34
|
+
const runHead = (m) => m.split(/\n\s*Call log:/)[0].replace(/^\s*Locator:.*$/gm, '');
|
|
35
|
+
/** Every failure message, stack frames and a leading `Error:` dropped. */
|
|
36
|
+
function messagesOf(result) {
|
|
37
|
+
const raw = result.errorMessages?.length ? result.errorMessages : [result.error ?? ''];
|
|
38
|
+
return raw.map((m) => m.split(/\n\s*at\s/)[0].replace(/^Error:\s*/i, '').trim()).filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
function evidenceLine(text, secrets) {
|
|
41
|
+
const flat = (0, api_testcase_formatter_1.redactSecrets)(text, secrets).replace(/\s+/g, ' ').trim();
|
|
42
|
+
return flat.length > EVIDENCE_MAX ? `${flat.slice(0, EVIDENCE_MAX - 1)}…` : flat;
|
|
43
|
+
}
|
|
44
|
+
/** Classify one scenario. Null when it needs no triage (clean pass, or never ran). */
|
|
45
|
+
function classifyScenario(input, secrets = []) {
|
|
46
|
+
const { result, tags } = input;
|
|
47
|
+
if (!result)
|
|
48
|
+
return null;
|
|
49
|
+
const base = {
|
|
50
|
+
unit: input.unit,
|
|
51
|
+
scenario: input.title,
|
|
52
|
+
...(input.variant ? { variant: input.variant } : {}),
|
|
53
|
+
ids: [...new Set([input.title, ...tags].join(' ').match(VIEWPOINT_ID) ?? [])],
|
|
54
|
+
legacy: tags.filter((t) => t.startsWith('@legacy:')).map((t) => t.slice('@legacy:'.length)),
|
|
55
|
+
...(result.tracePath ? { tracePath: result.tracePath } : {}),
|
|
56
|
+
};
|
|
57
|
+
const row = (cls, ruleId, evidence) => ({ ...base, class: cls, ruleId, evidence: evidenceLine(evidence, secrets) });
|
|
58
|
+
if (result.status === 'passed') {
|
|
59
|
+
return (result.attempts ?? 1) > 1 ? row('flaky', 'passed-after-retry', `passed on attempt ${result.attempts}`) : null;
|
|
60
|
+
}
|
|
61
|
+
const messages = messagesOf(result);
|
|
62
|
+
const first = messages[0] ?? result.status;
|
|
63
|
+
const known = tags.find((t) => t === '@known-defect' || t.startsWith('@known-defect:'));
|
|
64
|
+
if (known) {
|
|
65
|
+
const r = row('known-defect', 'tag-known-defect', first);
|
|
66
|
+
const id = known.split(':')[1];
|
|
67
|
+
return id ? { ...r, defectId: id } : r;
|
|
68
|
+
}
|
|
69
|
+
if (tags.some((t) => t.startsWith('@manual')))
|
|
70
|
+
return row('blocked-capability', 'tag-manual', `${tags.find((t) => t.startsWith('@manual'))} — ${first}`);
|
|
71
|
+
if (tags.some((t) => t.startsWith('@requires:')))
|
|
72
|
+
return row('blocked-capability', 'tag-requires', `${tags.find((t) => t.startsWith('@requires:'))} — ${first}`);
|
|
73
|
+
if (result.status === 'skipped')
|
|
74
|
+
return row('blocked-capability', 'status-skipped', 'skipped');
|
|
75
|
+
// An assertion with both halves decides the case even when a timeout wraps it.
|
|
76
|
+
for (const m of messages) {
|
|
77
|
+
const { expected, received } = (0, playwright_report_parser_1.parseExpectedReceived)(m);
|
|
78
|
+
if (expected && received && !ELEMENT_ABSENT.test(m) && expected !== received) {
|
|
79
|
+
return { ...row('product-candidate', 'assertion-mismatch', `Expected ${expected} · Received ${received}`),
|
|
80
|
+
expected: evidenceLine(expected, secrets), received: evidenceLine(received, secrets) };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
for (const s of triage_signals_1.TRIAGE_SIGNALS) {
|
|
84
|
+
// Environment signals read only what the RUN said, never the test's own selector text that a
|
|
85
|
+
// message echoes in `Locator:` / `Call log:` — `getByText('Invalid URL')` is a missing message,
|
|
86
|
+
// not a bad base URL. Test-defect signals need the call log (`waiting for …`), so they read it all.
|
|
87
|
+
const hit = messages.find((m) => s.match.test(s.class === 'environment' ? runHead(m) : m));
|
|
88
|
+
if (hit)
|
|
89
|
+
return row(s.class, s.id, hit);
|
|
90
|
+
}
|
|
91
|
+
const absent = messages.find((m) => ELEMENT_ABSENT.test(m));
|
|
92
|
+
if (absent)
|
|
93
|
+
return row('unclassified', 'assertion-element-absent', absent);
|
|
94
|
+
if (messages.length > 0 && messages.every((m) => triage_signals_1.BARE_TIMEOUT.test(m))) {
|
|
95
|
+
return row('unclassified', 'bare-timeout', `${first} No locator or assertion detail: a slow environment, a hanging page, or a wait in the test. Re-run once, then read the trace's last action.`);
|
|
96
|
+
}
|
|
97
|
+
return row('unclassified', 'no-signal', first);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/harness/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type UiItemSource = 'spec+design' | 'design-only' | 'conflict';
|
|
2
|
+
export interface UiItem {
|
|
3
|
+
id: string;
|
|
4
|
+
item: string;
|
|
5
|
+
kind: string;
|
|
6
|
+
source: UiItemSource;
|
|
7
|
+
}
|
|
8
|
+
export interface UiInventoryResult {
|
|
9
|
+
/** Design sources the unit holds: image files, figma-meta.md, spec_figma.md. */
|
|
10
|
+
designSources: string[];
|
|
11
|
+
/** `requirements/ui-inventory.md` exists. */
|
|
12
|
+
hasInventory: boolean;
|
|
13
|
+
items: UiItem[];
|
|
14
|
+
/** `images read: a/b` from the inventory header — null when the line is absent. */
|
|
15
|
+
imagesRead: {
|
|
16
|
+
read: number;
|
|
17
|
+
total: number;
|
|
18
|
+
} | null;
|
|
19
|
+
/** Images on disk, for comparing against `imagesRead.total`. */
|
|
20
|
+
imagesOnDisk: number;
|
|
21
|
+
covered: string[];
|
|
22
|
+
deferred: string[];
|
|
23
|
+
/** design-only / conflict items neither covered nor deferred. */
|
|
24
|
+
uncovered: UiItem[];
|
|
25
|
+
}
|
|
26
|
+
/** Every design source in a unit's `requirements/` — what makes an inventory necessary. */
|
|
27
|
+
export declare function designSourcesOf(reqDir: string): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Parse the inventory table: any markdown row whose first cell is a `UI-<n>` id. Leading/trailing
|
|
30
|
+
* pipes are optional (GFM), and the Source cell is FOUND rather than counted — a `|` written inside
|
|
31
|
+
* the Item cell shifts the columns, and a positional read then misfiled a design-only row.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseUiInventory(text: string): {
|
|
34
|
+
items: UiItem[];
|
|
35
|
+
imagesRead: UiInventoryResult['imagesRead'];
|
|
36
|
+
};
|
|
37
|
+
export declare function uiInventoryCoverage(reqDir: string, featureText: string): UiInventoryResult;
|
|
38
|
+
/** Advisory findings for the audit report. */
|
|
39
|
+
export declare function uiInventoryFindings(r: UiInventoryResult): string[];
|
|
40
|
+
//# sourceMappingURL=ui-inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-inventory.d.ts","sourceRoot":"","sources":["../../src/harness/ui-inventory.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6CAA6C;IAC7C,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mFAAmF;IACnF,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnD,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iEAAiE;IACjE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAID,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUxD;AAeD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAA;CAAE,CAoB/G;AAeD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,CA4B1F;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAiBlE"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.designSourcesOf = designSourcesOf;
|
|
37
|
+
exports.parseUiInventory = parseUiInventory;
|
|
38
|
+
exports.uiInventoryCoverage = uiInventoryCoverage;
|
|
39
|
+
exports.uiInventoryFindings = uiInventoryFindings;
|
|
40
|
+
/**
|
|
41
|
+
* #811 — the design inventory: is every item the DESIGN shows accounted for by the suite?
|
|
42
|
+
*
|
|
43
|
+
* Design sources in `requirements/ui/` (images, `figma-meta.md`) and `requirements/spec_figma.md`
|
|
44
|
+
* were read "for visual context" and never turned into a checkable list, so a column that exists
|
|
45
|
+
* only on the design — or contradicts the spec — was missed by the author AND the reviewer, and a
|
|
46
|
+
* deliberate deferral looked exactly like an oversight.
|
|
47
|
+
*
|
|
48
|
+
* create-test now writes `requirements/ui-inventory.md`: one `UI-NNN` row per component / column /
|
|
49
|
+
* button / state / annotation, with its source (`spec+design` | `design-only` | `conflict`). An
|
|
50
|
+
* item is accounted for by a scenario tag (`@ui:UI-014`) or a reasoned deferral comment
|
|
51
|
+
* (`# UI-DEFERRED: UI-002..013 — <reason>`) — no other mention counts; ranges and `/`
|
|
52
|
+
* enumerations read the same way as spec ids (spec-coverage `citedIds`). `spec+design` items are already measured
|
|
53
|
+
* by spec-coverage, so only `design-only` / `conflict` items are reported uncovered.
|
|
54
|
+
*
|
|
55
|
+
* Advisory: findings never move the score or the gate.
|
|
56
|
+
*/
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const spec_coverage_1 = require("./spec-coverage");
|
|
60
|
+
const read_text_1 = require("./read-text");
|
|
61
|
+
const IMAGE = /\.(png|jpe?g|webp|gif)$/i;
|
|
62
|
+
/** Every design source in a unit's `requirements/` — what makes an inventory necessary. */
|
|
63
|
+
function designSourcesOf(reqDir) {
|
|
64
|
+
const out = [];
|
|
65
|
+
const uiDir = path.join(reqDir, 'ui');
|
|
66
|
+
try {
|
|
67
|
+
for (const f of fs.readdirSync(uiDir).sort()) {
|
|
68
|
+
if (IMAGE.test(f) || f === 'figma-meta.md')
|
|
69
|
+
out.push(`ui/${f}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* no ui/ dir */ }
|
|
73
|
+
if (fs.existsSync(path.join(reqDir, 'spec_figma.md')))
|
|
74
|
+
out.push('spec_figma.md');
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The Source cell, read leniently ("design only", "Spec + Design", "conflict — …"). Anything else
|
|
79
|
+
* is NOT assumed to be spec-backed: an unreadable source is reported like a design-only item, so a
|
|
80
|
+
* typo can never make an item disappear from the check.
|
|
81
|
+
*/
|
|
82
|
+
function sourceOf(cell) {
|
|
83
|
+
const c = cell.trim().toLowerCase();
|
|
84
|
+
if (/^design[\s_-]*only\b/.test(c))
|
|
85
|
+
return 'design-only';
|
|
86
|
+
if (/^conflict\b/.test(c))
|
|
87
|
+
return 'conflict';
|
|
88
|
+
if (/^spec\s*(?:\+|&|and)\s*design\b/.test(c))
|
|
89
|
+
return 'spec+design';
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse the inventory table: any markdown row whose first cell is a `UI-<n>` id. Leading/trailing
|
|
94
|
+
* pipes are optional (GFM), and the Source cell is FOUND rather than counted — a `|` written inside
|
|
95
|
+
* the Item cell shifts the columns, and a positional read then misfiled a design-only row.
|
|
96
|
+
*/
|
|
97
|
+
function parseUiInventory(text) {
|
|
98
|
+
const items = [];
|
|
99
|
+
for (const line of text.split('\n')) {
|
|
100
|
+
if (!line.includes('|'))
|
|
101
|
+
continue;
|
|
102
|
+
const cells = line.trim().replace(/^\|/, '').replace(/\|$/, '').split('|').map((c) => c.trim());
|
|
103
|
+
if (!/^UI-\d+$/i.test(cells[0] ?? ''))
|
|
104
|
+
continue;
|
|
105
|
+
// Source = the last cell that reads as one (Seen-in follows it; prose in Item never starts so).
|
|
106
|
+
let srcIdx = -1;
|
|
107
|
+
for (let i = cells.length - 1; i >= 2; i--)
|
|
108
|
+
if (sourceOf(cells[i])) {
|
|
109
|
+
srcIdx = i;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
const source = srcIdx >= 0 ? sourceOf(cells[srcIdx]) : 'design-only';
|
|
113
|
+
const kindIdx = srcIdx >= 0 ? srcIdx - 1 : Math.min(2, cells.length - 1);
|
|
114
|
+
items.push({
|
|
115
|
+
id: cells[0].toUpperCase(),
|
|
116
|
+
item: cells.slice(1, Math.max(2, kindIdx)).join(' | '),
|
|
117
|
+
kind: cells[kindIdx] ?? '',
|
|
118
|
+
source,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const m = text.match(/images read:\s*(\d+)\s*\/\s*(\d+)/i);
|
|
122
|
+
return { items, imagesRead: m ? { read: Number(m[1]), total: Number(m[2]) } : null };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Ids cited on a `UI-DEFERRED` comment line — a deliberate, REASONED omission. A line that lists
|
|
126
|
+
* ids and nothing else is not a decision anyone can review, so it defers nothing.
|
|
127
|
+
*/
|
|
128
|
+
function deferredIds(featureText) {
|
|
129
|
+
const lines = featureText.split('\n').filter((l) => {
|
|
130
|
+
if (!/^\s*#\s*UI-DEFERRED\b/i.test(l))
|
|
131
|
+
return false;
|
|
132
|
+
const reason = l.replace(/^\s*#\s*UI-DEFERRED\b\s*:?/i, '').replace(/\bUI-\d+(?:\s*(?:\.\.|–|—|~|\/)\s*(?:UI-)?\d+)*/gi, '');
|
|
133
|
+
return /[\p{L}]{3,}/u.test(reason);
|
|
134
|
+
});
|
|
135
|
+
return (0, spec_coverage_1.citedIds)(lines.join('\n'));
|
|
136
|
+
}
|
|
137
|
+
function uiInventoryCoverage(reqDir, featureText) {
|
|
138
|
+
const designSources = designSourcesOf(reqDir);
|
|
139
|
+
const invPath = path.join(reqDir, 'ui-inventory.md');
|
|
140
|
+
const invText = fs.existsSync(invPath) ? (0, read_text_1.readTextFile)(invPath) : null;
|
|
141
|
+
const { items, imagesRead } = invText ? parseUiInventory(invText) : { items: [], imagesRead: null };
|
|
142
|
+
// Coverage is the `@ui:` TAG, nothing else: a `UI-001`-shaped string elsewhere (an `@spec:UI-001`
|
|
143
|
+
// requirement in a project that numbers its FRs that way, prose, an unreasoned deferral line)
|
|
144
|
+
// must not mark a design item as proven.
|
|
145
|
+
const cites = (0, spec_coverage_1.citedIds)((featureText.match(/@ui:\S+/gi) ?? []).join(' '));
|
|
146
|
+
const deferSet = deferredIds(featureText);
|
|
147
|
+
const covered = [];
|
|
148
|
+
const deferred = [];
|
|
149
|
+
const uncovered = [];
|
|
150
|
+
for (const it of items) {
|
|
151
|
+
if (deferSet.has(it.id))
|
|
152
|
+
deferred.push(it.id);
|
|
153
|
+
else if (cites.has(it.id))
|
|
154
|
+
covered.push(it.id);
|
|
155
|
+
else if (it.source !== 'spec+design')
|
|
156
|
+
uncovered.push(it);
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
designSources,
|
|
160
|
+
hasInventory: invText !== null,
|
|
161
|
+
items,
|
|
162
|
+
imagesRead,
|
|
163
|
+
imagesOnDisk: designSources.filter((s) => IMAGE.test(s)).length,
|
|
164
|
+
covered,
|
|
165
|
+
deferred,
|
|
166
|
+
uncovered,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/** Advisory findings for the audit report. */
|
|
170
|
+
function uiInventoryFindings(r) {
|
|
171
|
+
const out = [];
|
|
172
|
+
if (r.designSources.length === 0)
|
|
173
|
+
return out;
|
|
174
|
+
if (!r.hasInventory) {
|
|
175
|
+
out.push(`UI-INVENTORY-MISSING: the unit has design sources (${r.designSources.slice(0, 4).join(', ')}${r.designSources.length > 4 ? ', …' : ''}) but no \`requirements/ui-inventory.md\` — nothing shows the design was read item by item, so an item that exists only on the design (or contradicts the spec) is invisible to the gate and to review. Re-run /sungen:create-test so it writes the inventory, or write it by hand: one \`| UI-NNN | item | kind | spec+design / design-only / conflict |\` row per component, column, button, state and annotation.`);
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
if (r.imagesRead && r.imagesRead.read < Math.max(r.imagesRead.total, r.imagesOnDisk)) {
|
|
179
|
+
out.push(`UI-INVENTORY-INCOMPLETE: the inventory records "images read: ${r.imagesRead.read}/${r.imagesRead.total}" and the unit holds ${r.imagesOnDisk} image(s) — the unread design is not inventoried. Read the remaining images and add their items.`);
|
|
180
|
+
}
|
|
181
|
+
else if (!r.imagesRead && r.imagesOnDisk > 0) {
|
|
182
|
+
out.push(`UI-INVENTORY-INCOMPLETE: the unit holds ${r.imagesOnDisk} image(s) but the inventory does not record "images read: N/N" — nothing shows every image was opened. Add the line after reading them all.`);
|
|
183
|
+
}
|
|
184
|
+
for (const it of r.uncovered.slice(0, 10)) {
|
|
185
|
+
out.push(`UI-ITEM-UNCOVERED: ${it.id} "${it.item}" (${it.kind}, ${it.source}) has no scenario and no deferral — ${it.source === 'conflict' ? 'the design and spec.md disagree on it; resolve which is right, then cover it' : 'it exists only on the design, outside spec.md'}. Cover it (\`@ui:${it.id}\` on the scenario that proves it), or record the decision: \`# UI-DEFERRED: ${it.id} — <reason>\`.`);
|
|
186
|
+
}
|
|
187
|
+
if (r.uncovered.length > 10)
|
|
188
|
+
out.push(`UI-ITEM-UNCOVERED: … and ${r.uncovered.length - 10} more design-only/conflict item(s).`);
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=ui-inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-inventory.js","sourceRoot":"","sources":["../../src/harness/ui-inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewpoint-baseline.d.ts","sourceRoot":"","sources":["../../src/harness/viewpoint-baseline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"viewpoint-baseline.d.ts","sourceRoot":"","sources":["../../src/harness/viewpoint-baseline.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+FAA+F;AAC/F,eAAO,MAAM,wBAAwB,2CAA4C,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;IACnD,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAwDD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,iBAAiB,CAiCnB;AAED,mGAAmG;AACnG,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,IAAI,CASN;AAED,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKxH"}
|
|
@@ -41,6 +41,7 @@ const crypto = __importStar(require("crypto"));
|
|
|
41
41
|
const fs = __importStar(require("fs"));
|
|
42
42
|
const path = __importStar(require("path"));
|
|
43
43
|
const parse_1 = require("./parse");
|
|
44
|
+
const viewpoint_draft_header_1 = require("./viewpoint-draft-header");
|
|
44
45
|
/**
|
|
45
46
|
* Keep the yardstick from moving with the thing it measures.
|
|
46
47
|
*
|
|
@@ -100,7 +101,12 @@ function fingerprint(ids) {
|
|
|
100
101
|
*/
|
|
101
102
|
function fileFingerprint(viewpointPath) {
|
|
102
103
|
try {
|
|
103
|
-
|
|
104
|
+
const bytes = fs.readFileSync(viewpointPath);
|
|
105
|
+
// `drafted-by: ai` is provenance that accept REMOVES, so it is not part of what was reviewed:
|
|
106
|
+
// counted, accepting a draft would read as the declaration changing. Every other byte stays raw.
|
|
107
|
+
const text = bytes.toString('utf-8');
|
|
108
|
+
const hashed = (0, viewpoint_draft_header_1.isAiDraft)(text) ? Buffer.from((0, viewpoint_draft_header_1.removeDraftLine)(text), 'utf-8') : bytes;
|
|
109
|
+
return crypto.createHash('sha1').update(hashed).digest('hex').slice(0, 12);
|
|
104
110
|
}
|
|
105
111
|
catch {
|
|
106
112
|
return '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewpoint-baseline.js","sourceRoot":"","sources":["../../src/harness/viewpoint-baseline.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"viewpoint-baseline.js","sourceRoot":"","sources":["../../src/harness/viewpoint-baseline.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2GA,wDAqCC;AAGD,0DAaC;AAGD,4DAKC;AAxKD,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAC7B,mCAAiD;AACjD,qEAAsE;AAEtE;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+FAA+F;AAClF,QAAA,wBAAwB,GAAG,CAAC,cAAc,EAAE,cAAc,CAAU,CAAC;AAyBlF,SAAS,YAAY,CAAC,WAAmB;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAiB,CAAC;QACvE,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAG,gDAAgD;IACtF,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB,EAAE,IAAkB;IAChE,MAAM,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACpC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAa;IAChC,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,aAAqB;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAC7C,8FAA8F;QAC9F,iGAAiG;QACjG,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAA,kCAAS,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAA,wCAAe,EAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrF,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CACpC,WAAmB,EACnB,MAAc,EACd,aAAqB;IAErB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAClF,MAAM,GAAG,GAAG,IAAA,8BAAsB,EAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAErE,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAC7D,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACjH,2EAA2E;IAC3E,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACvG,CAAC;IACD,uFAAuF;IACvF,uFAAuF;IACvF,gFAAgF;IAChF,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACvG,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;QACJ,GAAG;QACH,QAAQ;QACR,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxD,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,SAAgB,uBAAuB,CACrC,WAAmB,EACnB,MAAc,EACd,OAA2D;IAE3D,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;IACF,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,sFAAsF;AACtF,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAA,8BAAsB,EAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isAiDraft(text: string): boolean;
|
|
2
|
+
/** `raw` without the one draft line; every other byte is untouched. A file with no draft line comes back as is. */
|
|
3
|
+
export declare function removeDraftLine(raw: string): string;
|
|
4
|
+
export declare function viewpointFileIsAiDraft(viewpointPath: string): boolean;
|
|
5
|
+
/** Remove the draft line from the file, atomically. True when a line was removed; throws a clear error when the write fails. */
|
|
6
|
+
export declare function removeDraftLineFromFile(viewpointPath: string): boolean;
|
|
7
|
+
//# sourceMappingURL=viewpoint-draft-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewpoint-draft-header.d.ts","sourceRoot":"","sources":["../../src/harness/viewpoint-draft-header.ts"],"names":[],"mappings":"AA+BA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,mHAAmH;AACnH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,gIAAgI;AAChI,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAOtE"}
|