@qulib/core 0.7.0 → 0.9.0
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/README.md +30 -5
- package/bin/qulib.js +2 -3
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/orders/route.d.ts +7 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/orders/route.d.ts.map +1 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/orders/route.js +7 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/users/route.d.ts +10 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/users/route.d.ts.map +1 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/users/route.js +9 -0
- package/dist/__tests__/fixtures/api-fixture-repo/pages/api/health.d.ts +9 -0
- package/dist/__tests__/fixtures/api-fixture-repo/pages/api/health.d.ts.map +1 -0
- package/dist/__tests__/fixtures/api-fixture-repo/pages/api/health.js +10 -0
- package/dist/__tests__/playwright-available.d.ts +32 -0
- package/dist/__tests__/playwright-available.d.ts.map +1 -0
- package/dist/__tests__/playwright-available.js +35 -0
- package/dist/adapters/api-adapter.d.ts +26 -0
- package/dist/adapters/api-adapter.d.ts.map +1 -1
- package/dist/adapters/api-adapter.js +156 -2
- package/dist/adapters/ci-results-adapter.d.ts +67 -0
- package/dist/adapters/ci-results-adapter.d.ts.map +1 -0
- package/dist/adapters/ci-results-adapter.js +143 -0
- package/dist/adapters/cypress-e2e-adapter.d.ts.map +1 -1
- package/dist/adapters/cypress-e2e-adapter.js +25 -2
- package/dist/adapters/playwright-adapter.d.ts.map +1 -1
- package/dist/adapters/playwright-adapter.js +94 -2
- package/dist/adapters/pr-metadata-adapter.d.ts +75 -0
- package/dist/adapters/pr-metadata-adapter.d.ts.map +1 -0
- package/dist/adapters/pr-metadata-adapter.js +146 -0
- package/dist/adapters/validate-specs.d.ts +55 -0
- package/dist/adapters/validate-specs.d.ts.map +1 -0
- package/dist/adapters/validate-specs.js +67 -0
- package/dist/baseline/baseline.d.ts +54 -0
- package/dist/baseline/baseline.d.ts.map +1 -0
- package/dist/baseline/baseline.js +252 -0
- package/dist/baseline/baseline.schema.d.ts +233 -0
- package/dist/baseline/baseline.schema.d.ts.map +1 -0
- package/dist/baseline/baseline.schema.js +59 -0
- package/dist/cli/confidence-run.d.ts +16 -0
- package/dist/cli/confidence-run.d.ts.map +1 -0
- package/dist/cli/confidence-run.js +158 -0
- package/dist/cli/index.d.ts +11 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +80 -4
- package/dist/cli/scaffold-run.d.ts +86 -0
- package/dist/cli/scaffold-run.d.ts.map +1 -0
- package/dist/cli/scaffold-run.js +232 -0
- package/dist/cli/score-automation-run.d.ts +25 -0
- package/dist/cli/score-automation-run.d.ts.map +1 -0
- package/dist/cli/score-automation-run.js +123 -0
- package/dist/examples/notquality-dogfood/fixture.d.ts +166 -0
- package/dist/examples/notquality-dogfood/fixture.d.ts.map +1 -0
- package/dist/examples/notquality-dogfood/fixture.js +174 -0
- package/dist/examples/notquality-dogfood/run.d.ts +34 -0
- package/dist/examples/notquality-dogfood/run.d.ts.map +1 -0
- package/dist/examples/notquality-dogfood/run.js +139 -0
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/recipes/a11y.d.ts +36 -0
- package/dist/recipes/a11y.d.ts.map +1 -0
- package/dist/recipes/a11y.js +118 -0
- package/dist/recipes/auth.d.ts +38 -0
- package/dist/recipes/auth.d.ts.map +1 -0
- package/dist/recipes/auth.js +156 -0
- package/dist/recipes/index.d.ts +26 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +41 -0
- package/dist/recipes/nav.d.ts +34 -0
- package/dist/recipes/nav.d.ts.map +1 -0
- package/dist/recipes/nav.js +128 -0
- package/dist/recipes/seed.d.ts +34 -0
- package/dist/recipes/seed.d.ts.map +1 -0
- package/dist/recipes/seed.js +87 -0
- package/dist/scaffold-tests.d.ts +21 -0
- package/dist/scaffold-tests.d.ts.map +1 -1
- package/dist/scaffold-tests.js +12 -2
- package/dist/schemas/automation-maturity.schema.d.ts +8 -8
- package/dist/schemas/automation-maturity.schema.d.ts.map +1 -1
- package/dist/schemas/automation-maturity.schema.js +1 -0
- package/dist/schemas/confidence.schema.d.ts +526 -0
- package/dist/schemas/confidence.schema.d.ts.map +1 -0
- package/dist/schemas/confidence.schema.js +161 -0
- package/dist/schemas/gap-analysis.schema.d.ts +8 -8
- package/dist/schemas/gap-analysis.schema.js +1 -1
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +3 -0
- package/dist/schemas/public-surface.schema.d.ts +5 -5
- package/dist/schemas/recipe.schema.d.ts +66 -0
- package/dist/schemas/recipe.schema.d.ts.map +1 -0
- package/dist/schemas/recipe.schema.js +45 -0
- package/dist/schemas/repo-analysis.schema.d.ts +7 -7
- package/dist/schemas/views.schema.d.ts +234 -0
- package/dist/schemas/views.schema.d.ts.map +1 -0
- package/dist/schemas/views.schema.js +82 -0
- package/dist/tools/repo/api-surface.d.ts +59 -0
- package/dist/tools/repo/api-surface.d.ts.map +1 -0
- package/dist/tools/repo/api-surface.js +414 -0
- package/dist/tools/scoring/api-coverage.d.ts +74 -0
- package/dist/tools/scoring/api-coverage.d.ts.map +1 -0
- package/dist/tools/scoring/api-coverage.js +158 -0
- package/dist/tools/scoring/automation-maturity.d.ts +11 -1
- package/dist/tools/scoring/automation-maturity.d.ts.map +1 -1
- package/dist/tools/scoring/automation-maturity.js +43 -9
- package/dist/tools/scoring/confidence-from-qulib.d.ts +34 -0
- package/dist/tools/scoring/confidence-from-qulib.d.ts.map +1 -0
- package/dist/tools/scoring/confidence-from-qulib.js +206 -0
- package/dist/tools/scoring/confidence-views.d.ts +40 -0
- package/dist/tools/scoring/confidence-views.d.ts.map +1 -0
- package/dist/tools/scoring/confidence-views.js +163 -0
- package/dist/tools/scoring/confidence.d.ts +32 -0
- package/dist/tools/scoring/confidence.d.ts.map +1 -0
- package/dist/tools/scoring/confidence.js +180 -0
- package/dist/tools/scoring/levels.d.ts +15 -0
- package/dist/tools/scoring/levels.d.ts.map +1 -0
- package/dist/tools/scoring/levels.js +21 -0
- package/package.json +15 -7
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Confidence Aggregator — pure scorer.
|
|
3
|
+
*
|
|
4
|
+
* P3 — qulib Confidence Layer v1.
|
|
5
|
+
*
|
|
6
|
+
* Pure function: no I/O, no side effects. All I/O (CLI, MCP) lives in the wiring layer.
|
|
7
|
+
* Algorithm mirrors computeAutomationMaturity's denominator-renormalization math, generalized
|
|
8
|
+
* to operate over a heterogeneous evidence bundle.
|
|
9
|
+
*
|
|
10
|
+
* Score formula:
|
|
11
|
+
* confidenceScore = round( Σ score_i * weight_i / Σ weight_i )
|
|
12
|
+
* where i ∈ { applicable items with score !== null }
|
|
13
|
+
*
|
|
14
|
+
* Excluded from denominator: not_applicable | unknown | score === null items.
|
|
15
|
+
* Each excluded item is reported in contributions + narrated in honestyNotes.
|
|
16
|
+
*
|
|
17
|
+
* Verdict ladder (mirrors agent-summary.ts deriveGate, lifted to fused score):
|
|
18
|
+
* any blocking item → block
|
|
19
|
+
* confidenceScore === null → block (nothing evaluable; honesty floor)
|
|
20
|
+
* confidenceScore < failThreshold → hold
|
|
21
|
+
* unknown on a requiredSource OR
|
|
22
|
+
* confidenceScore < passThreshold → caution
|
|
23
|
+
* else → ship
|
|
24
|
+
*/
|
|
25
|
+
import { ReleaseConfidenceSchema, ConfidencePolicySchema } from '../../schemas/confidence.schema.js';
|
|
26
|
+
import { scoreLevel } from './levels.js';
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Default per-source weights (sum over the qulib-native set ≈ 0.90; renormalized at runtime)
|
|
29
|
+
// Rationale grounded in §2.4 of the P3 spec.
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
const DEFAULT_WEIGHTS = {
|
|
32
|
+
'live-app-quality': 0.30,
|
|
33
|
+
'test-automation': 0.22,
|
|
34
|
+
'api-coverage': 0.15,
|
|
35
|
+
'accessibility': 0.13,
|
|
36
|
+
'crawl-coverage': 0.10,
|
|
37
|
+
'ci-results': 0.10,
|
|
38
|
+
// External sources reserved for P4 — zero weight until wired:
|
|
39
|
+
'deploy-metadata': 0.0,
|
|
40
|
+
'error-telemetry': 0.0,
|
|
41
|
+
'feature-flags': 0.0,
|
|
42
|
+
'doc-health': 0.0,
|
|
43
|
+
'human-approval': 0.0,
|
|
44
|
+
'agent-evidence': 0.0,
|
|
45
|
+
};
|
|
46
|
+
function resolvePolicy(p) {
|
|
47
|
+
const base = ConfidencePolicySchema.parse(p ?? {});
|
|
48
|
+
return {
|
|
49
|
+
passThreshold: base.passThreshold,
|
|
50
|
+
failThreshold: base.failThreshold,
|
|
51
|
+
maxListLength: base.maxListLength,
|
|
52
|
+
requiredSources: base.requiredSources,
|
|
53
|
+
weights: base.weights,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function resolveWeight(item, policyWeights) {
|
|
57
|
+
if (policyWeights && item.source in policyWeights) {
|
|
58
|
+
return policyWeights[item.source];
|
|
59
|
+
}
|
|
60
|
+
return item.weight > 0 ? item.weight : (DEFAULT_WEIGHTS[item.source] ?? 0.10);
|
|
61
|
+
}
|
|
62
|
+
function buildHonestyNote(item) {
|
|
63
|
+
const base = `'${item.source}' source`;
|
|
64
|
+
if (item.applicability === 'not_applicable') {
|
|
65
|
+
return `${base} is not applicable${item.reason ? ': ' + item.reason : ' for this subject'}.`;
|
|
66
|
+
}
|
|
67
|
+
if (item.applicability === 'unknown') {
|
|
68
|
+
return `${base} could not produce a reliable score${item.reason ? ': ' + item.reason : ''}.`;
|
|
69
|
+
}
|
|
70
|
+
if (item.score === null) {
|
|
71
|
+
return `${base} ran but returned a null score${item.reason ? ': ' + item.reason : ''}.`;
|
|
72
|
+
}
|
|
73
|
+
return `${base} has partial or degraded signal.`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Compute the fused Release Confidence result from an evidence bundle.
|
|
77
|
+
*
|
|
78
|
+
* Pure function — deterministic over the same input.
|
|
79
|
+
*/
|
|
80
|
+
export function computeReleaseConfidence(input) {
|
|
81
|
+
const policy = resolvePolicy(input.policy);
|
|
82
|
+
const now = new Date().toISOString();
|
|
83
|
+
const limit = policy.maxListLength;
|
|
84
|
+
// Partition evidence into applicable (score !== null) vs excluded.
|
|
85
|
+
const applicable = input.evidence.filter((item) => (item.applicability ?? 'applicable') === 'applicable' &&
|
|
86
|
+
item.score !== null &&
|
|
87
|
+
!item.blocking);
|
|
88
|
+
const excluded = input.evidence.filter((item) => (item.applicability ?? 'applicable') !== 'applicable' ||
|
|
89
|
+
item.score === null);
|
|
90
|
+
// Blocking items are evaluated separately from the score.
|
|
91
|
+
const blockingItems = input.evidence.filter((item) => item.blocking);
|
|
92
|
+
// Compute weighted score over applicable set.
|
|
93
|
+
let confidenceScore = null;
|
|
94
|
+
const weightSum = applicable.reduce((s, item) => s + resolveWeight(item, policy.weights), 0);
|
|
95
|
+
if (weightSum > 0) {
|
|
96
|
+
const numerator = applicable.reduce((s, item) => s + (item.score ?? 0) * resolveWeight(item, policy.weights), 0);
|
|
97
|
+
confidenceScore = Math.round(numerator / weightSum);
|
|
98
|
+
}
|
|
99
|
+
// Build contributions (all evidence, not just applicable).
|
|
100
|
+
const contributions = input.evidence.map((item) => {
|
|
101
|
+
const w = resolveWeight(item, policy.weights);
|
|
102
|
+
const isApplicableNonNull = (item.applicability ?? 'applicable') === 'applicable' &&
|
|
103
|
+
item.score !== null &&
|
|
104
|
+
!item.blocking;
|
|
105
|
+
return {
|
|
106
|
+
source: item.source,
|
|
107
|
+
score: item.score,
|
|
108
|
+
weight: w,
|
|
109
|
+
effectiveWeight: isApplicableNonNull && weightSum > 0 ? w / weightSum : 0,
|
|
110
|
+
applicability: item.applicability ?? 'applicable',
|
|
111
|
+
blocking: item.blocking ?? false,
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
// Determine verdict.
|
|
115
|
+
let verdict = 'ship';
|
|
116
|
+
const blockers = [];
|
|
117
|
+
if (blockingItems.length > 0) {
|
|
118
|
+
verdict = 'block';
|
|
119
|
+
for (const b of blockingItems) {
|
|
120
|
+
blockers.push(`'${b.source}' is a hard blocker${b.reason ? ': ' + b.reason : ''}.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (confidenceScore === null) {
|
|
124
|
+
verdict = 'block';
|
|
125
|
+
blockers.push('No applicable evidence produced a score — nothing evaluable (honesty floor).');
|
|
126
|
+
}
|
|
127
|
+
else if (confidenceScore < policy.failThreshold) {
|
|
128
|
+
verdict = 'hold';
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Check if any required source is 'unknown'.
|
|
132
|
+
const unknownRequired = input.evidence.filter((item) => policy.requiredSources.includes(item.source) &&
|
|
133
|
+
(item.applicability ?? 'applicable') === 'unknown');
|
|
134
|
+
if (unknownRequired.length > 0 || confidenceScore < policy.passThreshold) {
|
|
135
|
+
verdict = 'caution';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Level / label from shared ladder.
|
|
139
|
+
const { level, label } = scoreLevel(confidenceScore ?? 0);
|
|
140
|
+
// Honesty notes — one per degraded/excluded source.
|
|
141
|
+
const honestyNotes = [];
|
|
142
|
+
for (const item of excluded) {
|
|
143
|
+
honestyNotes.push(buildHonestyNote(item));
|
|
144
|
+
}
|
|
145
|
+
// Also note any blocking items that aren't in the excluded set.
|
|
146
|
+
for (const item of blockingItems) {
|
|
147
|
+
if ((item.applicability ?? 'applicable') === 'applicable' && item.score !== null) {
|
|
148
|
+
honestyNotes.push(`'${item.source}' is a hard blocker${item.reason ? ': ' + item.reason : ''}.`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Top risks — merge evidence across sources, severity-sorted by position.
|
|
152
|
+
const allRisks = [
|
|
153
|
+
...blockingItems.flatMap((item) => item.evidence),
|
|
154
|
+
...input.evidence
|
|
155
|
+
.filter((item) => (item.applicability ?? 'applicable') === 'applicable')
|
|
156
|
+
.sort((a, b) => (a.score ?? 0) - (b.score ?? 0))
|
|
157
|
+
.flatMap((item) => item.evidence),
|
|
158
|
+
];
|
|
159
|
+
const topRisks = [...new Set(allRisks)].slice(0, limit);
|
|
160
|
+
// Recommended next checks — merge and deduplicate.
|
|
161
|
+
const allRecs = input.evidence.flatMap((item) => item.recommendations ?? []);
|
|
162
|
+
const recommendedNextChecks = [...new Set(allRecs)].slice(0, limit);
|
|
163
|
+
const result = {
|
|
164
|
+
schemaVersion: 1,
|
|
165
|
+
computedAt: now,
|
|
166
|
+
subject: input.subject,
|
|
167
|
+
confidenceScore,
|
|
168
|
+
verdict,
|
|
169
|
+
level,
|
|
170
|
+
label,
|
|
171
|
+
contributions,
|
|
172
|
+
topRisks,
|
|
173
|
+
recommendedNextChecks,
|
|
174
|
+
honestyNotes: honestyNotes.slice(0, limit),
|
|
175
|
+
blockers,
|
|
176
|
+
scoreFormula: 'confidenceScore = round( Σ (score * weight) / Σ weight ) for applicable, non-null, non-blocking evidence only. ' +
|
|
177
|
+
'not_applicable, unknown, and null-score items are excluded from the denominator but reported in contributions and honestyNotes.',
|
|
178
|
+
};
|
|
179
|
+
return ReleaseConfidenceSchema.parse(result);
|
|
180
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared score-to-level ladder used by qulib scorers.
|
|
3
|
+
*
|
|
4
|
+
* Used by `computeAutomationMaturity` and `computeReleaseConfidence` so
|
|
5
|
+
* the L1–L5 numeric bands are consistent across all qulib scorers.
|
|
6
|
+
* Each scorer can provide its own label suffix if needed; this function
|
|
7
|
+
* provides the canonical L1–L5 numeric thresholds and default labels.
|
|
8
|
+
*
|
|
9
|
+
* L1 < 20 | L2 < 40 | L3 < 60 | L4 < 80 | L5 ≥ 80
|
|
10
|
+
*/
|
|
11
|
+
export declare function scoreLevel(overall: number): {
|
|
12
|
+
level: number;
|
|
13
|
+
label: string;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=levels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.d.ts","sourceRoot":"","sources":["../../../src/tools/scoring/levels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM5E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared score-to-level ladder used by qulib scorers.
|
|
3
|
+
*
|
|
4
|
+
* Used by `computeAutomationMaturity` and `computeReleaseConfidence` so
|
|
5
|
+
* the L1–L5 numeric bands are consistent across all qulib scorers.
|
|
6
|
+
* Each scorer can provide its own label suffix if needed; this function
|
|
7
|
+
* provides the canonical L1–L5 numeric thresholds and default labels.
|
|
8
|
+
*
|
|
9
|
+
* L1 < 20 | L2 < 40 | L3 < 60 | L4 < 80 | L5 ≥ 80
|
|
10
|
+
*/
|
|
11
|
+
export function scoreLevel(overall) {
|
|
12
|
+
if (overall < 20)
|
|
13
|
+
return { level: 1, label: 'L1 — nascent automation' };
|
|
14
|
+
if (overall < 40)
|
|
15
|
+
return { level: 2, label: 'L2 — emerging coverage' };
|
|
16
|
+
if (overall < 60)
|
|
17
|
+
return { level: 3, label: 'L3 — building maturity' };
|
|
18
|
+
if (overall < 80)
|
|
19
|
+
return { level: 4, label: 'L4 — strong automation' };
|
|
20
|
+
return { level: 5, label: 'L5 — advanced QA automation' };
|
|
21
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qulib/core",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Qulib —
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "Qulib — release confidence for deployed web apps. Fuses live-app quality, automation maturity, and API coverage into a single ship/caution/hold/block verdict.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Tapesh Nagarwal",
|
|
7
7
|
"homepage": "https://github.com/TapeshN/qulib#readme",
|
|
@@ -14,11 +14,13 @@
|
|
|
14
14
|
"url": "https://github.com/TapeshN/qulib/issues"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
|
+
"release-confidence",
|
|
17
18
|
"qa",
|
|
18
19
|
"quality",
|
|
19
|
-
"
|
|
20
|
+
"ship-verdict",
|
|
21
|
+
"automation-maturity",
|
|
20
22
|
"gap-analysis",
|
|
21
|
-
"
|
|
23
|
+
"accessibility",
|
|
22
24
|
"playwright",
|
|
23
25
|
"mcp",
|
|
24
26
|
"ai"
|
|
@@ -48,8 +50,12 @@
|
|
|
48
50
|
"analyze": "tsx src/cli/index.ts analyze",
|
|
49
51
|
"clean": "tsx src/cli/index.ts clean",
|
|
50
52
|
"build": "tsc",
|
|
51
|
-
"
|
|
53
|
+
"prepack": "npm run build",
|
|
54
|
+
"prepublishOnly": "npm run build",
|
|
55
|
+
"test": "node --import tsx/esm --test src/llm/__tests__/cost-intelligence.test.ts src/llm/__tests__/context-builder.test.ts src/tools/scoring/__tests__/gaps.test.ts src/tools/auth/__tests__/gaps.test.ts src/tools/auth/__tests__/detect.test.ts src/tools/scoring/__tests__/automation-maturity.test.ts src/tools/scoring/__tests__/api-coverage.test.ts src/tools/scoring/__tests__/automation-maturity-with-api.test.ts src/harness/__tests__/state-manager.test.ts src/telemetry/__tests__/redact-url.test.ts src/cli/__tests__/auth-login.test.ts src/cli/__tests__/cli-version.test.ts src/cli/__tests__/bin-shim.test.ts src/cli/__tests__/score-automation.test.ts src/cli/__tests__/scaffold.test.ts src/__tests__/agent-summary.test.ts src/__tests__/cli-agent-summary.test.ts src/__tests__/analyze.storage-state-invalid.test.ts src/__tests__/analyze.fixtures.test.ts src/adapters/__tests__/playwright-adapter.test.ts src/adapters/__tests__/api-adapter.test.ts src/adapters/__tests__/ci-results-adapter.test.ts src/adapters/__tests__/pr-metadata-adapter.test.ts src/adapters/__tests__/validate-specs.test.ts src/tools/repo/__tests__/api-surface.test.ts src/baseline/__tests__/baseline.test.ts evals/runner/__tests__/runner.test.ts evals/judge/__tests__/judge.test.ts src/tools/scoring/__tests__/confidence.test.ts src/tools/scoring/__tests__/confidence-from-qulib.test.ts src/tools/scoring/__tests__/confidence-views.test.ts src/cli/__tests__/confidence.test.ts src/__tests__/notquality-dogfood.test.ts src/cli/__tests__/default-config-fallback.test.ts",
|
|
52
56
|
"test:integration": "node --import tsx/esm --test src/__tests__/analyze.integration.test.ts",
|
|
57
|
+
"eval": "node --import tsx/esm evals/runner/index.ts",
|
|
58
|
+
"eval:judge": "node --import tsx/esm evals/judge/eval-judge.ts",
|
|
53
59
|
"smoke": "tsx src/cli/index.ts analyze --url https://example.com --ephemeral",
|
|
54
60
|
"cost-doctor": "tsx src/cli/index.ts cost doctor"
|
|
55
61
|
},
|
|
@@ -58,11 +64,13 @@
|
|
|
58
64
|
"@playwright/test": "^1.44.0",
|
|
59
65
|
"commander": "^12.1.0",
|
|
60
66
|
"fast-glob": "^3.3.2",
|
|
67
|
+
"js-yaml": "^4.2.0",
|
|
68
|
+
"typescript": "^5.4.0",
|
|
61
69
|
"zod": "^3.23.0"
|
|
62
70
|
},
|
|
63
71
|
"devDependencies": {
|
|
72
|
+
"@types/js-yaml": "^4.0.9",
|
|
64
73
|
"@types/node": "^20.0.0",
|
|
65
|
-
"tsx": "^4.11.0"
|
|
66
|
-
"typescript": "^5.4.0"
|
|
74
|
+
"tsx": "^4.11.0"
|
|
67
75
|
}
|
|
68
76
|
}
|