@sun-asterisk/sungen 3.0.0-beta.75 → 3.0.0-beta.78
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.map +1 -1
- package/dist/cli/commands/audit.js +10 -0
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +30 -14
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/ingest.d.ts +3 -0
- package/dist/cli/commands/ingest.d.ts.map +1 -0
- package/dist/cli/commands/ingest.js +179 -0
- package/dist/cli/commands/ingest.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/templates/index.html +54 -54
- package/dist/harness/audit.d.ts +2 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +15 -4
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +6 -0
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +13 -0
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/spec-coverage.d.ts +37 -0
- package/dist/harness/spec-coverage.d.ts.map +1 -0
- package/dist/harness/spec-coverage.js +159 -0
- package/dist/harness/spec-coverage.js.map +1 -0
- package/dist/ingest/baseline-audit.d.ts +38 -0
- package/dist/ingest/baseline-audit.d.ts.map +1 -0
- package/dist/ingest/baseline-audit.js +85 -0
- package/dist/ingest/baseline-audit.js.map +1 -0
- package/dist/ingest/gsheet-fetch.d.ts +9 -0
- package/dist/ingest/gsheet-fetch.d.ts.map +1 -0
- package/dist/ingest/gsheet-fetch.js +180 -0
- package/dist/ingest/gsheet-fetch.js.map +1 -0
- package/dist/ingest/index.d.ts +6 -0
- package/dist/ingest/index.d.ts.map +1 -0
- package/dist/ingest/index.js +22 -0
- package/dist/ingest/index.js.map +1 -0
- package/dist/ingest/legacy-parser.d.ts +39 -0
- package/dist/ingest/legacy-parser.d.ts.map +1 -0
- package/dist/ingest/legacy-parser.js +218 -0
- package/dist/ingest/legacy-parser.js.map +1 -0
- package/dist/ingest/reconcile.d.ts +30 -0
- package/dist/ingest/reconcile.d.ts.map +1 -0
- package/dist/ingest/reconcile.js +65 -0
- package/dist/ingest/reconcile.js.map +1 -0
- package/dist/ingest/to-gherkin.d.ts +33 -0
- package/dist/ingest/to-gherkin.d.ts.map +1 -0
- package/dist/ingest/to-gherkin.js +93 -0
- package/dist/ingest/to-gherkin.js.map +1 -0
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +2 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +10 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +79 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +10 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +79 -0
- package/package.json +3 -3
- package/src/cli/commands/audit.ts +7 -0
- package/src/cli/commands/delivery.ts +31 -15
- package/src/cli/commands/ingest.ts +141 -0
- package/src/cli/index.ts +2 -0
- package/src/dashboard/templates/index.html +54 -54
- package/src/harness/audit.ts +17 -4
- package/src/harness/capability-plan.ts +11 -0
- package/src/harness/spec-coverage.ts +139 -0
- package/src/ingest/baseline-audit.ts +100 -0
- package/src/ingest/gsheet-fetch.ts +152 -0
- package/src/ingest/index.ts +5 -0
- package/src/ingest/legacy-parser.ts +184 -0
- package/src/ingest/reconcile.ts +80 -0
- package/src/ingest/to-gherkin.ts +108 -0
- package/src/orchestrator/ai-rules-updater.ts +2 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +10 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +79 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +10 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +79 -0
package/dist/harness/audit.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GateResult, DepthResult, BalanceResult, DuplicateResult, TraceResult, ClaimProofResult, TaxonomyResult } from './sensors';
|
|
2
2
|
import { IntentProfile } from './intent';
|
|
3
3
|
import { Provenance } from './provenance';
|
|
4
|
+
import { SpecCoverageResult } from './spec-coverage';
|
|
4
5
|
export interface AuditReport {
|
|
5
6
|
screen: string;
|
|
6
7
|
scenarioCount: number;
|
|
@@ -23,6 +24,7 @@ export interface AuditReport {
|
|
|
23
24
|
findings: string[];
|
|
24
25
|
intent: IntentProfile;
|
|
25
26
|
provenance: Provenance;
|
|
27
|
+
spec: SpecCoverageResult;
|
|
26
28
|
}
|
|
27
29
|
export declare function runAudit(screenDir: string, screenName: string): AuditReport;
|
|
28
30
|
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EACvG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAwC,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CA8F3E"}
|
package/dist/harness/audit.js
CHANGED
|
@@ -43,16 +43,21 @@ exports.runAudit = runAudit;
|
|
|
43
43
|
* docs/orchestration-spec.md §5 and reports/sungen_home_gherkin_viewpoint_coverage_review.md.
|
|
44
44
|
*/
|
|
45
45
|
const path = __importStar(require("path"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
46
47
|
const parse_1 = require("./parse");
|
|
47
48
|
const sensors_1 = require("./sensors");
|
|
48
49
|
const intent_1 = require("./intent");
|
|
49
50
|
const provenance_1 = require("./provenance");
|
|
51
|
+
const spec_coverage_1 = require("./spec-coverage");
|
|
50
52
|
function runAudit(screenDir, screenName) {
|
|
51
53
|
const featurePath = path.join(screenDir, 'features', `${screenName}.feature`);
|
|
52
54
|
const viewpointPath = path.join(screenDir, 'requirements', 'test-viewpoint.md');
|
|
55
|
+
const specPath = path.join(screenDir, 'requirements', 'spec.md');
|
|
56
|
+
const featureText = fs.existsSync(featurePath) ? fs.readFileSync(featurePath, 'utf-8') : '';
|
|
53
57
|
const scenarios = (0, parse_1.loadScenarios)(featurePath);
|
|
54
58
|
const viewpoints = (0, parse_1.parseViewpointOverview)(viewpointPath);
|
|
55
59
|
const catalog = (0, sensors_1.loadCatalog)();
|
|
60
|
+
const spec = (0, spec_coverage_1.specCoverage)(specPath, scenarios, featureText);
|
|
56
61
|
const gate = (0, sensors_1.viewpointGate)(scenarios, viewpoints, catalog);
|
|
57
62
|
// P3 — intent profile from qa/context.md drives the depth threshold (focus).
|
|
58
63
|
const intent = (0, intent_1.readIntent)((0, intent_1.projectRootFromScreenDir)(screenDir));
|
|
@@ -102,13 +107,19 @@ function runAudit(screenDir, screenName) {
|
|
|
102
107
|
if (gate.universalGaps.length) {
|
|
103
108
|
findings.push(`UNIVERSAL: missing theme(s): ${gate.universalGaps.join(', ')} (low priority reminder).`);
|
|
104
109
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
for (const g of spec.triggerGaps) {
|
|
111
|
+
findings.push(`TRIGGER-UNCOVERED: spec validates "${g.constraint}"${g.code ? ` (${g.code})` : ''} on [${g.required.join(', ')}] but scenarios only exercise it on [${g.found.join(', ') || 'none'}] → add a ${g.missing.join(', ')}-trigger scenario for this constraint (don't collapse the trigger × input matrix).`);
|
|
112
|
+
}
|
|
113
|
+
for (const u of spec.uncoveredMust) {
|
|
114
|
+
findings.push(`SPEC-UNCOVERED: ${u.id} (MUST) has no covering scenario — "${u.text}" → add a scenario or tag one @spec:${u.id}.`);
|
|
115
|
+
}
|
|
116
|
+
// Gate spans coverage (viewpoint themes), depth (data-correctness), claim-proof,
|
|
117
|
+
// AND spec-clause coverage (every MUST clause + every mandated validation trigger).
|
|
118
|
+
const gateStatus = gate.gaps.length === 0 && depth.verdict !== 'fail' && claim.verdict !== 'fail' && spec.verdict !== 'fail' ? 'PASS' : 'FAIL';
|
|
108
119
|
return {
|
|
109
120
|
screen: screenName,
|
|
110
121
|
scenarioCount: scenarios.length,
|
|
111
|
-
gate, depth, claim, taxonomy, balance, duplicates, trace,
|
|
122
|
+
gate, depth, claim, taxonomy, balance, duplicates, trace, spec,
|
|
112
123
|
score: {
|
|
113
124
|
overall: Math.round(overall * 10) / 10,
|
|
114
125
|
coverage: Math.round(coverage * 100) / 100,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,12 @@ export interface ReasonDef {
|
|
|
6
6
|
drivers: string[];
|
|
7
7
|
}
|
|
8
8
|
export declare const MANUAL_REASONS: Record<string, ReasonDef>;
|
|
9
|
+
/**
|
|
10
|
+
* Classify free text (e.g. a legacy testcase's precondition+steps+expected) into a
|
|
11
|
+
* manual-reason code, or '' when nothing matches (→ UI-automatable). Reuses the same
|
|
12
|
+
* INFER patterns as the scenario planner so legacy-ingest and the Gherkin planner agree.
|
|
13
|
+
*/
|
|
14
|
+
export declare function classifyReason(text: string): string;
|
|
9
15
|
interface ParsedScenario {
|
|
10
16
|
name: string;
|
|
11
17
|
tags: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-plan.d.ts","sourceRoot":"","sources":["../../src/harness/capability-plan.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AACzD,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;AAE/F,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAYpD,CAAC;AAkBF,UAAU,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAE1F,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CA4BpE;AAUD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAK1H;AAYD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACvG,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzC;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CA8D/E"}
|
|
1
|
+
{"version":3,"file":"capability-plan.d.ts","sourceRoot":"","sources":["../../src/harness/capability-plan.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AACzD,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;AAE/F,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAYpD,CAAC;AAkBF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,UAAU,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAE1F,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CA4BpE;AAUD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAK1H;AAYD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACvG,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzC;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CA8D/E"}
|
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.MANUAL_REASONS = void 0;
|
|
37
|
+
exports.classifyReason = classifyReason;
|
|
37
38
|
exports.parseScenarios = parseScenarios;
|
|
38
39
|
exports.inferReasonCode = inferReasonCode;
|
|
39
40
|
exports.buildPlan = buildPlan;
|
|
@@ -76,6 +77,18 @@ const INFER = [
|
|
|
76
77
|
{ code: 'M8', re: /\b(not worth|exploratory|one[-\s]?off)\b/i },
|
|
77
78
|
{ code: 'M9', re: /\b(judgment|human|subjective|manual review)\b/i },
|
|
78
79
|
];
|
|
80
|
+
/**
|
|
81
|
+
* Classify free text (e.g. a legacy testcase's precondition+steps+expected) into a
|
|
82
|
+
* manual-reason code, or '' when nothing matches (→ UI-automatable). Reuses the same
|
|
83
|
+
* INFER patterns as the scenario planner so legacy-ingest and the Gherkin planner agree.
|
|
84
|
+
*/
|
|
85
|
+
function classifyReason(text) {
|
|
86
|
+
const t = (text || '').toLowerCase();
|
|
87
|
+
for (const { code, re } of INFER)
|
|
88
|
+
if (re.test(t))
|
|
89
|
+
return code;
|
|
90
|
+
return '';
|
|
91
|
+
}
|
|
79
92
|
/** Parse scenarios with their tags + the reason comment line above (for @manual). */
|
|
80
93
|
function parseScenarios(featurePath) {
|
|
81
94
|
if (!fs.existsSync(featurePath))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-plan.js","sourceRoot":"","sources":["../../src/harness/capability-plan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"capability-plan.js","sourceRoot":"","sources":["../../src/harness/capability-plan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,wCAIC;AAKD,wCA4BC;AAUD,0CAKC;AA0BD,8BA8DC;AA9LD;;;;;;;GAOG;AACH,uCAAyB;AACzB,2CAA6B;AAC7B,6CAAiD;AAKpC,QAAA,cAAc,GAA8B;IACvD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAa,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE;IACxG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAO,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;IACrG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,8BAA8B,EAAG,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE;IAChG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,iCAAiC,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,8BAA8B;IAC5H,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAY,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE;IACjH,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAW,GAAG,EAAE,MAAM,EAAQ,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE;IACvG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAwB,EAAS,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,yBAAyB;IACrH,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAW,GAAG,EAAE,MAAM,EAAQ,OAAO,EAAE,EAAE,EAAE;IAC1F,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAY,GAAG,EAAE,MAAM,EAAQ,OAAO,EAAE,EAAE,EAAE;IAC1F,0FAA0F;IAC1F,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,EAAE,GAAG,EAAE,MAAM,EAAK,OAAO,EAAE,EAAE,EAAE;CAC3F,CAAC;AAEF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,KAAK,GAAmC;IAC5C,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,kEAAkE,EAAE;IACtF,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,kDAAkD,EAAE;IACtE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,yDAAyD,EAAE;IAC7E,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,kEAAkE,EAAE;IACtF,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,mIAAmI,EAAE;IACvJ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,sFAAsF,EAAE;IAC1G,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,wFAAwF,EAAE;IAC5G,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,2DAA2D,EAAE;IAC/E,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,2CAA2C,EAAE;IAC/D,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,gDAAgD,EAAE;CACrE,CAAC;AAEF;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK;QAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,EAAE,CAAC;AACZ,CAAC;AAID,qFAAqF;AACrF,SAAgB,cAAc,CAAC,WAAmB;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,gFAAgF;QAChF,+EAA+E;QAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE;gBAAE,MAAM;YACpB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC9E,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAAC,CAAC;;gBACpE,MAAM;QACb,CAAC;QACD,6EAA6E;QAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;iBACtE,IAAI,CAAC,KAAK,EAAE;gBAAE,SAAS;;gBACvB,MAAM,CAAC,qBAAqB;QACnC,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,eAAe,CAAC,IAAc,EAAE,MAAc;IAC5D,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC5G,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,IAAI,GAAG,CAAC,qBAAqB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,GAAG,CAAC,oBAAoB,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAgBD,SAAgB,SAAS,CAAC,SAAiB,EAAE,UAAkB;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,UAAU,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAA,8BAAiB,GAAE,CAAC;IAEpC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAmC,EAAE,CAAC;IACxD,mCAAmC;IACnC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC/E,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,IAAI,gBAAgB,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC;IAE9D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QAEhC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG;YAAE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,qBAAqB,EAAE,CAAC,CAAC;QAExF,MAAM,GAAG,GAAG,sBAAc,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;YACvB,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,GAAG,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;YACpC,gBAAgB,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;gBAClE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC3B,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrB,MAAM;QACN,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,kBAAkB,MAAM,EAAE;QAC3D,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM;QACzB,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,KAAK;QACL,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,cAAc;QACd,WAAW;QACX,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,eAAe;QACf,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;KAC5G,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ScenarioInfo } from './parse';
|
|
2
|
+
export type Modality = 'MUST' | 'SHOULD' | 'MAY';
|
|
3
|
+
export interface TriggerGap {
|
|
4
|
+
constraint: string;
|
|
5
|
+
code: string;
|
|
6
|
+
required: string[];
|
|
7
|
+
found: string[];
|
|
8
|
+
missing: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface SpecCoverageResult {
|
|
11
|
+
hasSpec: boolean;
|
|
12
|
+
frTotal: number;
|
|
13
|
+
frCovered: number;
|
|
14
|
+
uncoveredMust: {
|
|
15
|
+
id: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
triggerGaps: TriggerGap[];
|
|
19
|
+
verdict: 'pass' | 'warn' | 'fail';
|
|
20
|
+
}
|
|
21
|
+
interface FrClause {
|
|
22
|
+
id: string;
|
|
23
|
+
text: string;
|
|
24
|
+
modality: Modality;
|
|
25
|
+
}
|
|
26
|
+
interface ValRow {
|
|
27
|
+
constraint: string;
|
|
28
|
+
code: string;
|
|
29
|
+
triggers: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare function parseSpecClauses(specPath: string): {
|
|
32
|
+
frs: FrClause[];
|
|
33
|
+
valRows: ValRow[];
|
|
34
|
+
};
|
|
35
|
+
export declare function specCoverage(specPath: string, scenarios: ScenarioInfo[], featureText: string): SpecCoverageResult;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=spec-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-coverage.d.ts","sourceRoot":"","sources":["../../src/harness/spec-coverage.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEjD,MAAM,WAAW,UAAU;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;AAExH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACnC;AAED,UAAU,QAAQ;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE;AACnE,UAAU,MAAM;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE;AA2BzE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmCzF;AAOD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CA0CjH"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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.parseSpecClauses = parseSpecClauses;
|
|
37
|
+
exports.specCoverage = specCoverage;
|
|
38
|
+
/**
|
|
39
|
+
* Spec-clause coverage (harness G2) — the spec-layer faithfulness check.
|
|
40
|
+
*
|
|
41
|
+
* Parses the structured parts of a screen `spec.md` (Functional Requirements + the
|
|
42
|
+
* Validation Rules table) and verifies (a) every MUST FR is covered by a scenario and
|
|
43
|
+
* (b) for EACH validation constraint, every trigger the spec mandates is actually
|
|
44
|
+
* exercised. The trigger check is PER-CONSTRAINT — so "validate format on blur AND on
|
|
45
|
+
* submit" tested only on blur is caught even when other constraints do use submit.
|
|
46
|
+
* Generic: no project data.
|
|
47
|
+
*/
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
// Parsing the spec's Trigger CELL: loose word match ("blur, submit").
|
|
50
|
+
const SPEC_TRIGGER = [
|
|
51
|
+
{ trigger: 'blur', re: /\b(blur|on blur|focus[- ]?out)\b/i },
|
|
52
|
+
{ trigger: 'submit', re: /\b(submit|on submit)\b/i },
|
|
53
|
+
];
|
|
54
|
+
// Detecting the trigger ACTION in a scenario: must be an actual action, NOT the word
|
|
55
|
+
// "submit" in a "[Submit] button is disabled" assertion.
|
|
56
|
+
const ACTION_TRIGGER = [
|
|
57
|
+
{ trigger: 'blur', re: /\b(press tab|blur|focus[- ]?out|loses? focus|tab away|tab out)\b/i },
|
|
58
|
+
{ trigger: 'submit', re: /(click \[submit\]|press enter|\benter key\b|送信する)/i },
|
|
59
|
+
];
|
|
60
|
+
function modalityOf(text) {
|
|
61
|
+
if (/\bMUST\b/.test(text))
|
|
62
|
+
return 'MUST';
|
|
63
|
+
if (/\bSHOULD\b/.test(text))
|
|
64
|
+
return 'SHOULD';
|
|
65
|
+
return 'MAY';
|
|
66
|
+
}
|
|
67
|
+
function specTriggersIn(text) {
|
|
68
|
+
return SPEC_TRIGGER.filter((t) => t.re.test(text)).map((t) => t.trigger);
|
|
69
|
+
}
|
|
70
|
+
function actionTriggersIn(text) {
|
|
71
|
+
return ACTION_TRIGGER.filter((t) => t.re.test(text)).map((t) => t.trigger);
|
|
72
|
+
}
|
|
73
|
+
function parseSpecClauses(specPath) {
|
|
74
|
+
if (!fs.existsSync(specPath))
|
|
75
|
+
return { frs: [], valRows: [] };
|
|
76
|
+
const lines = fs.readFileSync(specPath, 'utf-8').split('\n');
|
|
77
|
+
const frs = [];
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
const m = line.match(/\*\*FR-(\d+)\*\*\s*:\s*(.+)$/);
|
|
80
|
+
if (m)
|
|
81
|
+
frs.push({ id: `FR-${m[1]}`, text: m[2].replace(/\*\*/g, '').trim(), modality: modalityOf(m[2]) });
|
|
82
|
+
}
|
|
83
|
+
// Validation Rules table: a row carries a Constraint, a Trigger cell, and (often) a code.
|
|
84
|
+
const valRows = [];
|
|
85
|
+
let cTrigger = -1, cConstraint = -1, cCode = -1, inTable = false;
|
|
86
|
+
for (const raw of lines) {
|
|
87
|
+
const line = raw.trim();
|
|
88
|
+
if (line.startsWith('|') && /\btrigger\b/i.test(line) && cTrigger < 0) {
|
|
89
|
+
const cells = line.split('|').map((c) => c.trim());
|
|
90
|
+
cTrigger = cells.findIndex((c) => /^trigger$/i.test(c));
|
|
91
|
+
cConstraint = cells.findIndex((c) => /constraint/i.test(c));
|
|
92
|
+
cCode = cells.findIndex((c) => /code/i.test(c));
|
|
93
|
+
inTable = cTrigger >= 0;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (inTable) {
|
|
97
|
+
if (!line.startsWith('|')) {
|
|
98
|
+
inTable = false;
|
|
99
|
+
cTrigger = -1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (/^\|[\s|:-]+\|?$/.test(line))
|
|
103
|
+
continue;
|
|
104
|
+
const cells = line.split('|').map((c) => c.trim());
|
|
105
|
+
const triggers = [...new Set((cells[cTrigger] || '').split(/,|\band\b/i).flatMap((p) => specTriggersIn(p)))];
|
|
106
|
+
if (!triggers.length)
|
|
107
|
+
continue; // server-only rows etc.
|
|
108
|
+
const constraint = (cConstraint >= 0 ? cells[cConstraint] : '').replace(/`/g, '') || 'validation';
|
|
109
|
+
const codeM = (cCode >= 0 ? cells[cCode] : line).match(/M\d+/);
|
|
110
|
+
valRows.push({ constraint, code: codeM ? codeM[0] : '', triggers });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { frs, valRows };
|
|
114
|
+
}
|
|
115
|
+
/** Split a feature file into per-scenario blocks (tags + comments + steps), keyed by blank lines. */
|
|
116
|
+
function scenarioBlocks(featureText) {
|
|
117
|
+
return featureText.split(/\n\s*\n/).filter((b) => /\bScenario:/.test(b)).map((b) => b.toLowerCase());
|
|
118
|
+
}
|
|
119
|
+
function specCoverage(specPath, scenarios, featureText) {
|
|
120
|
+
const { frs, valRows } = parseSpecClauses(specPath);
|
|
121
|
+
if (!fs.existsSync(specPath) || (frs.length === 0 && valRows.length === 0)) {
|
|
122
|
+
return { hasSpec: fs.existsSync(specPath), frTotal: 0, frCovered: 0, uncoveredMust: [], triggerGaps: [], verdict: 'pass' };
|
|
123
|
+
}
|
|
124
|
+
const featLower = featureText.toLowerCase();
|
|
125
|
+
// FR coverage: explicit @spec:FR / literal FR-id citation, else keyword fallback.
|
|
126
|
+
const uncoveredMust = [];
|
|
127
|
+
let frCovered = 0;
|
|
128
|
+
for (const fr of frs) {
|
|
129
|
+
const idLower = fr.id.toLowerCase();
|
|
130
|
+
const cited = featLower.includes(idLower);
|
|
131
|
+
const words = [...new Set((fr.text.toLowerCase().match(/[a-z][a-z-]{4,}/g) || []))]
|
|
132
|
+
.filter((w) => !/must|should|system|screen|users?|value|input|field/.test(w));
|
|
133
|
+
const kwHit = words.length > 0 && scenarios.some((s) => words.filter((w) => s.haystack.includes(w)).length >= Math.min(2, words.length));
|
|
134
|
+
if (cited || kwHit)
|
|
135
|
+
frCovered++;
|
|
136
|
+
else if (fr.modality === 'MUST')
|
|
137
|
+
uncoveredMust.push({ id: fr.id, text: fr.text.slice(0, 90) });
|
|
138
|
+
}
|
|
139
|
+
// Per-constraint trigger coverage — the matrix-collapse catch.
|
|
140
|
+
// generic words that don't identify a constraint (would over-match happy-path scenarios)
|
|
141
|
+
const GENERIC = new Set(['valid', 'local', 'part', 'domain', 'email', 'address', 'must', 'exist', 'store', 'field', 'input', 'value', 'formed', 'well', 'character', 'characters']);
|
|
142
|
+
const blocks = scenarioBlocks(featureText);
|
|
143
|
+
const triggerGaps = [];
|
|
144
|
+
for (const row of valRows) {
|
|
145
|
+
const kw = (row.constraint.toLowerCase().match(/[a-z]{4,}/g) || []).filter((w) => !GENERIC.has(w));
|
|
146
|
+
// blocks that belong to this constraint: cite its msg code (primary), or mention a
|
|
147
|
+
// DISTINCTIVE constraint word (generic words filtered to avoid matching happy paths).
|
|
148
|
+
const own = blocks.filter((b) => (row.code && b.includes(row.code.toLowerCase())) || kw.some((w) => b.includes(w)));
|
|
149
|
+
if (!own.length)
|
|
150
|
+
continue; // constraint has no scenarios at all — FR/viewpoint gate covers that
|
|
151
|
+
const found = [...new Set(own.flatMap((b) => actionTriggersIn(b)))];
|
|
152
|
+
const missing = row.triggers.filter((t) => !found.includes(t));
|
|
153
|
+
if (missing.length)
|
|
154
|
+
triggerGaps.push({ constraint: row.constraint, code: row.code, required: row.triggers, found, missing });
|
|
155
|
+
}
|
|
156
|
+
const verdict = uncoveredMust.length > 0 || triggerGaps.length > 0 ? 'fail' : 'pass';
|
|
157
|
+
return { hasSpec: true, frTotal: frs.length, frCovered, uncoveredMust, triggerGaps, verdict };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=spec-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-coverage.js","sourceRoot":"","sources":["../../src/harness/spec-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA baseline audit over a legacy testcase inventory (P-A). Reuses the harness
|
|
3
|
+
* duplicate sensor + the capability-plan reason classifier so the legacy view and
|
|
4
|
+
* the Gherkin view agree. Advisory — evaluates the *existing* manual suite and the
|
|
5
|
+
* automation/driver opportunity; it does not gate anything.
|
|
6
|
+
*/
|
|
7
|
+
import { LegacyInventory, LegacyTestcase } from './legacy-parser';
|
|
8
|
+
import { ScenarioInfo } from '../harness/parse';
|
|
9
|
+
export interface BaselineReport {
|
|
10
|
+
total: number;
|
|
11
|
+
sheets: {
|
|
12
|
+
name: string;
|
|
13
|
+
type: string;
|
|
14
|
+
rows: number;
|
|
15
|
+
}[];
|
|
16
|
+
byCategory: Record<string, number>;
|
|
17
|
+
byPriority: Record<string, number>;
|
|
18
|
+
byResult: Record<string, number>;
|
|
19
|
+
depthRatio: number;
|
|
20
|
+
deepCount: number;
|
|
21
|
+
duplicateClusters: number;
|
|
22
|
+
exactDuplicates: number;
|
|
23
|
+
reasons: {
|
|
24
|
+
ui: number;
|
|
25
|
+
crossScreen: number;
|
|
26
|
+
capabilityManual: number;
|
|
27
|
+
keepManual: number;
|
|
28
|
+
byCode: Record<string, number>;
|
|
29
|
+
driverCandidates: {
|
|
30
|
+
driver: string;
|
|
31
|
+
count: number;
|
|
32
|
+
}[];
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Synthesize a ScenarioInfo-lite so we can reuse harness sensors on the inventory. */
|
|
36
|
+
export declare function legacyToScenarioInfo(tc: LegacyTestcase): ScenarioInfo;
|
|
37
|
+
export declare function baselineAudit(inv: LegacyInventory): BaselineReport;
|
|
38
|
+
//# sourceMappingURL=baseline-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline-audit.d.ts","sourceRoot":"","sources":["../../src/ingest/baseline-audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAC9E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,gBAAgB,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACvD,CAAC;CACH;AAWD,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,YAAY,CAgBrE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,CA2ClE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.legacyToScenarioInfo = legacyToScenarioInfo;
|
|
4
|
+
exports.baselineAudit = baselineAudit;
|
|
5
|
+
const sensors_1 = require("../harness/sensors");
|
|
6
|
+
const capability_plan_1 = require("../harness/capability-plan");
|
|
7
|
+
/** An Expected that asserts a concrete value (not just "displayed/visible"). */
|
|
8
|
+
function isDeep(tc) {
|
|
9
|
+
const e = (tc.expected || '').trim().toLowerCase();
|
|
10
|
+
if (!e)
|
|
11
|
+
return false;
|
|
12
|
+
const shallowOnly = /^(.{0,40})(表示される|hiển thị|displayed|shown|is visible|表示)$/.test(e);
|
|
13
|
+
const hasValue = /(=|equals?|bằng|giá trị|\bvalue\b|"|「|\bmessage\b|エラー|error|\bcount\b|số lượng|\bformat\b|định dạng)/.test(e);
|
|
14
|
+
return hasValue || (!shallowOnly && e.length > 30);
|
|
15
|
+
}
|
|
16
|
+
/** Synthesize a ScenarioInfo-lite so we can reuse harness sensors on the inventory. */
|
|
17
|
+
function legacyToScenarioInfo(tc) {
|
|
18
|
+
const skeleton = (tc.steps || '')
|
|
19
|
+
.replace(/\{\{[^}]*\}\}/g, '{}').replace(/"[^"]*"/g, '""')
|
|
20
|
+
.replace(/\d+/g, 'N').replace(/\s+/g, ' ').trim().toLowerCase();
|
|
21
|
+
const hay = `${tc.category} ${tc.steps} ${tc.expected}`.toLowerCase();
|
|
22
|
+
return {
|
|
23
|
+
name: `${tc.category}: ${tc.id}`,
|
|
24
|
+
category: (tc.category || '').toUpperCase().replace(/[^A-Z0-9]+/g, '-').slice(0, 16),
|
|
25
|
+
priority: tc.priority,
|
|
26
|
+
manual: true,
|
|
27
|
+
thenCount: tc.expected ? 1 : 0,
|
|
28
|
+
hasDataAssertion: isDeep(tc),
|
|
29
|
+
shallow: !isDeep(tc),
|
|
30
|
+
stepSkeleton: skeleton,
|
|
31
|
+
haystack: hay,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function baselineAudit(inv) {
|
|
35
|
+
const tcs = inv.testcases;
|
|
36
|
+
const inc = (m, k) => { m[k] = (m[k] || 0) + 1; };
|
|
37
|
+
const byCategory = {};
|
|
38
|
+
const byPriority = {};
|
|
39
|
+
const byResult = {};
|
|
40
|
+
let deepCount = 0;
|
|
41
|
+
const byCode = {};
|
|
42
|
+
let ui = 0, crossScreen = 0, capabilityManual = 0, keepManual = 0;
|
|
43
|
+
const driverHits = {};
|
|
44
|
+
for (const tc of tcs) {
|
|
45
|
+
inc(byCategory, tc.category || '(uncategorized)');
|
|
46
|
+
inc(byPriority, tc.priority);
|
|
47
|
+
inc(byResult, (tc.result || '(not-run)').trim() || '(not-run)');
|
|
48
|
+
if (isDeep(tc))
|
|
49
|
+
deepCount++;
|
|
50
|
+
const code = (0, capability_plan_1.classifyReason)(`${tc.precondition || ''} ${tc.steps} ${tc.expected} ${tc.testData || ''}`);
|
|
51
|
+
if (!code) {
|
|
52
|
+
ui++;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
inc(byCode, code);
|
|
56
|
+
if (code === 'XS') {
|
|
57
|
+
crossScreen++;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const def = capability_plan_1.MANUAL_REASONS[code];
|
|
61
|
+
if (def?.cls === 'keep')
|
|
62
|
+
keepManual++;
|
|
63
|
+
else {
|
|
64
|
+
capabilityManual++;
|
|
65
|
+
for (const d of def?.drivers || [])
|
|
66
|
+
driverHits[d] = (driverHits[d] || 0) + 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const dup = (0, sensors_1.duplicateClusters)(tcs.map(legacyToScenarioInfo));
|
|
70
|
+
return {
|
|
71
|
+
total: tcs.length,
|
|
72
|
+
sheets: inv.sheets,
|
|
73
|
+
byCategory, byPriority, byResult,
|
|
74
|
+
depthRatio: tcs.length ? deepCount / tcs.length : 0,
|
|
75
|
+
deepCount,
|
|
76
|
+
duplicateClusters: dup.clusters.length,
|
|
77
|
+
exactDuplicates: dup.exactDuplicateCount,
|
|
78
|
+
reasons: {
|
|
79
|
+
ui, crossScreen, capabilityManual, keepManual, byCode,
|
|
80
|
+
driverCandidates: Object.entries(driverHits).map(([driver, count]) => ({ driver, count }))
|
|
81
|
+
.sort((a, b) => b.count - a.count),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=baseline-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline-audit.js","sourceRoot":"","sources":["../../src/ingest/baseline-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RawSheet } from './legacy-parser';
|
|
2
|
+
export interface SheetBundle {
|
|
3
|
+
source: string;
|
|
4
|
+
sheets: RawSheet[];
|
|
5
|
+
}
|
|
6
|
+
/** Accept a full Sheets URL or a bare spreadsheet ID. */
|
|
7
|
+
export declare function parseSpreadsheetId(idOrUrl: string): string;
|
|
8
|
+
export declare function fetchGoogleSheet(idOrUrl: string): Promise<SheetBundle>;
|
|
9
|
+
//# sourceMappingURL=gsheet-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsheet-fetch.d.ts","sourceRoot":"","sources":["../../src/ingest/gsheet-fetch.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,WAAW,WAAW;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;CAAE;AAInE,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG1D;AAiED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+D5E"}
|