@exodus/xqa 5.3.0 → 5.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.
Files changed (3) hide show
  1. package/README.md +4 -1
  2. package/dist/xqa.cjs +148 -59
  3. package/package.json +4 -4
package/README.md CHANGED
@@ -180,7 +180,8 @@ Suite files live at `.xqa/suites/<name>.suite.json` and declare the work items p
180
180
  "beforeEach": {
181
181
  "script": "qa/prepare-sim.mjs",
182
182
  "env": { "APP_PROFILE": "funded" },
183
- "timeoutSeconds": 120
183
+ "timeoutSeconds": 120,
184
+ "retries": 3
184
185
  }
185
186
  }
186
187
  }
@@ -206,6 +207,8 @@ Contract:
206
207
  - Exit 0 → proceed with item.
207
208
  - Non-zero exit → item marked failed, `executeItem` skipped, counts toward simulator-unhealthy threshold.
208
209
  - Default 120s timeout, overridable via `hooks.beforeEach.timeoutSeconds`.
210
+ - Default 3 retries on failure (`HOOK_EXIT_NONZERO`, `HOOK_TIMEOUT`, `HOOK_SPAWN_FAILED`), overridable via `hooks.beforeEach.retries` (range `0..10`). Set to `0` to disable retries. Aborts (`HOOK_ABORTED`) are never retried.
211
+ - A `HOOK_RETRY` suite event is emitted before each retry attempt with `attempt`, `maxAttempts`, and `previousErrorType`.
209
212
  - Honors the suite abort signal.
210
213
 
211
214
  ## Configuration
package/dist/xqa.cjs CHANGED
@@ -161,7 +161,7 @@ var require_index_cjs = __commonJS({
161
161
  }, reject);
162
162
  }
163
163
  }
164
- var ResultAsync28 = class _ResultAsync {
164
+ var ResultAsync29 = class _ResultAsync {
165
165
  constructor(res) {
166
166
  this._promise = res;
167
167
  }
@@ -262,8 +262,8 @@ var require_index_cjs = __commonJS({
262
262
  return new Ok(res.value);
263
263
  })));
264
264
  }
265
- match(ok46, _err) {
266
- return this._promise.then((res) => res.match(ok46, _err));
265
+ match(ok45, _err) {
266
+ return this._promise.then((res) => res.match(ok45, _err));
267
267
  }
268
268
  unwrapOr(t) {
269
269
  return this._promise.then((res) => res.unwrapOr(t));
@@ -299,17 +299,17 @@ var require_index_cjs = __commonJS({
299
299
  });
300
300
  }
301
301
  };
302
- function okAsync12(value) {
303
- return new ResultAsync28(Promise.resolve(new Ok(value)));
302
+ function okAsync13(value) {
303
+ return new ResultAsync29(Promise.resolve(new Ok(value)));
304
304
  }
305
305
  function errAsync12(err45) {
306
- return new ResultAsync28(Promise.resolve(new Err(err45)));
306
+ return new ResultAsync29(Promise.resolve(new Err(err45)));
307
307
  }
308
- var fromPromise = ResultAsync28.fromPromise;
309
- var fromSafePromise2 = ResultAsync28.fromSafePromise;
310
- var fromAsyncThrowable9 = ResultAsync28.fromThrowable;
308
+ var fromPromise = ResultAsync29.fromPromise;
309
+ var fromSafePromise2 = ResultAsync29.fromSafePromise;
310
+ var fromAsyncThrowable9 = ResultAsync29.fromThrowable;
311
311
  var combineResultList = (resultList) => {
312
- let acc = ok45([]);
312
+ let acc = ok41([]);
313
313
  for (const result of resultList) {
314
314
  if (result.isErr()) {
315
315
  acc = err41(result.error);
@@ -320,9 +320,9 @@ var require_index_cjs = __commonJS({
320
320
  }
321
321
  return acc;
322
322
  };
323
- var combineResultAsyncList = (asyncResultList) => ResultAsync28.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList);
323
+ var combineResultAsyncList = (asyncResultList) => ResultAsync29.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList);
324
324
  var combineResultListWithAllErrors = (resultList) => {
325
- let acc = ok45([]);
325
+ let acc = ok41([]);
326
326
  for (const result of resultList) {
327
327
  if (result.isErr() && acc.isErr()) {
328
328
  acc.error.push(result.error);
@@ -334,14 +334,14 @@ var require_index_cjs = __commonJS({
334
334
  }
335
335
  return acc;
336
336
  };
337
- var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync28.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors);
337
+ var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync29.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors);
338
338
  exports2.Result = void 0;
339
339
  (function(Result3) {
340
340
  function fromThrowable21(fn, errorFn) {
341
341
  return (...args) => {
342
342
  try {
343
343
  const result = fn(...args);
344
- return ok45(result);
344
+ return ok41(result);
345
345
  } catch (e3) {
346
346
  return err41(errorFn ? errorFn(e3) : e3);
347
347
  }
@@ -357,7 +357,7 @@ var require_index_cjs = __commonJS({
357
357
  }
358
358
  Result3.combineWithAllErrors = combineWithAllErrors;
359
359
  })(exports2.Result || (exports2.Result = {}));
360
- function ok45(value) {
360
+ function ok41(value) {
361
361
  return new Ok(value);
362
362
  }
363
363
  function err41(err45) {
@@ -366,7 +366,7 @@ var require_index_cjs = __commonJS({
366
366
  function safeTry(body) {
367
367
  const n3 = body().next();
368
368
  if (n3 instanceof Promise) {
369
- return new ResultAsync28(n3.then((r3) => r3.value));
369
+ return new ResultAsync29(n3.then((r3) => r3.value));
370
370
  }
371
371
  return n3.value;
372
372
  }
@@ -381,11 +381,11 @@ var require_index_cjs = __commonJS({
381
381
  return !this.isOk();
382
382
  }
383
383
  map(f6) {
384
- return ok45(f6(this.value));
384
+ return ok41(f6(this.value));
385
385
  }
386
386
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
387
387
  mapErr(_f) {
388
- return ok45(this.value);
388
+ return ok41(this.value);
389
389
  }
390
390
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
391
391
  andThen(f6) {
@@ -400,14 +400,14 @@ var require_index_cjs = __commonJS({
400
400
  f6(this.value);
401
401
  } catch (e3) {
402
402
  }
403
- return ok45(this.value);
403
+ return ok41(this.value);
404
404
  }
405
405
  orTee(_f) {
406
- return ok45(this.value);
406
+ return ok41(this.value);
407
407
  }
408
408
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
409
409
  orElse(_f) {
410
- return ok45(this.value);
410
+ return ok41(this.value);
411
411
  }
412
412
  asyncAndThen(f6) {
413
413
  return f6(this.value);
@@ -417,15 +417,15 @@ var require_index_cjs = __commonJS({
417
417
  return f6(this.value).map(() => this.value);
418
418
  }
419
419
  asyncMap(f6) {
420
- return ResultAsync28.fromSafePromise(f6(this.value));
420
+ return ResultAsync29.fromSafePromise(f6(this.value));
421
421
  }
422
422
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
423
423
  unwrapOr(_v) {
424
424
  return this.value;
425
425
  }
426
426
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
427
- match(ok46, _err) {
428
- return ok46(this.value);
427
+ match(ok45, _err) {
428
+ return ok45(this.value);
429
429
  }
430
430
  safeUnwrap() {
431
431
  const value = this.value;
@@ -521,15 +521,15 @@ var require_index_cjs = __commonJS({
521
521
  var fromThrowable20 = exports2.Result.fromThrowable;
522
522
  exports2.Err = Err;
523
523
  exports2.Ok = Ok;
524
- exports2.ResultAsync = ResultAsync28;
524
+ exports2.ResultAsync = ResultAsync29;
525
525
  exports2.err = err41;
526
526
  exports2.errAsync = errAsync12;
527
527
  exports2.fromAsyncThrowable = fromAsyncThrowable9;
528
528
  exports2.fromPromise = fromPromise;
529
529
  exports2.fromSafePromise = fromSafePromise2;
530
530
  exports2.fromThrowable = fromThrowable20;
531
- exports2.ok = ok45;
532
- exports2.okAsync = okAsync12;
531
+ exports2.ok = ok41;
532
+ exports2.okAsync = okAsync13;
533
533
  exports2.safeTry = safeTry;
534
534
  }
535
535
  });
@@ -5321,8 +5321,8 @@ var require_resolve_flow_scalar = __commonJS({
5321
5321
  };
5322
5322
  function parseCharCode(source, offset, length, onError) {
5323
5323
  const cc = source.substr(offset, length);
5324
- const ok45 = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
5325
- const code = ok45 ? parseInt(cc, 16) : NaN;
5324
+ const ok41 = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
5325
+ const code = ok41 ? parseInt(cc, 16) : NaN;
5326
5326
  if (isNaN(code)) {
5327
5327
  const raw = source.substr(offset - 2, length + 2);
5328
5328
  onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`);
@@ -49496,9 +49496,9 @@ var tq = k((oq) => {
49496
49496
  });
49497
49497
  var sq = k((aq) => {
49498
49498
  Object.defineProperty(aq, "__esModule", { value: true });
49499
- var ok45 = Q$(), tk = { keyword: "not", schemaType: ["object", "boolean"], trackErrors: true, code($) {
49499
+ var ok41 = Q$(), tk = { keyword: "not", schemaType: ["object", "boolean"], trackErrors: true, code($) {
49500
49500
  let { gen: X, schema: J, it: Q } = $;
49501
- if ((0, ok45.alwaysValidSchema)(Q, J)) {
49501
+ if ((0, ok41.alwaysValidSchema)(Q, J)) {
49502
49502
  $.fail();
49503
49503
  return;
49504
49504
  }
@@ -65151,6 +65151,15 @@ function normalizeSimulatorUnhealthy(event) {
65151
65151
  }
65152
65152
  ];
65153
65153
  }
65154
+ function normalizeHookRetry(event) {
65155
+ return [
65156
+ {
65157
+ kind: "text",
65158
+ style: "default",
65159
+ text: `[${event.itemName}] HOOK_RETRY ${String(event.attempt)}/${String(event.maxAttempts)} after ${event.previousErrorType}`
65160
+ }
65161
+ ];
65162
+ }
65154
65163
  function normalizeSuiteCompleted(event) {
65155
65164
  return [
65156
65165
  {
@@ -65168,6 +65177,7 @@ var HANDLERS = {
65168
65177
  ITEM_TIMEOUT: (event) => normalizeItemTimeout(event),
65169
65178
  ITEM_ABORTED: (event) => normalizeItemAborted(event),
65170
65179
  SIMULATOR_UNHEALTHY: (event) => normalizeSimulatorUnhealthy(event),
65180
+ HOOK_RETRY: (event) => normalizeHookRetry(event),
65171
65181
  SUITE_COMPLETED: (event) => normalizeSuiteCompleted(event)
65172
65182
  };
65173
65183
  function normalizeSuiteEvent(event) {
@@ -65571,6 +65581,7 @@ var SUITE_EVENT_TYPES = /* @__PURE__ */ new Set([
65571
65581
  "ITEM_TIMEOUT",
65572
65582
  "ITEM_ABORTED",
65573
65583
  "SIMULATOR_UNHEALTHY",
65584
+ "HOOK_RETRY",
65574
65585
  "SUITE_COMPLETED"
65575
65586
  ]);
65576
65587
  var UI_EVENT_TYPES = /* @__PURE__ */ new Set([
@@ -65681,6 +65692,14 @@ function reduceSimulatorUnhealthy(state, event) {
65681
65692
  };
65682
65693
  return { ...state, log: [...state.log, entry] };
65683
65694
  }
65695
+ function reduceHookRetry(state, event) {
65696
+ const entry = {
65697
+ itemId: event.itemId,
65698
+ source: "annotation",
65699
+ lines: normalizeSuiteEvent(event)
65700
+ };
65701
+ return { ...state, log: [...state.log, entry] };
65702
+ }
65684
65703
  function reduceSuiteEvent(state, event) {
65685
65704
  switch (event.type) {
65686
65705
  case "ITEM_QUEUED": {
@@ -65698,6 +65717,9 @@ function reduceSuiteEvent(state, event) {
65698
65717
  case "SIMULATOR_UNHEALTHY": {
65699
65718
  return reduceSimulatorUnhealthy(state, event);
65700
65719
  }
65720
+ case "HOOK_RETRY": {
65721
+ return reduceHookRetry(state, event);
65722
+ }
65701
65723
  case "SUITE_COMPLETED": {
65702
65724
  return { ...state, suiteEnded: true };
65703
65725
  }
@@ -79360,6 +79382,7 @@ function formatOptionalNumber(value) {
79360
79382
  // src/shell/debug-agent-events.ts
79361
79383
  var TOOL_INPUT_MAX = 120;
79362
79384
  var TOOL_ERROR_MAX = 120;
79385
+ var THOUGHT_TEXT_MAX = 240;
79363
79386
  var UNSERIALIZABLE = "[unserializable]";
79364
79387
  function tryStringify(value) {
79365
79388
  const result = JSON.stringify(value);
@@ -79443,6 +79466,13 @@ function handleVisualStep(context, event) {
79443
79466
  function handleError(context, event) {
79444
79467
  context.logger.log("ERROR", `${event.agent} ${event.message}`);
79445
79468
  }
79469
+ function flattenThoughtText(text) {
79470
+ return text.replaceAll(/\s+/g, " ").trim();
79471
+ }
79472
+ function handleThought(context, event) {
79473
+ const text = truncate(flattenThoughtText(event.text), THOUGHT_TEXT_MAX);
79474
+ context.logger.log("THOUGHT", `${event.agent} ${text}`);
79475
+ }
79446
79476
  var AGENT_EVENT_HANDLERS = {
79447
79477
  STAGE_START: handleStageStart,
79448
79478
  STAGE_END: handleStageEnd,
@@ -79455,7 +79485,8 @@ var AGENT_EVENT_HANDLERS = {
79455
79485
  INSPECTOR_STEP_START: handleInspectorStepStart,
79456
79486
  INSPECTOR_STEP: handleInspectorStep,
79457
79487
  VISUAL_STEP: handleVisualStep,
79458
- ERROR: handleError
79488
+ ERROR: handleError,
79489
+ THOUGHT: handleThought
79459
79490
  };
79460
79491
  function handleAgentEvent(context, event) {
79461
79492
  const handler2 = AGENT_EVENT_HANDLERS[event.type];
@@ -79502,6 +79533,12 @@ function handleSimulatorUnhealthy(logger, event) {
79502
79533
  `sim=${event.simulatorUdid} failures=${String(event.consecutiveFailures)}`
79503
79534
  );
79504
79535
  }
79536
+ function handleHookRetry(logger, event) {
79537
+ logger.log(
79538
+ "HOOK_RETRY",
79539
+ `id=${event.itemId} sim=${event.simulatorUdid} attempt=${String(event.attempt)}/${String(event.maxAttempts)} prev=${event.previousErrorType}`
79540
+ );
79541
+ }
79505
79542
  function handleSuiteCompleted(logger, event) {
79506
79543
  logger.log(
79507
79544
  "SUITE_COMPLETED",
@@ -79516,6 +79553,7 @@ var SUITE_EVENT_HANDLERS = {
79516
79553
  ITEM_TIMEOUT: handleItemTimeout,
79517
79554
  ITEM_ABORTED: handleItemAborted,
79518
79555
  SIMULATOR_UNHEALTHY: handleSimulatorUnhealthy,
79556
+ HOOK_RETRY: handleHookRetry,
79519
79557
  SUITE_COMPLETED: handleSuiteCompleted
79520
79558
  };
79521
79559
  function handleSuiteEvent(logger, event) {
@@ -85283,10 +85321,12 @@ var freestyleSchema = external_exports.union([external_exports.number().int().po
85283
85321
  }
85284
85322
  return value;
85285
85323
  });
85324
+ var MAX_HOOK_RETRIES = 10;
85286
85325
  var hookConfigSchema = external_exports.object({
85287
85326
  script: external_exports.string().min(1),
85288
85327
  env: external_exports.record(external_exports.string(), external_exports.string()).optional(),
85289
- timeoutSeconds: external_exports.number().int().positive().optional()
85328
+ timeoutSeconds: external_exports.number().int().positive().optional(),
85329
+ retries: external_exports.number().int().nonnegative().max(MAX_HOOK_RETRIES).optional()
85290
85330
  }).superRefine((data, context) => {
85291
85331
  if (data.env === void 0) {
85292
85332
  return;
@@ -85318,18 +85358,20 @@ var safeJsonParse5 = (0, import_neverthrow75.fromThrowable)(
85318
85358
  cause
85319
85359
  })
85320
85360
  );
85361
+ function pickDefined(object2) {
85362
+ return Object.fromEntries(
85363
+ Object.entries(object2).filter(([, value]) => value !== void 0)
85364
+ );
85365
+ }
85321
85366
  function buildHookConfig(parsed) {
85322
- const { script, env: env3, timeoutSeconds } = parsed;
85323
- if (env3 !== void 0 && timeoutSeconds !== void 0) {
85324
- return { script, env: env3, timeoutSeconds };
85325
- }
85326
- if (env3 !== void 0) {
85327
- return { script, env: env3 };
85328
- }
85329
- if (timeoutSeconds !== void 0) {
85330
- return { script, timeoutSeconds };
85331
- }
85332
- return { script };
85367
+ return {
85368
+ script: parsed.script,
85369
+ ...pickDefined({
85370
+ env: parsed.env,
85371
+ timeoutSeconds: parsed.timeoutSeconds,
85372
+ retries: parsed.retries
85373
+ })
85374
+ };
85333
85375
  }
85334
85376
  function normalizeHooks(hooks) {
85335
85377
  if (hooks === void 0) {
@@ -85845,25 +85887,71 @@ function runHook(options2) {
85845
85887
 
85846
85888
  // src/suite/shell/hook-invoker.ts
85847
85889
  var DEFAULT_HOOK_TIMEOUT_SECONDS = 120;
85890
+ var DEFAULT_HOOK_RETRIES = 3;
85848
85891
  var MS_PER_SECOND5 = 1e3;
85849
- async function invokeHook(input) {
85850
- const { hook: hook2, item, simulatorUdid, suiteName, hookCwd, hookBaseEnv, hookNodeExecPath, signal } = input;
85851
- const env3 = buildHookEnv({ item, simulatorUdid, suiteName, suiteEnv: hook2.env });
85852
- const timeoutSeconds = hook2.timeoutSeconds ?? DEFAULT_HOOK_TIMEOUT_SECONDS;
85892
+ var RETRYABLE_HOOK_ERROR_TYPES = /* @__PURE__ */ new Set([
85893
+ "HOOK_EXIT_NONZERO",
85894
+ "HOOK_TIMEOUT",
85895
+ "HOOK_SPAWN_FAILED"
85896
+ ]);
85897
+ async function runHookOnce(context) {
85853
85898
  return runHook({
85854
- script: hook2.script,
85855
- cwd: hookCwd,
85856
- env: env3,
85857
- baseEnv: hookBaseEnv,
85858
- nodeExecPath: hookNodeExecPath,
85859
- timeoutMs: timeoutSeconds * MS_PER_SECOND5,
85860
- signal
85899
+ script: context.input.hook.script,
85900
+ cwd: context.input.hookCwd,
85901
+ env: context.env,
85902
+ baseEnv: context.input.hookBaseEnv,
85903
+ nodeExecPath: context.input.hookNodeExecPath,
85904
+ timeoutMs: context.timeoutMs,
85905
+ signal: context.input.signal
85906
+ });
85907
+ }
85908
+ function emitRetryEvent(context, event) {
85909
+ context.input.observer?.({
85910
+ type: "HOOK_RETRY",
85911
+ itemId: context.input.item.id,
85912
+ itemName: context.input.item.name,
85913
+ simulatorUdid: context.input.simulatorUdid,
85914
+ attempt: event.attempt,
85915
+ maxAttempts: context.maxAttempts,
85916
+ previousErrorType: event.previous.type
85917
+ });
85918
+ }
85919
+ async function runAllAttempts(context) {
85920
+ let lastResult = await runHookOnce(context);
85921
+ for (let attempt = 2; attempt <= context.maxAttempts; attempt += 1) {
85922
+ if (lastResult.isOk()) {
85923
+ return lastResult;
85924
+ }
85925
+ if (!isRetryableHookError(lastResult.error) || context.input.signal.aborted) {
85926
+ return lastResult;
85927
+ }
85928
+ emitRetryEvent(context, { attempt, previous: lastResult.error });
85929
+ lastResult = await runHookOnce(context);
85930
+ }
85931
+ return lastResult;
85932
+ }
85933
+ function buildAttemptContext(input) {
85934
+ const env3 = buildHookEnv({
85935
+ item: input.item,
85936
+ simulatorUdid: input.simulatorUdid,
85937
+ suiteName: input.suiteName,
85938
+ suiteEnv: input.hook.env
85861
85939
  });
85940
+ const timeoutMs = (input.hook.timeoutSeconds ?? DEFAULT_HOOK_TIMEOUT_SECONDS) * MS_PER_SECOND5;
85941
+ const maxAttempts = (input.hook.retries ?? DEFAULT_HOOK_RETRIES) + 1;
85942
+ return { input, env: env3, timeoutMs, maxAttempts };
85862
85943
  }
85863
- async function maybeInvokeHook(input) {
85944
+ function invokeHook(input) {
85945
+ const context = buildAttemptContext(input);
85946
+ return import_neverthrow79.ResultAsync.fromSafePromise(runAllAttempts(context)).andThen((result) => result);
85947
+ }
85948
+ function isRetryableHookError(error48) {
85949
+ return RETRYABLE_HOOK_ERROR_TYPES.has(error48.type);
85950
+ }
85951
+ function maybeInvokeHook(input) {
85864
85952
  const { hook: hook2 } = input;
85865
85953
  if (hook2 === void 0) {
85866
- return (0, import_neverthrow79.ok)();
85954
+ return (0, import_neverthrow79.okAsync)();
85867
85955
  }
85868
85956
  return invokeHook({ ...input, hook: hook2 });
85869
85957
  }
@@ -85889,7 +85977,8 @@ function buildHookInvokeInput(workerContext, item) {
85889
85977
  hookCwd: config2.hookCwd,
85890
85978
  hookBaseEnv: config2.hookBaseEnv,
85891
85979
  hookNodeExecPath: config2.hookNodeExecPath,
85892
- signal: config2.signal
85980
+ signal: config2.signal,
85981
+ observer: config2.observer
85893
85982
  };
85894
85983
  }
85895
85984
  function emitItemStarted(state) {
@@ -94264,7 +94353,7 @@ function buildProgram(options2) {
94264
94353
 
94265
94354
  // src/index.ts
94266
94355
  process.title = "xqa";
94267
- var version2 = `${"5.3.0"}${false ? ` (dev build +${"2cb661f"})` : ""}`;
94356
+ var version2 = `${"5.4.0"}${false ? ` (dev build +${"fb81480"})` : ""}`;
94268
94357
  var program2 = buildProgram({ version: version2 });
94269
94358
  void program2.parseAsync(process.argv);
94270
94359
  /*! Bundled license information:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/xqa",
3
- "version": "5.3.0",
3
+ "version": "5.4.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -27,18 +27,18 @@
27
27
  "vitest": "^3.2.1",
28
28
  "zod": "^4.3.6",
29
29
  "@qa-agents/analyser": "0.0.0",
30
+ "@qa-agents/config": "0.0.0",
30
31
  "@qa-agents/consolidator": "0.0.0",
31
32
  "@qa-agents/display": "0.0.0",
33
+ "@qa-agents/eslint-config": "0.0.0",
32
34
  "@qa-agents/explorer": "0.0.0",
33
35
  "@qa-agents/inspector": "0.0.0",
34
36
  "@qa-agents/mobile-ios": "0.0.0",
35
37
  "@qa-agents/pipeline": "0.0.0",
36
38
  "@qa-agents/planner": "0.0.0",
37
39
  "@qa-agents/shared": "0.0.0",
38
- "@qa-agents/config": "0.0.0",
39
40
  "@qa-agents/triager": "0.0.0",
40
- "@qa-agents/typescript-config": "0.0.0",
41
- "@qa-agents/eslint-config": "0.0.0"
41
+ "@qa-agents/typescript-config": "0.0.0"
42
42
  },
43
43
  "dependencies": {
44
44
  "@octokit/rest": "^21.0.0",