@sun-asterisk/sungen 3.2.33 → 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 +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +54 -10
- 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 +5 -1
- 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 +75 -42
- package/dist/cli/commands/delivery.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 +7 -0
- package/dist/cli/commands/results-merge.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/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 +8 -0
- package/dist/exporters/feature-parser.d.ts.map +1 -1
- package/dist/exporters/feature-parser.js +12 -0
- 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/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 +55 -12
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/carry-manual-results.d.ts +19 -0
- package/dist/exporters/matrix/carry-manual-results.d.ts.map +1 -1
- package/dist/exporters/matrix/carry-manual-results.js +76 -6
- package/dist/exporters/matrix/carry-manual-results.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +8 -2
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +15 -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 +1 -1
- package/dist/exporters/matrix/wording.d.ts.map +1 -1
- package/dist/exporters/matrix/wording.js +10 -1
- 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/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/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/partials/pick-option.hbs +13 -0
- package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +16 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +23 -2
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +3 -1
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +3 -1
- package/dist/generators/test-generator/diagnostics.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 +48 -15
- package/dist/harness/audit.js.map +1 -1
- 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/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/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +6 -4
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/read-text.d.ts +15 -0
- package/dist/harness/read-text.d.ts.map +1 -1
- package/dist/harness/read-text.js +25 -0
- 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/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 +8 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +92 -21
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/spec-branches.js +1 -1
- package/dist/harness/spec-branches.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 +104 -18
- 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/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/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/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-error-mapping/SKILL.md +22 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +18 -9
- 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-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-url-assert.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-url-assert.js +24 -2
- package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
- package/dist/orchestrator/templates/specs-url-assert.ts +23 -2
- 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 +49 -10
- package/src/cli/commands/capability.ts +3 -1
- 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 +70 -42
- package/src/cli/commands/results-merge.ts +7 -1
- 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/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 +12 -0
- package/src/exporters/json-exporter.ts +6 -1
- package/src/exporters/manual-hybrid-oracle.ts +112 -0
- package/src/exporters/matrix/build.ts +57 -11
- package/src/exporters/matrix/carry-manual-results.ts +70 -7
- package/src/exporters/matrix/export.ts +16 -2
- 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 +10 -1
- 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/generators/gherkin-parser/index.ts +50 -18
- package/src/generators/test-generator/adapters/adapter-interface.ts +4 -0
- 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/partials/pick-option.hbs +13 -0
- package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +16 -0
- package/src/generators/test-generator/code-generator.ts +23 -2
- package/src/generators/test-generator/diagnostics.ts +3 -1
- package/src/harness/audit.ts +52 -17
- 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/manifest.ts +2 -2
- package/src/harness/next-step.ts +47 -5
- package/src/harness/parse.ts +151 -27
- package/src/harness/quality-gates.ts +6 -4
- package/src/harness/read-text.ts +25 -0
- package/src/harness/script-check.ts +7 -1
- package/src/harness/select-by-ids.ts +83 -0
- package/src/harness/sensors.ts +91 -21
- package/src/harness/spec-branches.ts +1 -1
- 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 +111 -24
- 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/orchestrator/flow-manager.ts +3 -53
- package/src/orchestrator/screen-manager.ts +7 -61
- 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-error-mapping/SKILL.md +22 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +18 -9
- 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-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-url-assert.ts +23 -2
- 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,200 @@
|
|
|
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.tableRows = tableRows;
|
|
37
|
+
exports.normRef = normRef;
|
|
38
|
+
exports.extractRefs = extractRefs;
|
|
39
|
+
exports.itemUniverses = itemUniverses;
|
|
40
|
+
exports.citedUniverse = citedUniverse;
|
|
41
|
+
/**
|
|
42
|
+
* Building blocks of `sungen viewpoint scan` (viewpoint-scan.ts): the markdown table walker, the
|
|
43
|
+
* item-reference reader and the item universe. Pure, read-only, format-tolerant by design — a
|
|
44
|
+
* QA-written file is never judged here, only its ids and item numbers are read.
|
|
45
|
+
*/
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const read_text_1 = require("./read-text");
|
|
49
|
+
const ui_inventory_1 = require("./ui-inventory");
|
|
50
|
+
const spec_coverage_1 = require("./spec-coverage");
|
|
51
|
+
const SEPARATOR = /^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/;
|
|
52
|
+
const splitCells = (line) => line.trim().replace(/^\|/, '').replace(/\|$/, '')
|
|
53
|
+
.split(/(?<!\\)\|/).map((c) => c.replace(/\*\*|`/g, '').trim());
|
|
54
|
+
/** Every body row of every markdown table, with its header and enclosing headings. */
|
|
55
|
+
function tableRows(text) {
|
|
56
|
+
const lines = text.split('\n');
|
|
57
|
+
const out = [];
|
|
58
|
+
const headings = []; // index = level − 1
|
|
59
|
+
let header = null;
|
|
60
|
+
for (let i = 0; i < lines.length; i++) {
|
|
61
|
+
const raw = lines[i];
|
|
62
|
+
const h = raw.match(/^(#{1,6})\s+(.*)$/);
|
|
63
|
+
if (h) {
|
|
64
|
+
headings.length = h[1].length - 1;
|
|
65
|
+
headings[h[1].length - 1] = h[2];
|
|
66
|
+
header = null;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (!raw.includes('|')) {
|
|
70
|
+
header = null;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (SEPARATOR.test(raw))
|
|
74
|
+
continue;
|
|
75
|
+
if (i + 1 < lines.length && SEPARATOR.test(lines[i + 1])) {
|
|
76
|
+
header = splitCells(raw);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
out.push({ line: i + 1, raw, cells: splitCells(raw), header, section: headings.join(' ') });
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
const NUM = String.raw `(?<!\d)\d{1,3}(?:\.\d{1,3})*(?![\d])`;
|
|
84
|
+
const LIST = new RegExp(`(?:\\bitems?|項目|(?<![\\w-])UI[\\s-]*#?|#)\\s*(${NUM}(?:\\s*(?:[-–—~〜~,;&/]|(?<![\\p{L}\\p{N}])(?:và|and)(?![\\p{L}\\p{N}]))\\s*${NUM})*)`, 'giu');
|
|
85
|
+
/** `009` → `9`, `4.03` → `4.3`; null when the text is not a plain (dotted) number. */
|
|
86
|
+
function normRef(s) {
|
|
87
|
+
const t = s.replace(/[[\]§#]/g, '').trim();
|
|
88
|
+
return /^\d+(\.\d+)*$/.test(t) ? t.split('.').map((p) => String(Number(p))).join('.') : null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The refs strictly between `a` and `b` (normalised): `4`–`6` → `5`, `5.4`–`5.8` → `5.5 … 5.7`.
|
|
92
|
+
* Only the last level steps, so both ends need the same prefix; `5.4–6.2` or `3–5.2` cannot be
|
|
93
|
+
* enumerated without the item list and give nothing.
|
|
94
|
+
*/
|
|
95
|
+
function between(a, b) {
|
|
96
|
+
const pa = a.split('.');
|
|
97
|
+
const pb = b.split('.');
|
|
98
|
+
if (pa.length !== pb.length || pa.slice(0, -1).join('.') !== pb.slice(0, -1).join('.'))
|
|
99
|
+
return [];
|
|
100
|
+
const lo = Number(pa[pa.length - 1]);
|
|
101
|
+
const hi = Number(pb[pb.length - 1]);
|
|
102
|
+
if (!(hi > lo && hi - lo < 200))
|
|
103
|
+
return [];
|
|
104
|
+
const prefix = pa.slice(0, -1).map((p) => `${p}.`).join('');
|
|
105
|
+
return Array.from({ length: hi - lo - 1 }, (_, k) => `${prefix}${lo + 1 + k}`);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Item numbers a cell cites: `item 9`, `item 2, 3, 7`, `item 4–6`, `item 5.4–5.8`, `項目 4.3〜4.6`, `UI #9`,
|
|
109
|
+
* `UI-009`, `[9]`, `§4.3.2`. Prose (`Auth guard`), message codes (`M02`) and question ids
|
|
110
|
+
* (`Q-01`) are not refs.
|
|
111
|
+
*/
|
|
112
|
+
function extractRefs(text) {
|
|
113
|
+
const refs = new Set();
|
|
114
|
+
const add = (s) => { const r = normRef(s); if (r)
|
|
115
|
+
refs.add(r); };
|
|
116
|
+
for (const m of text.matchAll(LIST)) {
|
|
117
|
+
let prev = null;
|
|
118
|
+
let range = false;
|
|
119
|
+
for (const tok of m[1].matchAll(new RegExp(`(${NUM})|([-–—~〜~])`, 'g'))) {
|
|
120
|
+
if (tok[2]) {
|
|
121
|
+
range = prev !== null;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const n = normRef(tok[1]);
|
|
125
|
+
if (!n)
|
|
126
|
+
continue;
|
|
127
|
+
if (range && prev)
|
|
128
|
+
for (const r of between(prev, n))
|
|
129
|
+
refs.add(r);
|
|
130
|
+
refs.add(n);
|
|
131
|
+
prev = n;
|
|
132
|
+
range = false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const m of text.matchAll(/\[(\d{1,3})\]/g))
|
|
136
|
+
add(m[1]);
|
|
137
|
+
for (const m of text.matchAll(/§\s*(\d{1,3}(?:\.\d{1,3})*)/g))
|
|
138
|
+
add(m[1]);
|
|
139
|
+
return [...refs];
|
|
140
|
+
}
|
|
141
|
+
const NO_COL = /^(no\.?|#|stt|№|番号)$/i;
|
|
142
|
+
const TYPE_COL = /種別|\b(type|kind)\b|loại/i;
|
|
143
|
+
const NAME_COL = /item|name|tên|項目|名|field|label|trường|thành phần|component/i;
|
|
144
|
+
/**
|
|
145
|
+
* The unit's lists, by where each id is DECLARED: requirement ids spec.md declares (`**FR-BC-03**:`),
|
|
146
|
+
* the spec's item table (`No` + name + type columns), and ui-inventory ids (`UI-NNN`). An id's shape
|
|
147
|
+
* says nothing about which list it belongs to — `item 9` on a mockup and `UI-009` in the inventory
|
|
148
|
+
* number different things.
|
|
149
|
+
*/
|
|
150
|
+
function itemUniverses(reqDir) {
|
|
151
|
+
const read = (f) => {
|
|
152
|
+
const p = path.join(reqDir, f);
|
|
153
|
+
return fs.existsSync(p) ? (0, read_text_1.stripHtmlComments)((0, read_text_1.readTextFile)(p)) : null;
|
|
154
|
+
};
|
|
155
|
+
const out = { specIds: [], specTable: [], inventory: [] };
|
|
156
|
+
const spec = read('spec.md');
|
|
157
|
+
if (spec) {
|
|
158
|
+
out.specIds = (0, spec_coverage_1.parseSpecClauses)(path.join(reqDir, 'spec.md')).frs.map((f) => ({ ref: f.id, name: f.text.slice(0, 80) }));
|
|
159
|
+
for (const row of tableRows(spec)) {
|
|
160
|
+
const h = row.header;
|
|
161
|
+
const no = h?.findIndex((c) => NO_COL.test(c)) ?? -1;
|
|
162
|
+
const type = h?.findIndex((c) => TYPE_COL.test(c)) ?? -1;
|
|
163
|
+
const name = h?.findIndex((c, i) => i !== no && i !== type && NAME_COL.test(c)) ?? -1;
|
|
164
|
+
if (no < 0 || type < 0 || name < 0)
|
|
165
|
+
continue;
|
|
166
|
+
const ref = normRef(row.cells[no] ?? '');
|
|
167
|
+
if (ref)
|
|
168
|
+
out.specTable.push({ ref, name: row.cells[name] ?? '' });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const inv = read('ui-inventory.md');
|
|
172
|
+
if (inv) {
|
|
173
|
+
out.inventory = (0, ui_inventory_1.parseUiInventory)(inv).items.flatMap((i) => {
|
|
174
|
+
const ref = normRef(i.id.replace(/^UI-/i, ''));
|
|
175
|
+
return ref ? [{ ref, name: i.item }] : [];
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The list(s) the viewpoint actually cites — a list nobody cites says nothing about gaps. The spec's
|
|
182
|
+
* ids and its item table, each when cited (both when both are: the notations cannot collide, and
|
|
183
|
+
* dropping one would under-report); the table also when nothing is cited at all (then every item is
|
|
184
|
+
* uncited, which is true); the inventory only when the viewpoint writes `UI-NNN`; else none.
|
|
185
|
+
*/
|
|
186
|
+
function citedUniverse(u, cited, writesInventoryIds) {
|
|
187
|
+
const hits = (items) => items.some((i) => cited.has(i.ref));
|
|
188
|
+
const ids = hits(u.specIds);
|
|
189
|
+
const table = u.specTable.length > 0 && (cited.size === 0 || hits(u.specTable));
|
|
190
|
+
if (ids && table)
|
|
191
|
+
return { source: 'spec-ids+spec-table', items: [...u.specIds, ...u.specTable] };
|
|
192
|
+
if (ids)
|
|
193
|
+
return { source: 'spec-ids', items: u.specIds };
|
|
194
|
+
if (table)
|
|
195
|
+
return { source: 'spec-table', items: u.specTable };
|
|
196
|
+
if (writesInventoryIds && hits(u.inventory))
|
|
197
|
+
return { source: 'ui-inventory', items: u.inventory };
|
|
198
|
+
return { source: 'none', items: [] };
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=viewpoint-scan-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewpoint-scan-refs.js","sourceRoot":"","sources":["../../src/harness/viewpoint-scan-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ItemSource } from './viewpoint-scan-refs';
|
|
2
|
+
import { ViewpointMode } from './viewpoint-mode';
|
|
3
|
+
export interface VpRow {
|
|
4
|
+
id: string;
|
|
5
|
+
line: number;
|
|
6
|
+
/** Item numbers the row cites (normalised: `009` → `9`), and spec-declared ids it cites (`FR-BC-03`). */
|
|
7
|
+
refs: string[];
|
|
8
|
+
/** `# MANUAL/ENV` or `@manual` on the row or an enclosing heading. */
|
|
9
|
+
manual: boolean;
|
|
10
|
+
/** The Kỳ vọng / Expected cell has text (best effort when the table has no such header). */
|
|
11
|
+
hasExpected: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ViewpointScan {
|
|
14
|
+
/** The create-test mode this file calls for (viewpoint-mode.ts): 2 = AI drafts, 1 = review only. */
|
|
15
|
+
mode: ViewpointMode;
|
|
16
|
+
modeReason: string;
|
|
17
|
+
vpRows: VpRow[];
|
|
18
|
+
/** Distinct VP ids among `vpRows` — a reused id is several rows but one id. */
|
|
19
|
+
distinctIds: number;
|
|
20
|
+
rowsWithoutExpected: string[];
|
|
21
|
+
manualRows: string[];
|
|
22
|
+
itemSource: ItemSource;
|
|
23
|
+
/** Spec/inventory items no VP row cites — a hint for the review, not a verdict. */
|
|
24
|
+
uncitedItems: {
|
|
25
|
+
ref: string;
|
|
26
|
+
name: string;
|
|
27
|
+
}[];
|
|
28
|
+
/** VP ids no feature file mentions; null when the unit has no feature file yet. */
|
|
29
|
+
withoutScenario: string[] | null;
|
|
30
|
+
/** Why `vpRows` is empty, else null. */
|
|
31
|
+
note: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare const NO_VP_IDS_NOTE = "file has no VP ids; review falls back to AI-only";
|
|
34
|
+
/**
|
|
35
|
+
* VP rows of one viewpoint text (already comment-stripped, as `readViewpointText` returns it).
|
|
36
|
+
* `specIds`: the requirement ids spec.md declares — only those count as spec citations.
|
|
37
|
+
*/
|
|
38
|
+
export declare function scanViewpointText(text: string, specIds?: ReadonlySet<string>): VpRow[];
|
|
39
|
+
/** Scan one unit directory (`qa/screens/<n>`, `qa/flows/<n>`, …); `unit` names its feature files. */
|
|
40
|
+
export declare function scanViewpointUnit(unitDir: string, unit: string): ViewpointScan;
|
|
41
|
+
//# sourceMappingURL=viewpoint-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewpoint-scan.d.ts","sourceRoot":"","sources":["../../src/harness/viewpoint-scan.ts"],"names":[],"mappings":"AAeA,OAAO,EAAwD,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACzG,OAAO,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;IAChB,4FAA4F;IAC5F,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,oGAAoG;IACpG,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,mFAAmF;IACnF,YAAY,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,mFAAmF;IACnF,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,wCAAwC;IACxC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAUD,eAAO,MAAM,cAAc,qDAAqD,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,KAAK,EAAE,CAoBjG;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CA0B9E"}
|
|
@@ -0,0 +1,118 @@
|
|
|
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.NO_VP_IDS_NOTE = void 0;
|
|
37
|
+
exports.scanViewpointText = scanViewpointText;
|
|
38
|
+
exports.scanViewpointUnit = scanViewpointUnit;
|
|
39
|
+
/**
|
|
40
|
+
* `sungen viewpoint scan` — the code half of reviewing a QA-written test-viewpoint.md.
|
|
41
|
+
*
|
|
42
|
+
* It does set arithmetic on ids and nothing else: which VP rows exist, what each cites, which spec
|
|
43
|
+
* items nobody cites, which ids no scenario carries. It never judges meaning, never edits the file,
|
|
44
|
+
* and feeds no audit finding, score or baseline.
|
|
45
|
+
*
|
|
46
|
+
* A VP row is a markdown table row whose FIRST cell is a full id (`VP-UI-001`, `FL-LOGIN-3`).
|
|
47
|
+
* Priority-table rows (`VP-LOGIN (Auth)`), bullets and appendix text are not rows. This is
|
|
48
|
+
* deliberately NOT `parseViewpointItems` (viewpoint-ledger.ts), which also reads id-less rows.
|
|
49
|
+
*/
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const read_text_1 = require("./read-text");
|
|
53
|
+
const unit_paths_1 = require("./unit-paths");
|
|
54
|
+
const viewpoint_scan_refs_1 = require("./viewpoint-scan-refs");
|
|
55
|
+
const viewpoint_mode_1 = require("./viewpoint-mode");
|
|
56
|
+
const VP_ID = /^(VP|FL)-[A-Z][A-Z0-9]*(-[A-Z0-9]+)*-\d+$/;
|
|
57
|
+
const MANUAL = /\bMANUAL\/ENV\b|@manual\b/i;
|
|
58
|
+
const EXPECTED_COL = /kỳ vọng|kết quả mong đợi|expected|期待/i;
|
|
59
|
+
/** Whole-word match (Unicode-aware: `\b` fails on `ồ`) so `Resource` / `Datasource` are not a source column. */
|
|
60
|
+
const SOURCE_COL = /(?<![\p{L}\p{N}])(?:nguồn|source|tham chiếu|ref|出典|根拠)(?![\p{L}\p{N}])/iu;
|
|
61
|
+
const PRIORITY = /^(critical|high|med(?:ium)?|low|cao|trung bình|thấp)$/i;
|
|
62
|
+
const BLANK = /^[\s\-–—…]*$/;
|
|
63
|
+
const SPEC_ID = /(?<![\w-])[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*-\d+[A-Z]?(?![\w-])/gi;
|
|
64
|
+
exports.NO_VP_IDS_NOTE = 'file has no VP ids; review falls back to AI-only';
|
|
65
|
+
/**
|
|
66
|
+
* VP rows of one viewpoint text (already comment-stripped, as `readViewpointText` returns it).
|
|
67
|
+
* `specIds`: the requirement ids spec.md declares — only those count as spec citations.
|
|
68
|
+
*/
|
|
69
|
+
function scanViewpointText(text, specIds = new Set()) {
|
|
70
|
+
const rows = [];
|
|
71
|
+
for (const r of (0, viewpoint_scan_refs_1.tableRows)(text)) {
|
|
72
|
+
const id = r.cells[0];
|
|
73
|
+
if (!VP_ID.test(id))
|
|
74
|
+
continue;
|
|
75
|
+
const exp = r.header?.findIndex((c) => EXPECTED_COL.test(c)) ?? -1;
|
|
76
|
+
const src = r.header?.findIndex((c) => SOURCE_COL.test(c)) ?? -1;
|
|
77
|
+
const cites = src > 0 ? r.cells[src] ?? '' : r.cells.slice(1).join(' | ');
|
|
78
|
+
rows.push({
|
|
79
|
+
id,
|
|
80
|
+
line: r.line,
|
|
81
|
+
refs: [...(0, viewpoint_scan_refs_1.extractRefs)(cites), ...[...cites.matchAll(SPEC_ID)].map((m) => m[0].toUpperCase()).filter((id) => specIds.has(id))],
|
|
82
|
+
manual: MANUAL.test(r.raw) || MANUAL.test(r.section),
|
|
83
|
+
// Without a Kỳ vọng header: any later cell with text that is neither a priority word nor a ref.
|
|
84
|
+
hasExpected: exp > 0
|
|
85
|
+
? !BLANK.test(r.cells[exp] ?? '')
|
|
86
|
+
: r.cells.slice(2).some((c) => !BLANK.test(c) && !PRIORITY.test(c) && (0, viewpoint_scan_refs_1.extractRefs)(c).length === 0),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return rows;
|
|
90
|
+
}
|
|
91
|
+
/** Scan one unit directory (`qa/screens/<n>`, `qa/flows/<n>`, …); `unit` names its feature files. */
|
|
92
|
+
function scanViewpointUnit(unitDir, unit) {
|
|
93
|
+
const reqDir = path.join(unitDir, 'requirements');
|
|
94
|
+
const vpPath = path.join(reqDir, 'test-viewpoint.md');
|
|
95
|
+
const vpText = (0, read_text_1.readViewpointText)(vpPath);
|
|
96
|
+
const universes = (0, viewpoint_scan_refs_1.itemUniverses)(reqDir);
|
|
97
|
+
const vpRows = scanViewpointText(vpText, new Set(universes.specIds.map((i) => i.ref)));
|
|
98
|
+
const { mode, reason } = (0, viewpoint_mode_1.viewpointMode)(fs.existsSync(vpPath) ? (0, read_text_1.readTextFile)(vpPath) : null, vpRows);
|
|
99
|
+
const cited = new Set(vpRows.flatMap((r) => r.refs));
|
|
100
|
+
const { source, items } = (0, viewpoint_scan_refs_1.citedUniverse)(universes, cited, /(?<![\w-])UI-\d{1,3}\b/i.test(vpText));
|
|
101
|
+
const features = (0, unit_paths_1.featureFilesFor)(unitDir, unit).filter((f) => fs.existsSync(f));
|
|
102
|
+
// Same rule as the ledger (viewpoint-ledger.ts): an id is carried when the feature text contains it.
|
|
103
|
+
const featureText = features.map((f) => (0, read_text_1.readTextFile)(f).toLowerCase()).join('\n');
|
|
104
|
+
return {
|
|
105
|
+
mode,
|
|
106
|
+
modeReason: reason,
|
|
107
|
+
vpRows,
|
|
108
|
+
distinctIds: new Set(vpRows.map((r) => r.id)).size,
|
|
109
|
+
rowsWithoutExpected: vpRows.filter((r) => !r.hasExpected).map((r) => r.id),
|
|
110
|
+
manualRows: vpRows.filter((r) => r.manual).map((r) => r.id),
|
|
111
|
+
itemSource: source,
|
|
112
|
+
uncitedItems: items.filter((i) => !cited.has(i.ref)),
|
|
113
|
+
withoutScenario: features.length === 0 ? null : vpRows.filter((r) => !featureText.includes(r.id.toLowerCase())).map((r) => r.id),
|
|
114
|
+
note: vpRows.length > 0 ? null
|
|
115
|
+
: fs.existsSync(vpPath) ? exports.NO_VP_IDS_NOTE : 'requirements/test-viewpoint.md is missing',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=viewpoint-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewpoint-scan.js","sourceRoot":"","sources":["../../src/harness/viewpoint-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,6 @@ export declare class FlowManager {
|
|
|
33
33
|
*/
|
|
34
34
|
private restoreMissingScaffolds;
|
|
35
35
|
private generateSpecTemplate;
|
|
36
|
-
private generateViewpointTemplate;
|
|
37
36
|
private generateFeatureTemplate;
|
|
38
37
|
/**
|
|
39
38
|
* Build the Background block for a mobile flow — same structure as screen-manager.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-manager.d.ts","sourceRoot":"","sources":["../../src/orchestrator/flow-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"flow-manager.d.ts","sourceRoot":"","sources":["../../src/orchestrator/flow-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;;IAOnB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6IlD,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;OASG;IACH,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,oBAAoB;IAiE5B,OAAO,CAAC,uBAAuB;IAkD/B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAmC9B"}
|
|
@@ -43,6 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const capability_1 = require("../harness/capability");
|
|
45
45
|
const test_data_guide_1 = require("./test-data-guide");
|
|
46
|
+
const viewpoint_scaffold_1 = require("./viewpoint-scaffold");
|
|
46
47
|
class FlowManager {
|
|
47
48
|
constructor() {
|
|
48
49
|
this.cwd = process.cwd();
|
|
@@ -148,7 +149,7 @@ class FlowManager {
|
|
|
148
149
|
const specPath = path.join(requirementsDir, 'spec.md');
|
|
149
150
|
fs.writeFileSync(specPath, this.generateSpecTemplate(options, flowName, isMobile), 'utf-8');
|
|
150
151
|
const viewpointPath = path.join(requirementsDir, 'test-viewpoint.md');
|
|
151
|
-
fs.writeFileSync(viewpointPath,
|
|
152
|
+
fs.writeFileSync(viewpointPath, (0, viewpoint_scaffold_1.viewpointScaffold)(`${options.name} Flow`, isMobile), 'utf-8');
|
|
152
153
|
console.log(`Created files:`);
|
|
153
154
|
console.log(` ${path.relative(this.cwd, featurePath)}`);
|
|
154
155
|
console.log(` ${path.relative(this.cwd, selectorPath)}`);
|
|
@@ -214,7 +215,7 @@ class FlowManager {
|
|
|
214
215
|
restored.push(file);
|
|
215
216
|
};
|
|
216
217
|
ensure(path.join(paths.requirementsDir, 'spec.md'), () => this.generateSpecTemplate(options, flowName, isMobile));
|
|
217
|
-
ensure(path.join(paths.requirementsDir, 'test-viewpoint.md'), () =>
|
|
218
|
+
ensure(path.join(paths.requirementsDir, 'test-viewpoint.md'), () => (0, viewpoint_scaffold_1.viewpointScaffold)(`${options.name} Flow`, isMobile));
|
|
218
219
|
ensure(paths.featurePath, () => this.generateFeatureTemplate(options, flowName, isMobile));
|
|
219
220
|
return restored;
|
|
220
221
|
}
|
|
@@ -281,56 +282,6 @@ class FlowManager {
|
|
|
281
282
|
- [Note 1]
|
|
282
283
|
`;
|
|
283
284
|
}
|
|
284
|
-
generateViewpointTemplate(options) {
|
|
285
|
-
return [
|
|
286
|
-
`# ${options.name} Flow — Test Viewpoints`,
|
|
287
|
-
'',
|
|
288
|
-
'## Edge Cases',
|
|
289
|
-
'',
|
|
290
|
-
'<!-- Sample — replace with actual edge cases for this flow:',
|
|
291
|
-
'- Network drops between screen transitions — should resume or show error?',
|
|
292
|
-
'- Session expires mid-flow — should redirect to login and preserve progress?',
|
|
293
|
-
'- Browser back button at step 3 — should return to step 2 with data intact?',
|
|
294
|
-
'- Complete flow twice rapidly — should prevent duplicate submissions',
|
|
295
|
-
'-->',
|
|
296
|
-
'',
|
|
297
|
-
'## Known Issues',
|
|
298
|
-
'',
|
|
299
|
-
'<!-- Sample — replace with actual known issues:',
|
|
300
|
-
'- [BUG-001] Form data lost if user navigates away and returns',
|
|
301
|
-
'- [BUG-002] Confirmation page shows stale data on slow connections',
|
|
302
|
-
'-->',
|
|
303
|
-
'',
|
|
304
|
-
'## Design Decisions',
|
|
305
|
-
'',
|
|
306
|
-
'<!-- Sample — replace with actual design decisions:',
|
|
307
|
-
'- Flow requires completing all steps in order (no skip)',
|
|
308
|
-
'- Draft is auto-saved at each step transition',
|
|
309
|
-
'- Cancel at any step discards the entire flow',
|
|
310
|
-
'-->',
|
|
311
|
-
'',
|
|
312
|
-
'## Cross-Screen Concerns',
|
|
313
|
-
'',
|
|
314
|
-
'<!-- Sample — replace with actual cross-screen concerns:',
|
|
315
|
-
'- Auth role must remain consistent across all screens',
|
|
316
|
-
'- Data entered in step 1 must be visible in confirmation (step 3)',
|
|
317
|
-
'- Error in step 2 should allow returning to step 1 without re-entering data',
|
|
318
|
-
'-->',
|
|
319
|
-
'',
|
|
320
|
-
'## Priority Viewpoints',
|
|
321
|
-
'',
|
|
322
|
-
'<!-- Rate importance for this flow (High / Medium / Low / Skip):',
|
|
323
|
-
'',
|
|
324
|
-
'| VP | Priority | Reason |',
|
|
325
|
-
'|---|----------|--------|',
|
|
326
|
-
'| VP-UI | Medium | Standard forms across screens |',
|
|
327
|
-
'| VP-VAL | High | Cross-screen validation rules |',
|
|
328
|
-
'| VP-LOGIC | High | Multi-step business logic, state transitions |',
|
|
329
|
-
'| VP-SEC | Medium | Auth must persist, role-based access at each screen |',
|
|
330
|
-
'-->',
|
|
331
|
-
'',
|
|
332
|
-
].join('\n');
|
|
333
|
-
}
|
|
334
285
|
generateFeatureTemplate(options, flowName, isMobile) {
|
|
335
286
|
const description = options.description || `complete the ${options.name} flow`;
|
|
336
287
|
if (isMobile) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-manager.js","sourceRoot":"","sources":["../../src/orchestrator/flow-manager.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,sDAAyD;AACzD,uDAA6E;
|
|
1
|
+
{"version":3,"file":"flow-manager.js","sourceRoot":"","sources":["../../src/orchestrator/flow-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-manager.d.ts","sourceRoot":"","sources":["../../src/orchestrator/screen-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAS;;IAO3B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"screen-manager.d.ts","sourceRoot":"","sources":["../../src/orchestrator/screen-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAS;;IAO3B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4JtD;;OAEG;YACW,iBAAiB;IAwC/B;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;IA2G5B,OAAO,CAAC,uBAAuB;IA6D/B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CA2C9B"}
|
|
@@ -40,10 +40,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
40
40
|
exports.ScreenManager = void 0;
|
|
41
41
|
const fs = __importStar(require("fs"));
|
|
42
42
|
const path = __importStar(require("path"));
|
|
43
|
-
const test_1 = require("@playwright/test");
|
|
44
43
|
const capability_1 = require("../harness/capability");
|
|
45
44
|
const test_data_guide_1 = require("./test-data-guide");
|
|
46
45
|
const env_qa_1 = require("../exporters/env-qa");
|
|
46
|
+
const viewpoint_scaffold_1 = require("./viewpoint-scaffold");
|
|
47
47
|
class ScreenManager {
|
|
48
48
|
constructor() {
|
|
49
49
|
this.cwd = process.cwd();
|
|
@@ -153,68 +153,11 @@ class ScreenManager {
|
|
|
153
153
|
if (!fs.existsSync(specPath)) {
|
|
154
154
|
fs.writeFileSync(specPath, this.generateSpecTemplate(options, screenName), 'utf-8');
|
|
155
155
|
}
|
|
156
|
-
// Generate requirements test-viewpoint.md (only on first screen creation)
|
|
156
|
+
// Generate requirements test-viewpoint.md (only on first screen creation): the QA template,
|
|
157
|
+
// samples inside comments, so an untouched file declares nothing (see viewpoint-scaffold.ts).
|
|
157
158
|
const viewpointPath = path.join(requirementsDir, 'test-viewpoint.md');
|
|
158
159
|
if (!fs.existsSync(viewpointPath)) {
|
|
159
|
-
fs.writeFileSync(viewpointPath,
|
|
160
|
-
`# ${options.name} — Test Viewpoints`,
|
|
161
|
-
'',
|
|
162
|
-
'## Edge Cases',
|
|
163
|
-
'',
|
|
164
|
-
'<!-- Sample — replace with actual edge cases for this screen:',
|
|
165
|
-
'- Paste emoji into text fields (e.g., 🎉👋) — should accept or sanitize?',
|
|
166
|
-
'- Input 10,000+ characters into free text — truncate or reject?',
|
|
167
|
-
'- Double-click Submit rapidly — should only create 1 record',
|
|
168
|
-
'- Browser back button after successful submit — should not re-submit',
|
|
169
|
-
'-->',
|
|
170
|
-
'',
|
|
171
|
-
'## Known Issues',
|
|
172
|
-
'',
|
|
173
|
-
'<!-- Sample — replace with actual known issues:',
|
|
174
|
-
'- [BUG-001] Date picker does not work on Safari < 16',
|
|
175
|
-
'- [BUG-002] File upload silently fails for files > 20MB (no error shown)',
|
|
176
|
-
'- Search does not handle Vietnamese accents correctly ("Nguyên" ≠ "Nguyen")',
|
|
177
|
-
'-->',
|
|
178
|
-
'',
|
|
179
|
-
'## Design Decisions',
|
|
180
|
-
'',
|
|
181
|
-
'<!-- Sample — replace with actual design decisions:',
|
|
182
|
-
'- Show all validation errors at once (not one at a time) — per UX review',
|
|
183
|
-
'- Cancel button resets form completely (no draft saving)',
|
|
184
|
-
'- Anonymous mode hides sender name but keeps department visible',
|
|
185
|
-
'-->',
|
|
186
|
-
'',
|
|
187
|
-
'## UI Patterns Identified',
|
|
188
|
-
'',
|
|
189
|
-
'<!-- Check applicable patterns for this screen (from sungen-viewpoint skill):',
|
|
190
|
-
'',
|
|
191
|
-
'| # | Pattern | Applicable? | Notes |',
|
|
192
|
-
'|---|---------|-------------|-------|',
|
|
193
|
-
'| 1 | Form & Inputs | ☐ | |',
|
|
194
|
-
'| 2 | Data Table | ☐ | |',
|
|
195
|
-
'| 3 | Create / Add | ☐ | |',
|
|
196
|
-
'| 4 | Update / Edit | ☐ | |',
|
|
197
|
-
'| 5 | Delete | ☐ | |',
|
|
198
|
-
'| 6 | Search | ☐ | |',
|
|
199
|
-
'| 7 | Filter | ☐ | |',
|
|
200
|
-
'| 8 | Pagination | ☐ | |',
|
|
201
|
-
'| 9 | Modal / Dialog | ☐ | |',
|
|
202
|
-
'| 10 | List / Card | ☐ | |',
|
|
203
|
-
'-->',
|
|
204
|
-
'',
|
|
205
|
-
'## Priority Viewpoints',
|
|
206
|
-
'',
|
|
207
|
-
'<!-- Rate importance for this screen (High / Medium / Low / Skip):',
|
|
208
|
-
'',
|
|
209
|
-
'| VP | Priority | Reason |',
|
|
210
|
-
'|---|----------|--------|',
|
|
211
|
-
'| VP-UI | High | Complex form with many states |',
|
|
212
|
-
'| VP-VAL | High | 14 validation rules from spec |',
|
|
213
|
-
'| VP-LOGIC | Medium | Standard CRUD, no complex business rules |',
|
|
214
|
-
'| VP-SEC | Low | Internal tool, basic auth only |',
|
|
215
|
-
'-->',
|
|
216
|
-
'',
|
|
217
|
-
].join('\n'), 'utf-8');
|
|
160
|
+
fs.writeFileSync(viewpointPath, (0, viewpoint_scaffold_1.viewpointScaffold)(options.name, isMobile), 'utf-8');
|
|
218
161
|
}
|
|
219
162
|
// Auto-screenshot: capture page only when --capture is set and not mobile (requires --path)
|
|
220
163
|
// Use filename (not screenName) so each feature gets its own screenshots
|
|
@@ -262,7 +205,10 @@ class ScreenManager {
|
|
|
262
205
|
console.log(`\n📸 Capturing screenshot: ${url}`);
|
|
263
206
|
let browser;
|
|
264
207
|
try {
|
|
265
|
-
|
|
208
|
+
// Loaded here, not at module top: @playwright/test is a peerDependency a mobile project never
|
|
209
|
+
// installs, and `sungen add` loads this module on every platform (#865).
|
|
210
|
+
const { chromium } = await Promise.resolve().then(() => __importStar(require('@playwright/test')));
|
|
211
|
+
browser = await chromium.launch();
|
|
266
212
|
const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
|
|
267
213
|
await page.goto(url, { waitUntil: 'networkidle', timeout: 15000 });
|
|
268
214
|
// Full-page screenshot
|