@fasttest-ai/qa-agent 0.2.0 → 0.4.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/runner.js CHANGED
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import * as actions from "./actions.js";
13
13
  import { healSelector } from "./healer.js";
14
+ import { resolveString, resolveStepVariables, resolveAssertionVariables, collectVariableNames } from "./variables.js";
14
15
  /**
15
16
  * Execute a full test suite run.
16
17
  */
@@ -23,15 +24,153 @@ export async function executeRun(browserMgr, cloud, options, consoleLogs) {
23
24
  test_case_ids: options.testCaseIds,
24
25
  });
25
26
  const executionId = run.execution_id;
26
- const baseUrl = options.appUrlOverride ?? run.base_url ?? "";
27
27
  const testCases = run.test_cases;
28
+ // Resolve {{VAR}} placeholders in baseUrl
29
+ let baseUrl = options.appUrlOverride ?? run.base_url ?? "";
30
+ if (baseUrl) {
31
+ try {
32
+ baseUrl = resolveString(baseUrl);
33
+ }
34
+ catch (err) {
35
+ try {
36
+ await cloud.completeExecution(executionId);
37
+ }
38
+ catch { /* non-fatal */ }
39
+ return {
40
+ execution_id: executionId,
41
+ status: "failed",
42
+ total: testCases.length,
43
+ passed: 0,
44
+ failed: testCases.length,
45
+ skipped: 0,
46
+ duration_ms: 0,
47
+ results: testCases.map((tc) => ({
48
+ id: tc.id, name: tc.name, status: "failed",
49
+ duration_ms: 0, error: String(err), step_results: [],
50
+ })),
51
+ healed: [],
52
+ };
53
+ }
54
+ }
55
+ // Pre-flight: check that all {{VAR}} placeholders can be resolved
56
+ const allVarNames = [];
57
+ for (const tc of testCases) {
58
+ for (const v of collectVariableNames(tc.steps, tc.assertions)) {
59
+ if (!allVarNames.includes(v))
60
+ allVarNames.push(v);
61
+ }
62
+ }
63
+ if (allVarNames.length > 0) {
64
+ const resolved = [];
65
+ const missing = [];
66
+ for (const v of allVarNames) {
67
+ if (process.env[v] !== undefined) {
68
+ resolved.push(v);
69
+ }
70
+ else {
71
+ missing.push(v);
72
+ }
73
+ }
74
+ if (resolved.length > 0) {
75
+ console.log(`Environment variables resolved: ${resolved.join(", ")}`);
76
+ }
77
+ if (missing.length > 0) {
78
+ const errMsg = `Missing environment variable(s): ${missing.join(", ")}. ` +
79
+ `Set these before running tests. In GitHub Actions, add them as repository secrets.`;
80
+ console.error(`ERROR: ${errMsg}`);
81
+ try {
82
+ await cloud.completeExecution(executionId);
83
+ }
84
+ catch { /* non-fatal */ }
85
+ return {
86
+ execution_id: executionId,
87
+ status: "failed",
88
+ total: testCases.length,
89
+ passed: 0,
90
+ failed: testCases.length,
91
+ skipped: 0,
92
+ duration_ms: 0,
93
+ results: testCases.map((tc) => ({
94
+ id: tc.id, name: tc.name, status: "failed",
95
+ duration_ms: 0, error: errMsg, step_results: [],
96
+ })),
97
+ healed: [],
98
+ };
99
+ }
100
+ }
28
101
  const results = [];
29
102
  const allHealed = [];
30
103
  const runStart = Date.now();
31
- // 2. Execute each test case sequentially
104
+ let cancelled = false;
105
+ let reportFailures = 0;
106
+ // 2. Execute each test case sequentially (with smart retry)
32
107
  for (const tc of testCases) {
33
- const tcResult = await executeTestCase(browserMgr, cloud, tc, baseUrl, consoleLogs, allHealed);
108
+ // Check for pause/cancel from dashboard
109
+ try {
110
+ const controlStatus = await cloud.checkControlStatus(executionId);
111
+ if (controlStatus === "cancelled") {
112
+ cancelled = true;
113
+ break;
114
+ }
115
+ if (controlStatus === "paused") {
116
+ let resumed = false;
117
+ const pauseStart = Date.now();
118
+ const MAX_PAUSE_MS = 30 * 60 * 1000; // 30 minutes
119
+ while (!resumed) {
120
+ if (Date.now() - pauseStart > MAX_PAUSE_MS) {
121
+ console.log("Pause exceeded 30-minute limit, auto-cancelling.");
122
+ cancelled = true;
123
+ break;
124
+ }
125
+ await new Promise((resolve) => setTimeout(resolve, 2000));
126
+ const s = await cloud.checkControlStatus(executionId);
127
+ if (s === "running") {
128
+ resumed = true;
129
+ }
130
+ if (s === "cancelled") {
131
+ cancelled = true;
132
+ break;
133
+ }
134
+ }
135
+ if (cancelled)
136
+ break;
137
+ }
138
+ }
139
+ catch {
140
+ // Non-fatal — if we can't check, continue executing
141
+ }
142
+ // Smart retry loop
143
+ const maxRetries = tc.retry_count ?? 0;
144
+ let tcResult;
145
+ let attempt = 0;
146
+ while (true) {
147
+ // Notify War Room that this test case is starting
148
+ await cloud.notifyTestStarted(executionId, tc.id, tc.name);
149
+ const timeoutMs = (tc.timeout_seconds || 30) * 1000;
150
+ tcResult = await Promise.race([
151
+ executeTestCase(browserMgr, cloud, executionId, tc, baseUrl, consoleLogs, allHealed),
152
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Test case "${tc.name}" timed out after ${tc.timeout_seconds || 30}s`)), timeoutMs)),
153
+ ]).catch((err) => ({
154
+ id: tc.id,
155
+ name: tc.name,
156
+ status: "failed",
157
+ duration_ms: timeoutMs,
158
+ error: String(err),
159
+ step_results: [],
160
+ }));
161
+ if (tcResult.status === "passed" || attempt >= maxRetries) {
162
+ break;
163
+ }
164
+ // Failed but have retries left
165
+ attempt++;
166
+ console.log(`Retrying ${tc.name} (attempt ${attempt}/${maxRetries})...`);
167
+ }
168
+ tcResult.retry_attempts = attempt;
34
169
  results.push(tcResult);
170
+ // Capture network calls for this test case and reset for next one
171
+ const rawNetwork = browserMgr.getNetworkSummary();
172
+ browserMgr.clearNetworkEntries();
173
+ const networkSummary = filterNetworkEntries(rawNetwork);
35
174
  // 3. Report result to Cloud
36
175
  try {
37
176
  await cloud.reportResult(executionId, {
@@ -40,36 +179,56 @@ export async function executeRun(browserMgr, cloud, options, consoleLogs) {
40
179
  duration_ms: tcResult.duration_ms,
41
180
  error_message: tcResult.error,
42
181
  console_logs: consoleLogs.slice(-50),
182
+ retry_attempt: attempt,
43
183
  step_results: tcResult.step_results.map((sr) => ({
44
184
  step_index: sr.step_index,
45
185
  action: sr.action,
46
186
  success: sr.success,
47
187
  error: sr.error,
48
188
  duration_ms: sr.duration_ms,
189
+ screenshot_url: sr.screenshot_url,
49
190
  healed: sr.healed,
50
191
  heal_details: sr.heal_details,
51
192
  })),
193
+ network_summary: networkSummary.length > 0 ? networkSummary : undefined,
52
194
  });
53
195
  }
54
196
  catch (err) {
55
197
  // Non-fatal — log and continue
198
+ reportFailures++;
56
199
  console.error(`Failed to report result for ${tc.name}: ${err}`);
57
200
  }
58
201
  }
202
+ // Mark any unexecuted test cases as skipped (e.g. due to cancellation)
203
+ const completedIds = new Set(results.map((r) => r.id));
204
+ for (const tc of testCases) {
205
+ if (!completedIds.has(tc.id)) {
206
+ results.push({
207
+ id: tc.id,
208
+ name: tc.name,
209
+ status: "skipped",
210
+ duration_ms: 0,
211
+ step_results: [],
212
+ });
213
+ }
214
+ }
59
215
  // 4. Complete execution
60
216
  const passed = results.filter((r) => r.status === "passed").length;
61
217
  const failed = results.filter((r) => r.status === "failed").length;
62
218
  const skipped = results.filter((r) => r.status === "skipped").length;
63
219
  const durationMs = Date.now() - runStart;
64
220
  try {
65
- await cloud.completeExecution(executionId);
221
+ await cloud.completeExecution(executionId, cancelled ? "cancelled" : undefined);
66
222
  }
67
223
  catch (err) {
68
224
  console.error(`Failed to complete execution: ${err}`);
69
225
  }
226
+ if (reportFailures > 0) {
227
+ console.warn(`Warning: ${reportFailures} result report(s) failed to send to cloud.`);
228
+ }
70
229
  return {
71
230
  execution_id: executionId,
72
- status: failed === 0 ? "passed" : "failed",
231
+ status: cancelled ? "cancelled" : (failed === 0 ? "passed" : "failed"),
73
232
  total: testCases.length,
74
233
  passed,
75
234
  failed,
@@ -82,22 +241,42 @@ export async function executeRun(browserMgr, cloud, options, consoleLogs) {
82
241
  /**
83
242
  * Execute a single test case.
84
243
  */
85
- async function executeTestCase(browserMgr, cloud, tc, baseUrl, consoleLogs, allHealed) {
244
+ async function executeTestCase(browserMgr, cloud, executionId, tc, baseUrl, consoleLogs, allHealed) {
86
245
  const stepResults = [];
87
246
  const start = Date.now();
88
247
  try {
89
- const page = await browserMgr.ensureBrowser();
248
+ // Fresh context per test case to prevent session/cookie leakage
249
+ const page = await browserMgr.newContext();
90
250
  // Execute steps
91
251
  for (let i = 0; i < tc.steps.length; i++) {
92
252
  const step = tc.steps[i];
93
253
  const stepStart = Date.now();
94
- let result = await executeStep(page, step, baseUrl);
254
+ // Resolve {{VAR}} placeholders from environment
255
+ let resolvedStep;
256
+ try {
257
+ resolvedStep = resolveStepVariables(step);
258
+ }
259
+ catch (err) {
260
+ stepResults.push({
261
+ step_index: i, action: step.action, success: false,
262
+ error: String(err), duration_ms: Date.now() - stepStart,
263
+ });
264
+ return {
265
+ id: tc.id, name: tc.name, status: "failed",
266
+ duration_ms: Date.now() - start,
267
+ error: `Step ${i + 1} (${step.action}) failed: ${String(err)}`,
268
+ step_results: stepResults,
269
+ };
270
+ }
271
+ let result = await executeStep(page, resolvedStep, baseUrl);
95
272
  // Self-healing: if step failed and has a selector, try healing
96
- if (!result.success && step.selector && isSelectorFailure(result.error)) {
97
- const healResult = await healSelector(page, cloud, step.selector, classifyStepError(result.error), result.error ?? "unknown", page.url());
273
+ if (!result.success && resolvedStep.selector && isSelectorFailure(result.error)) {
274
+ // Notify War Room that healing is starting
275
+ await cloud.notifyHealingStarted(executionId, tc.id, resolvedStep.selector);
276
+ const healResult = await healSelector(page, cloud, resolvedStep.selector, classifyStepError(result.error), result.error ?? "unknown", page.url(), { action: resolvedStep.action, description: resolvedStep.description });
98
277
  if (healResult.healed && healResult.newSelector) {
99
278
  // Retry with the healed selector
100
- const healedStep = { ...step, selector: healResult.newSelector };
279
+ const healedStep = { ...resolvedStep, selector: healResult.newSelector };
101
280
  result = await executeStep(page, healedStep, baseUrl);
102
281
  if (result.success) {
103
282
  allHealed.push({
@@ -108,11 +287,14 @@ async function executeTestCase(browserMgr, cloud, tc, baseUrl, consoleLogs, allH
108
287
  strategy: healResult.strategy ?? "unknown",
109
288
  confidence: healResult.confidence ?? 0,
110
289
  });
290
+ // Capture screenshot after healed step
291
+ const capture = await captureStepScreenshot(page);
111
292
  stepResults.push({
112
293
  step_index: i,
113
294
  action: step.action,
114
295
  success: true,
115
296
  duration_ms: Date.now() - stepStart,
297
+ screenshot_url: capture?.dataUrl,
116
298
  healed: true,
117
299
  heal_details: {
118
300
  original_selector: step.selector,
@@ -125,12 +307,15 @@ async function executeTestCase(browserMgr, cloud, tc, baseUrl, consoleLogs, allH
125
307
  }
126
308
  }
127
309
  }
310
+ // Capture screenshot after each step (especially important on failure for debugging)
311
+ const capture = await captureStepScreenshot(page);
128
312
  stepResults.push({
129
313
  step_index: i,
130
314
  action: step.action,
131
315
  success: result.success,
132
316
  error: result.error,
133
317
  duration_ms: Date.now() - stepStart,
318
+ screenshot_url: capture?.dataUrl,
134
319
  });
135
320
  if (!result.success) {
136
321
  return {
@@ -147,7 +332,24 @@ async function executeTestCase(browserMgr, cloud, tc, baseUrl, consoleLogs, allH
147
332
  for (let i = 0; i < tc.assertions.length; i++) {
148
333
  const assertion = tc.assertions[i];
149
334
  const assertStart = Date.now();
150
- const result = await executeAssertion(page, assertion);
335
+ // Resolve {{VAR}} placeholders in assertion values
336
+ let resolvedAssertion;
337
+ try {
338
+ resolvedAssertion = resolveAssertionVariables(assertion);
339
+ }
340
+ catch (err) {
341
+ stepResults.push({
342
+ step_index: tc.steps.length + i, action: `assert:${assertion.type}`,
343
+ success: false, error: String(err), duration_ms: Date.now() - assertStart,
344
+ });
345
+ return {
346
+ id: tc.id, name: tc.name, status: "failed",
347
+ duration_ms: Date.now() - start,
348
+ error: `Assertion ${i + 1} (${assertion.type}) failed: ${String(err)}`,
349
+ step_results: stepResults,
350
+ };
351
+ }
352
+ const result = await executeAssertion(page, resolvedAssertion);
151
353
  stepResults.push({
152
354
  step_index: tc.steps.length + i,
153
355
  action: `assert:${assertion.type}`,
@@ -185,6 +387,19 @@ async function executeTestCase(browserMgr, cloud, tc, baseUrl, consoleLogs, allH
185
387
  };
186
388
  }
187
389
  }
390
+ /**
391
+ * Capture a screenshot after a test step.
392
+ * Returns { dataUrl } or undefined if capture fails.
393
+ */
394
+ async function captureStepScreenshot(page) {
395
+ try {
396
+ const b64 = await actions.screenshot(page, false);
397
+ return { dataUrl: `data:image/jpeg;base64,${b64}` };
398
+ }
399
+ catch {
400
+ return undefined;
401
+ }
402
+ }
188
403
  /**
189
404
  * Execute a single test step via Playwright.
190
405
  */
@@ -206,20 +421,20 @@ async function executeStep(page, step, baseUrl) {
206
421
  return await actions.fill(page, step.selector ?? "", step.value ?? "");
207
422
  case "fill_form": {
208
423
  const fields = step.fields ?? {};
209
- for (const [sel, val] of Object.entries(fields)) {
210
- const r = await actions.fill(page, sel, val);
211
- if (!r.success)
212
- return r;
213
- }
214
- return { success: true };
424
+ return await actions.fillForm(page, fields);
215
425
  }
426
+ case "drag":
427
+ return await actions.drag(page, step.selector ?? "", step.target ?? "");
428
+ case "resize":
429
+ return await actions.resize(page, step.width ?? 1280, step.height ?? 720);
216
430
  case "hover":
217
431
  return await actions.hover(page, step.selector ?? "");
218
432
  case "select":
219
433
  return await actions.selectOption(page, step.selector ?? "", step.value ?? "");
220
434
  case "wait_for": {
221
435
  if (step.condition === "navigation") {
222
- await page.waitForLoadState("networkidle", { timeout: (step.timeout ?? 10) * 1000 });
436
+ await page.waitForLoadState("domcontentloaded", { timeout: (step.timeout ?? 10) * 1000 });
437
+ await page.waitForLoadState("networkidle", { timeout: 5000 }).catch(() => { });
223
438
  return { success: true };
224
439
  }
225
440
  return await actions.waitFor(page, step.selector ?? "", (step.timeout ?? 10) * 1000);
@@ -305,4 +520,15 @@ function classifyStepError(error) {
305
520
  return "NAVIGATION_FAILED";
306
521
  return "UNKNOWN";
307
522
  }
523
+ /** Keep only API/document calls — skip static assets like images, fonts, CSS, JS bundles. */
524
+ function filterNetworkEntries(entries) {
525
+ return entries.filter((e) => {
526
+ const mime = e.mimeType.toLowerCase();
527
+ if (mime.includes("json") || mime.includes("text/html") || mime.includes("text/plain"))
528
+ return true;
529
+ if (e.status >= 400)
530
+ return true;
531
+ return false;
532
+ });
533
+ }
308
534
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Environment variable substitution for test steps and assertions.
3
+ *
4
+ * Test steps can contain {{VAR_NAME}} placeholders that are resolved from
5
+ * process.env at execution time. This allows suites to be saved with
6
+ * placeholders for credentials, then executed in CI/CD where the actual
7
+ * values are set as GitHub Secrets or environment variables.
8
+ */
9
+ import type { TestStep, TestAssertion } from "./cloud.js";
10
+ /**
11
+ * Replace all {{VAR}} placeholders in a string with values from the environment.
12
+ * Throws if any referenced variable is missing, listing ALL missing names.
13
+ */
14
+ export declare function resolveString(input: string, env?: Record<string, string | undefined>): string;
15
+ /**
16
+ * Resolve {{VAR}} placeholders in a test step's value fields.
17
+ * Returns a new step object — does not mutate the original.
18
+ * Does NOT resolve selectors or descriptions.
19
+ */
20
+ export declare function resolveStepVariables(step: TestStep, env?: Record<string, string | undefined>): TestStep;
21
+ /**
22
+ * Resolve {{VAR}} placeholders in an assertion's value fields.
23
+ * Returns a new assertion object — does not mutate the original.
24
+ */
25
+ export declare function resolveAssertionVariables(assertion: TestAssertion, env?: Record<string, string | undefined>): TestAssertion;
26
+ /**
27
+ * Collect all unique {{VAR}} names referenced across steps and assertions.
28
+ * Used for pre-flight logging and CI YAML generation.
29
+ */
30
+ export declare function collectVariableNames(steps: TestStep[], assertions: TestAssertion[]): string[];
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Environment variable substitution for test steps and assertions.
3
+ *
4
+ * Test steps can contain {{VAR_NAME}} placeholders that are resolved from
5
+ * process.env at execution time. This allows suites to be saved with
6
+ * placeholders for credentials, then executed in CI/CD where the actual
7
+ * values are set as GitHub Secrets or environment variables.
8
+ */
9
+ /** Matches {{UPPER_SNAKE_CASE}} variable placeholders. */
10
+ const VAR_PATTERN = /\{\{([A-Z][A-Z0-9_]*)\}\}/g;
11
+ /**
12
+ * Replace all {{VAR}} placeholders in a string with values from the environment.
13
+ * Throws if any referenced variable is missing, listing ALL missing names.
14
+ */
15
+ export function resolveString(input, env = process.env) {
16
+ const missing = [];
17
+ const resolved = input.replace(VAR_PATTERN, (match, varName) => {
18
+ const value = env[varName];
19
+ if (value === undefined) {
20
+ missing.push(varName);
21
+ return match;
22
+ }
23
+ return value;
24
+ });
25
+ if (missing.length > 0) {
26
+ throw new Error(`Missing environment variable(s): ${missing.join(", ")}. ` +
27
+ `Set these before running tests. In GitHub Actions, add them as repository secrets.`);
28
+ }
29
+ return resolved;
30
+ }
31
+ /**
32
+ * Resolve {{VAR}} placeholders in a test step's value fields.
33
+ * Returns a new step object — does not mutate the original.
34
+ * Does NOT resolve selectors or descriptions.
35
+ */
36
+ export function resolveStepVariables(step, env) {
37
+ const resolved = { ...step };
38
+ if (resolved.value !== undefined)
39
+ resolved.value = resolveString(resolved.value, env);
40
+ if (resolved.url !== undefined)
41
+ resolved.url = resolveString(resolved.url, env);
42
+ if (resolved.expression !== undefined)
43
+ resolved.expression = resolveString(resolved.expression, env);
44
+ if (resolved.key !== undefined)
45
+ resolved.key = resolveString(resolved.key, env);
46
+ if (resolved.fields !== undefined) {
47
+ const resolvedFields = {};
48
+ for (const [selector, val] of Object.entries(resolved.fields)) {
49
+ resolvedFields[selector] = resolveString(val, env);
50
+ }
51
+ resolved.fields = resolvedFields;
52
+ }
53
+ return resolved;
54
+ }
55
+ /**
56
+ * Resolve {{VAR}} placeholders in an assertion's value fields.
57
+ * Returns a new assertion object — does not mutate the original.
58
+ */
59
+ export function resolveAssertionVariables(assertion, env) {
60
+ const resolved = { ...assertion };
61
+ if (resolved.text !== undefined)
62
+ resolved.text = resolveString(resolved.text, env);
63
+ if (resolved.url !== undefined)
64
+ resolved.url = resolveString(resolved.url, env);
65
+ if (resolved.value !== undefined)
66
+ resolved.value = resolveString(resolved.value, env);
67
+ if (resolved.expected_value !== undefined)
68
+ resolved.expected_value = resolveString(resolved.expected_value, env);
69
+ return resolved;
70
+ }
71
+ /**
72
+ * Collect all unique {{VAR}} names referenced across steps and assertions.
73
+ * Used for pre-flight logging and CI YAML generation.
74
+ */
75
+ export function collectVariableNames(steps, assertions) {
76
+ const vars = new Set();
77
+ function scan(input) {
78
+ if (!input)
79
+ return;
80
+ const re = /\{\{([A-Z][A-Z0-9_]*)\}\}/g;
81
+ let match;
82
+ while ((match = re.exec(input)) !== null) {
83
+ vars.add(match[1]);
84
+ }
85
+ }
86
+ for (const step of steps) {
87
+ scan(step.value);
88
+ scan(step.url);
89
+ scan(step.expression);
90
+ scan(step.key);
91
+ if (step.fields) {
92
+ for (const val of Object.values(step.fields))
93
+ scan(val);
94
+ }
95
+ }
96
+ for (const assertion of assertions) {
97
+ scan(assertion.text);
98
+ scan(assertion.url);
99
+ scan(assertion.value);
100
+ scan(assertion.expected_value);
101
+ }
102
+ return Array.from(vars).sort();
103
+ }
104
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "@fasttest-ai/qa-agent",
3
- "version": "0.2.0",
4
- "description": "QA Agent — AI testing engineer MCP server",
3
+ "version": "0.4.0",
4
+ "description": "FastTest Agent — AI testing engineer MCP server",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "qa-agent": "bin/qa-agent.js",
8
- "qa-agent-ci": "bin/qa-agent-ci.js"
8
+ "qa-agent-ci": "bin/qa-agent-ci.js",
9
+ "fasttest": "bin/qa-agent.js",
10
+ "fasttest-ci": "bin/qa-agent-ci.js",
11
+ "fasttest-install": "bin/install.js"
9
12
  },
10
13
  "main": "./dist/index.js",
11
14
  "scripts": {