@yasserkhanorg/e2e-agents 1.2.2 → 1.3.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/dist/agent/feedback.d.ts +20 -0
- package/dist/agent/feedback.d.ts.map +1 -1
- package/dist/agent/feedback.js +4 -0
- package/dist/esm/agent/feedback.js +3 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/qa-agent/cli.js +205 -0
- package/dist/esm/qa-agent/orchestrator.js +120 -0
- package/dist/esm/qa-agent/phase1/runner.js +139 -0
- package/dist/esm/qa-agent/phase1/scope.js +126 -0
- package/dist/esm/qa-agent/phase2/agent_browser.js +95 -0
- package/dist/esm/qa-agent/phase2/agent_loop.js +315 -0
- package/dist/esm/qa-agent/phase2/exploration_state.js +76 -0
- package/dist/esm/qa-agent/phase2/tools.js +288 -0
- package/dist/esm/qa-agent/phase2/vision.js +75 -0
- package/dist/esm/qa-agent/phase3/feedback.js +34 -0
- package/dist/esm/qa-agent/phase3/reporter.js +118 -0
- package/dist/esm/qa-agent/phase3/spec_generator.js +62 -0
- package/dist/esm/qa-agent/phase3/verdict.js +66 -0
- package/dist/esm/qa-agent/safe_env.js +23 -0
- package/dist/esm/qa-agent/types.js +3 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/qa-agent/cli.d.ts +3 -0
- package/dist/qa-agent/cli.d.ts.map +1 -0
- package/dist/qa-agent/cli.js +207 -0
- package/dist/qa-agent/orchestrator.d.ts +3 -0
- package/dist/qa-agent/orchestrator.d.ts.map +1 -0
- package/dist/qa-agent/orchestrator.js +123 -0
- package/dist/qa-agent/phase1/runner.d.ts +3 -0
- package/dist/qa-agent/phase1/runner.d.ts.map +1 -0
- package/dist/qa-agent/phase1/runner.js +142 -0
- package/dist/qa-agent/phase1/scope.d.ts +6 -0
- package/dist/qa-agent/phase1/scope.d.ts.map +1 -0
- package/dist/qa-agent/phase1/scope.js +129 -0
- package/dist/qa-agent/phase2/agent_browser.d.ts +35 -0
- package/dist/qa-agent/phase2/agent_browser.d.ts.map +1 -0
- package/dist/qa-agent/phase2/agent_browser.js +99 -0
- package/dist/qa-agent/phase2/agent_loop.d.ts +3 -0
- package/dist/qa-agent/phase2/agent_loop.d.ts.map +1 -0
- package/dist/qa-agent/phase2/agent_loop.js +321 -0
- package/dist/qa-agent/phase2/exploration_state.d.ts +12 -0
- package/dist/qa-agent/phase2/exploration_state.d.ts.map +1 -0
- package/dist/qa-agent/phase2/exploration_state.js +88 -0
- package/dist/qa-agent/phase2/tools.d.ts +28 -0
- package/dist/qa-agent/phase2/tools.d.ts.map +1 -0
- package/dist/qa-agent/phase2/tools.js +292 -0
- package/dist/qa-agent/phase2/vision.d.ts +3 -0
- package/dist/qa-agent/phase2/vision.d.ts.map +1 -0
- package/dist/qa-agent/phase2/vision.js +78 -0
- package/dist/qa-agent/phase3/feedback.d.ts +3 -0
- package/dist/qa-agent/phase3/feedback.d.ts.map +1 -0
- package/dist/qa-agent/phase3/feedback.js +37 -0
- package/dist/qa-agent/phase3/reporter.d.ts +3 -0
- package/dist/qa-agent/phase3/reporter.d.ts.map +1 -0
- package/dist/qa-agent/phase3/reporter.js +121 -0
- package/dist/qa-agent/phase3/spec_generator.d.ts +3 -0
- package/dist/qa-agent/phase3/spec_generator.d.ts.map +1 -0
- package/dist/qa-agent/phase3/spec_generator.js +65 -0
- package/dist/qa-agent/phase3/verdict.d.ts +3 -0
- package/dist/qa-agent/phase3/verdict.d.ts.map +1 -0
- package/dist/qa-agent/phase3/verdict.js +69 -0
- package/dist/qa-agent/safe_env.d.ts +3 -0
- package/dist/qa-agent/safe_env.d.ts.map +1 -0
- package/dist/qa-agent/safe_env.js +26 -0
- package/dist/qa-agent/types.d.ts +122 -0
- package/dist/qa-agent/types.d.ts.map +1 -0
- package/dist/qa-agent/types.js +4 -0
- package/package.json +12 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec_generator.d.ts","sourceRoot":"","sources":["../../../src/qa-agent/phase3/spec_generator.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,aAAa,CAAC;AAUnD,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,QAAQ,GACjB,MAAM,EAAE,CAiEV"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.generateSpecsForFindings = generateSpecsForFindings;
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const logger_js_1 = require("../../logger.js");
|
|
10
|
+
const safe_env_js_1 = require("../safe_env.js");
|
|
11
|
+
function generateSpecsForFindings(findings, config) {
|
|
12
|
+
// Only generate specs for bugs and gaps (not visual/UX issues)
|
|
13
|
+
const actionable = findings.filter((f) => f.type === 'bug' || f.type === 'gap');
|
|
14
|
+
if (actionable.length === 0) {
|
|
15
|
+
logger_js_1.logger.info('No actionable findings for spec generation');
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
const scenarios = actionable.map((f) => ({
|
|
19
|
+
title: `Verify: ${f.summary}`,
|
|
20
|
+
flow: f.flow,
|
|
21
|
+
steps: f.evidence.reproSteps,
|
|
22
|
+
expected: `The issue "${f.summary}" should not occur`,
|
|
23
|
+
priority: f.severity === 'critical' || f.severity === 'high' ? 'P0' : 'P1',
|
|
24
|
+
}));
|
|
25
|
+
// Write scenarios to a temp file
|
|
26
|
+
const outputDir = config.outputDir || '.e2e-ai-agents';
|
|
27
|
+
(0, fs_1.mkdirSync)(outputDir, { recursive: true });
|
|
28
|
+
const scenariosPath = (0, path_1.join)(outputDir, 'qa-findings-scenarios.json');
|
|
29
|
+
(0, fs_1.writeFileSync)(scenariosPath, JSON.stringify(scenarios, null, 2), 'utf-8');
|
|
30
|
+
// Call e2e-ai-agents generate with the scenarios
|
|
31
|
+
const args = [
|
|
32
|
+
'e2e-ai-agents', 'generate',
|
|
33
|
+
'--scenarios', scenariosPath,
|
|
34
|
+
];
|
|
35
|
+
if (config.testsRoot) {
|
|
36
|
+
args.push('--tests-root', config.testsRoot);
|
|
37
|
+
}
|
|
38
|
+
if (config.baseUrl) {
|
|
39
|
+
args.push('--pipeline-base-url', config.baseUrl);
|
|
40
|
+
}
|
|
41
|
+
logger_js_1.logger.info('Generating specs for findings', { count: scenarios.length });
|
|
42
|
+
const result = (0, child_process_1.spawnSync)('npx', args, {
|
|
43
|
+
cwd: config.testsRoot || process.cwd(),
|
|
44
|
+
encoding: 'utf-8',
|
|
45
|
+
timeout: 300000,
|
|
46
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
47
|
+
env: (0, safe_env_js_1.safeEnv)(),
|
|
48
|
+
});
|
|
49
|
+
if (result.status !== 0) {
|
|
50
|
+
logger_js_1.logger.warn('Spec generation exited with non-zero', {
|
|
51
|
+
status: result.status,
|
|
52
|
+
stderr: (result.stderr || '').slice(0, 500),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Parse generated spec paths from output
|
|
56
|
+
const generatedPaths = [];
|
|
57
|
+
const lines = (result.stdout || '').split('\n');
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
const match = line.match(/generated.*?:\s*(.+\.spec\.ts)/i);
|
|
60
|
+
if (match) {
|
|
61
|
+
generatedPaths.push(match[1].trim());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return generatedPaths;
|
|
65
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../src/qa-agent/phase3/verdict.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,YAAY,EAAE,YAAY,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AAE9G,wBAAgB,cAAc,CAC1B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACrB,cAAc,CAwDhB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.computeVerdict = computeVerdict;
|
|
6
|
+
function computeVerdict(phase1, phase2) {
|
|
7
|
+
const findings = phase2.findings;
|
|
8
|
+
const critical = findings.filter((f) => f.severity === 'critical').length;
|
|
9
|
+
const high = findings.filter((f) => f.severity === 'high').length;
|
|
10
|
+
const medium = findings.filter((f) => f.severity === 'medium').length;
|
|
11
|
+
const low = findings.filter((f) => f.severity === 'low' || f.severity === 'info').length;
|
|
12
|
+
// Flow sign-offs
|
|
13
|
+
const flowSignoffs = buildFlowSignoffs(phase1.flows, phase2);
|
|
14
|
+
// Decision logic
|
|
15
|
+
let decision;
|
|
16
|
+
let reason;
|
|
17
|
+
if (critical > 0) {
|
|
18
|
+
decision = 'no-go';
|
|
19
|
+
reason = `${critical} critical finding(s) — must fix before release.`;
|
|
20
|
+
}
|
|
21
|
+
else if (high > 0) {
|
|
22
|
+
decision = 'no-go';
|
|
23
|
+
reason = `${high} high-severity finding(s) — requires triage before release.`;
|
|
24
|
+
}
|
|
25
|
+
else if (medium > 0) {
|
|
26
|
+
decision = 'conditional';
|
|
27
|
+
reason = `${medium} medium-severity finding(s) — review and decide if acceptable.`;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
decision = 'go';
|
|
31
|
+
reason = findings.length === 0
|
|
32
|
+
? 'No issues found across all tested flows.'
|
|
33
|
+
: `Only low/info findings (${low}). Safe to proceed.`;
|
|
34
|
+
}
|
|
35
|
+
// Check for untested flows (P0/P1 not tested → downgrade to conditional)
|
|
36
|
+
const untestedP0P1 = flowSignoffs.filter((s) => s.status === 'not-tested' && phase1.flows.find((f) => f.id === s.flowId && (f.priority === 'P0' || f.priority === 'P1')));
|
|
37
|
+
if (untestedP0P1.length > 0 && decision === 'go') {
|
|
38
|
+
decision = 'conditional';
|
|
39
|
+
reason += ` ${untestedP0P1.length} P0/P1 flow(s) were not tested.`;
|
|
40
|
+
}
|
|
41
|
+
// Check Phase 1 spec failures
|
|
42
|
+
const specFailures = phase1.specResults.reduce((sum, r) => sum + r.failed, 0);
|
|
43
|
+
if (specFailures > 0 && decision === 'go') {
|
|
44
|
+
decision = 'conditional';
|
|
45
|
+
reason += ` ${specFailures} existing spec(s) failed in Phase 1.`;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
decision,
|
|
49
|
+
reason,
|
|
50
|
+
flowSignoffs,
|
|
51
|
+
criticalFindings: critical,
|
|
52
|
+
highFindings: high,
|
|
53
|
+
mediumFindings: medium,
|
|
54
|
+
lowFindings: low,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function buildFlowSignoffs(flows, phase2) {
|
|
58
|
+
return flows.map((flow) => {
|
|
59
|
+
const explored = phase2.flowsExplored.includes(flow.id);
|
|
60
|
+
const flowFindings = phase2.findings.filter((f) => f.flow === flow.id);
|
|
61
|
+
const hasIssues = flowFindings.some((f) => f.type === 'bug' || f.severity === 'critical' || f.severity === 'high');
|
|
62
|
+
return {
|
|
63
|
+
flowId: flow.id,
|
|
64
|
+
flowName: flow.name,
|
|
65
|
+
status: explored ? (hasIssues ? 'failed' : 'passed') : 'not-tested',
|
|
66
|
+
findings: flowFindings.map((f) => f.id),
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe_env.d.ts","sourceRoot":"","sources":["../../src/qa-agent/safe_env.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAkBzE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.safeEnv = safeEnv;
|
|
6
|
+
/** Build a minimal env for child processes — only forward what's needed. */
|
|
7
|
+
function safeEnv(extra) {
|
|
8
|
+
const env = {
|
|
9
|
+
PATH: process.env.PATH,
|
|
10
|
+
HOME: process.env.HOME,
|
|
11
|
+
NODE_PATH: process.env.NODE_PATH,
|
|
12
|
+
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
|
|
13
|
+
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
|
|
14
|
+
LLM_PROVIDER: process.env.LLM_PROVIDER,
|
|
15
|
+
LOG_LEVEL: process.env.LOG_LEVEL,
|
|
16
|
+
// Node needs LANG/LC_ALL for proper string handling
|
|
17
|
+
LANG: process.env.LANG,
|
|
18
|
+
// npm/npx need these
|
|
19
|
+
npm_config_prefix: process.env.npm_config_prefix,
|
|
20
|
+
NVM_DIR: process.env.NVM_DIR,
|
|
21
|
+
NVM_BIN: process.env.NVM_BIN,
|
|
22
|
+
};
|
|
23
|
+
if (extra)
|
|
24
|
+
Object.assign(env, extra);
|
|
25
|
+
return env;
|
|
26
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { FlowPriority } from '../agent/types.js';
|
|
2
|
+
export type RunMode = 'pr' | 'hunt' | 'fix' | 'release';
|
|
3
|
+
export interface QAConfig {
|
|
4
|
+
mode: RunMode;
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
since?: string;
|
|
7
|
+
huntTarget?: string;
|
|
8
|
+
phase?: 1 | 2 | 3;
|
|
9
|
+
timeLimitMinutes: number;
|
|
10
|
+
budgetUSD: number;
|
|
11
|
+
headed?: boolean;
|
|
12
|
+
testsRoot?: string;
|
|
13
|
+
project?: string;
|
|
14
|
+
users?: UserCredentials[];
|
|
15
|
+
screenshotDir?: string;
|
|
16
|
+
outputDir?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface UserCredentials {
|
|
19
|
+
role: string;
|
|
20
|
+
username: string;
|
|
21
|
+
password: string;
|
|
22
|
+
}
|
|
23
|
+
export type BrowserActionType = 'navigate' | 'click' | 'fill' | 'type' | 'press' | 'scroll' | 'back' | 'screenshot' | 'snapshot' | 'get_url' | 'get_title' | 'get_text' | 'eval' | 'compressed';
|
|
24
|
+
export interface BrowserAction {
|
|
25
|
+
type: BrowserActionType;
|
|
26
|
+
target?: string;
|
|
27
|
+
value?: string;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
}
|
|
30
|
+
export type FindingType = 'bug' | 'visual-regression' | 'ux-issue' | 'gap' | 'verified-ok';
|
|
31
|
+
export type FindingSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
32
|
+
export interface Finding {
|
|
33
|
+
id: string;
|
|
34
|
+
type: FindingType;
|
|
35
|
+
severity: FindingSeverity;
|
|
36
|
+
summary: string;
|
|
37
|
+
flow: string;
|
|
38
|
+
evidence: FindingEvidence;
|
|
39
|
+
timestamp: number;
|
|
40
|
+
}
|
|
41
|
+
export interface FindingEvidence {
|
|
42
|
+
screenshotPath?: string;
|
|
43
|
+
url: string;
|
|
44
|
+
reproSteps: string[];
|
|
45
|
+
consoleErrors?: string[];
|
|
46
|
+
}
|
|
47
|
+
export interface TargetFlow {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
url?: string;
|
|
51
|
+
priority: FlowPriority;
|
|
52
|
+
}
|
|
53
|
+
export interface ExplorationState {
|
|
54
|
+
flowsToExplore: TargetFlow[];
|
|
55
|
+
flowsExplored: string[];
|
|
56
|
+
currentFlow: string | null;
|
|
57
|
+
findings: Finding[];
|
|
58
|
+
actionsLog: BrowserAction[];
|
|
59
|
+
recentActions: BrowserAction[];
|
|
60
|
+
tokensUsed: number;
|
|
61
|
+
costUSD: number;
|
|
62
|
+
startTime: number;
|
|
63
|
+
timeLimitMs: number;
|
|
64
|
+
budgetUSD: number;
|
|
65
|
+
}
|
|
66
|
+
export interface SpecResult {
|
|
67
|
+
specPath: string;
|
|
68
|
+
passed: number;
|
|
69
|
+
failed: number;
|
|
70
|
+
flaky: number;
|
|
71
|
+
skipped: number;
|
|
72
|
+
}
|
|
73
|
+
export interface Phase1Result {
|
|
74
|
+
flows: TargetFlow[];
|
|
75
|
+
specResults: SpecResult[];
|
|
76
|
+
planPath?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface Phase2Result {
|
|
79
|
+
findings: Finding[];
|
|
80
|
+
flowsExplored: string[];
|
|
81
|
+
actionsCount: number;
|
|
82
|
+
tokensUsed: number;
|
|
83
|
+
costUSD: number;
|
|
84
|
+
durationMs: number;
|
|
85
|
+
}
|
|
86
|
+
export interface Phase3Result {
|
|
87
|
+
reportPath: string;
|
|
88
|
+
summaryPath: string;
|
|
89
|
+
verdict: ReleaseVerdict;
|
|
90
|
+
generatedSpecs: string[];
|
|
91
|
+
}
|
|
92
|
+
export type VerdictDecision = 'go' | 'no-go' | 'conditional';
|
|
93
|
+
export interface FlowSignoff {
|
|
94
|
+
flowId: string;
|
|
95
|
+
flowName: string;
|
|
96
|
+
status: 'passed' | 'failed' | 'not-tested';
|
|
97
|
+
findings: string[];
|
|
98
|
+
}
|
|
99
|
+
export interface ReleaseVerdict {
|
|
100
|
+
decision: VerdictDecision;
|
|
101
|
+
reason: string;
|
|
102
|
+
flowSignoffs: FlowSignoff[];
|
|
103
|
+
criticalFindings: number;
|
|
104
|
+
highFindings: number;
|
|
105
|
+
mediumFindings: number;
|
|
106
|
+
lowFindings: number;
|
|
107
|
+
}
|
|
108
|
+
export interface QAReport {
|
|
109
|
+
schemaVersion: '1.0.0';
|
|
110
|
+
generatedAt: string;
|
|
111
|
+
mode: RunMode;
|
|
112
|
+
config: {
|
|
113
|
+
baseUrl: string;
|
|
114
|
+
timeLimitMinutes: number;
|
|
115
|
+
budgetUSD: number;
|
|
116
|
+
};
|
|
117
|
+
phase1: Phase1Result;
|
|
118
|
+
phase2: Phase2Result;
|
|
119
|
+
phase3: Phase3Result;
|
|
120
|
+
verdict: ReleaseVerdict;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/qa-agent/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yasserkhanorg/e2e-agents",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "AI-powered E2E test impact analysis, generation, and healing. Analyzes code changes to identify affected Playwright tests, detects coverage gaps, and generates or repairs specs using pluggable LLM providers (Claude, OpenAI, Ollama). Includes MCP server, traceability, and CI/CD integration.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
29
|
"bin": {
|
|
30
|
-
"e2e-ai-agents": "./dist/cli.js"
|
|
30
|
+
"e2e-ai-agents": "./dist/cli.js",
|
|
31
|
+
"e2e-qa-agent": "./dist/qa-agent/cli.js"
|
|
31
32
|
},
|
|
32
33
|
"files": [
|
|
33
34
|
"dist",
|
|
@@ -37,7 +38,7 @@
|
|
|
37
38
|
],
|
|
38
39
|
"scripts": {
|
|
39
40
|
"build": "npm run build:cjs && npm run build:esm",
|
|
40
|
-
"postbuild": "chmod +x dist/cli.js",
|
|
41
|
+
"postbuild": "chmod +x dist/cli.js dist/qa-agent/cli.js",
|
|
41
42
|
"build:cjs": "tsc -p tsconfig.json",
|
|
42
43
|
"build:esm": "tsc -p tsconfig.esm.json && node scripts/write-esm-package.js",
|
|
43
44
|
"clean": "rm -rf dist",
|
|
@@ -57,6 +58,14 @@
|
|
|
57
58
|
"marked": "^15.0.6",
|
|
58
59
|
"openai": "^4.73.0"
|
|
59
60
|
},
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"agent-browser": ">=0.18.0"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"agent-browser": {
|
|
66
|
+
"optional": true
|
|
67
|
+
}
|
|
68
|
+
},
|
|
60
69
|
"devDependencies": {
|
|
61
70
|
"@types/node": "^22.0.0",
|
|
62
71
|
"typescript": "^5.6.0"
|