nexus-agents 2.60.0 → 2.61.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.
@@ -8,7 +8,7 @@ import {
8
8
  checkSqlite,
9
9
  defaultConfig,
10
10
  initDataDirectories
11
- } from "./chunk-XRXUCE6K.js";
11
+ } from "./chunk-NB6IYTMN.js";
12
12
  import {
13
13
  BUILT_IN_EXPERTS
14
14
  } from "./chunk-GJVHRJO2.js";
@@ -1933,4 +1933,4 @@ export {
1933
1933
  setupCommand,
1934
1934
  setupCommandAsync
1935
1935
  };
1936
- //# sourceMappingURL=chunk-MJ3K4FYS.js.map
1936
+ //# sourceMappingURL=chunk-KNAPTURC.js.map
@@ -38,7 +38,7 @@ import {
38
38
  } from "./chunk-CLYZ7FWP.js";
39
39
 
40
40
  // src/version.ts
41
- var VERSION = true ? "2.60.0" : "dev";
41
+ var VERSION = true ? "2.61.0" : "dev";
42
42
 
43
43
  // src/config/schemas-core.ts
44
44
  import { z } from "zod";
@@ -2025,7 +2025,7 @@ async function runDoctorFix(result) {
2025
2025
  writeLine2("\u2500".repeat(40));
2026
2026
  let fixCount = 0;
2027
2027
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
2028
- const { runSetup } = await import("./setup-command-LIX2S7JD.js");
2028
+ const { runSetup } = await import("./setup-command-QJGB34JY.js");
2029
2029
  const setupResult = runSetup({
2030
2030
  skipMcp: true,
2031
2031
  skipRules: true,
@@ -2123,6 +2123,7 @@ export {
2123
2123
  filterAvailableModels,
2124
2124
  DEFAULT_TASK_TTL_MS,
2125
2125
  clampTaskTtl,
2126
+ DATA_SUBDIRECTORIES,
2126
2127
  checkApiKeys,
2127
2128
  checkSqlite,
2128
2129
  checkDataDirectory,
@@ -2134,4 +2135,4 @@ export {
2134
2135
  startStdioServer,
2135
2136
  closeServer
2136
2137
  };
2137
- //# sourceMappingURL=chunk-XRXUCE6K.js.map
2138
+ //# sourceMappingURL=chunk-NB6IYTMN.js.map
@@ -68,7 +68,7 @@ import {
68
68
  clampTaskTtl,
69
69
  getAvailabilityCache,
70
70
  resolveFallback
71
- } from "./chunk-XRXUCE6K.js";
71
+ } from "./chunk-NB6IYTMN.js";
72
72
  import {
73
73
  DEFAULTS
74
74
  } from "./chunk-H43PABG4.js";
@@ -53661,4 +53661,4 @@ export {
53661
53661
  detectBackend,
53662
53662
  createTaskTracker
53663
53663
  };
53664
- //# sourceMappingURL=chunk-5JSMLCCK.js.map
53664
+ //# sourceMappingURL=chunk-TRWIEUI2.js.map
package/dist/cli.d.ts CHANGED
@@ -38,7 +38,7 @@ declare const EXIT_CODES: {
38
38
  /**
39
39
  * CLI command types that can be executed.
40
40
  */
41
- type CliCommand = 'server' | 'help' | 'version' | 'hello' | 'config' | 'expert' | 'workflow' | 'doctor' | 'verify' | 'review' | 'routing-audit' | 'orchestrate' | 'system-review' | 'vote' | 'index' | 'research' | 'validation' | 'learning-metrics' | 'swe-bench' | 'atbench' | 'setup' | 'hooks' | 'demo' | 'sprint' | 'session' | 'evaluate' | 'issue' | 'fitness-audit' | 'release-notes' | 'release-validate' | 'release-announce' | 'scaffold' | 'visualize' | 'capabilities' | 'status' | 'memory-benchmark' | 'auth' | 'scenario' | 'warm-up' | 'e2e-eval' | 'routing-ab' | 'memory-eval' | 'health' | 'validate' | 'registry';
41
+ type CliCommand = 'server' | 'help' | 'version' | 'hello' | 'config' | 'expert' | 'workflow' | 'doctor' | 'verify' | 'review' | 'routing-audit' | 'orchestrate' | 'system-review' | 'vote' | 'index' | 'research' | 'validation' | 'learning-metrics' | 'swe-bench' | 'atbench' | 'setup' | 'hooks' | 'demo' | 'sprint' | 'session' | 'evaluate' | 'issue' | 'fitness-audit' | 'release-notes' | 'release-validate' | 'release-announce' | 'scaffold' | 'visualize' | 'capabilities' | 'status' | 'memory-benchmark' | 'auth' | 'scenario' | 'warm-up' | 'e2e-eval' | 'routing-ab' | 'memory-eval' | 'health' | 'init' | 'validate' | 'registry';
42
42
  /**
43
43
  * Parsed CLI arguments and command.
44
44
  */
@@ -106,6 +106,8 @@ interface ParsedCliArgs {
106
106
  deep: boolean;
107
107
  json?: boolean;
108
108
  source?: string;
109
+ portable?: boolean;
110
+ gitignore?: boolean;
109
111
  };
110
112
  positionals: string[];
111
113
  }
package/dist/cli.js CHANGED
@@ -16,7 +16,7 @@ import "./chunk-6QU4DJYW.js";
16
16
  import {
17
17
  setupCommandAsync,
18
18
  verifyCommand
19
- } from "./chunk-MJ3K4FYS.js";
19
+ } from "./chunk-KNAPTURC.js";
20
20
  import "./chunk-QGZBCD2A.js";
21
21
  import {
22
22
  AuthHandler,
@@ -142,7 +142,7 @@ import {
142
142
  validateCommand,
143
143
  validateWorkflow,
144
144
  wrapInMarkdownFence
145
- } from "./chunk-5JSMLCCK.js";
145
+ } from "./chunk-TRWIEUI2.js";
146
146
  import "./chunk-ED6VQWNG.js";
147
147
  import {
148
148
  resolveToken
@@ -185,6 +185,7 @@ import "./chunk-AP2FD37C.js";
185
185
  import "./chunk-BQ4YXGGQ.js";
186
186
  import {
187
187
  CustomExpertDefinitionSchema,
188
+ DATA_SUBDIRECTORIES,
188
189
  MAX_SYSTEM_PROMPT_LENGTH,
189
190
  VALID_EXPERT_DOMAINS,
190
191
  VALID_EXPERT_TIERS,
@@ -200,7 +201,7 @@ import {
200
201
  loadConfig,
201
202
  runDoctor,
202
203
  validateNexusEnv
203
- } from "./chunk-XRXUCE6K.js";
204
+ } from "./chunk-NB6IYTMN.js";
204
205
  import {
205
206
  DEFAULTS
206
207
  } from "./chunk-H43PABG4.js";
@@ -1458,14 +1459,14 @@ ${colors.dim}Session ended.${colors.reset}
1458
1459
  });
1459
1460
  });
1460
1461
  rl.prompt();
1461
- return new Promise((resolve14) => {
1462
+ return new Promise((resolve15) => {
1462
1463
  rl.on("line", (line) => {
1463
1464
  void (async () => {
1464
1465
  try {
1465
1466
  const shouldExit = await processLine(line, session, logger17);
1466
1467
  if (shouldExit) {
1467
1468
  rl.close();
1468
- resolve14();
1469
+ resolve15();
1469
1470
  return;
1470
1471
  }
1471
1472
  } catch (error) {
@@ -1477,7 +1478,7 @@ ${colors.dim}Session ended.${colors.reset}
1477
1478
  })();
1478
1479
  });
1479
1480
  rl.on("close", () => {
1480
- resolve14();
1481
+ resolve15();
1481
1482
  });
1482
1483
  });
1483
1484
  }
@@ -12828,7 +12829,7 @@ function writeResultAndExit(result) {
12828
12829
 
12829
12830
  // src/cli/hooks/hook-router.ts
12830
12831
  async function readStdin() {
12831
- return new Promise((resolve14, reject) => {
12832
+ return new Promise((resolve15, reject) => {
12832
12833
  let data = "";
12833
12834
  process.stdin.setEncoding("utf8");
12834
12835
  process.stdin.on("readable", () => {
@@ -12839,24 +12840,24 @@ async function readStdin() {
12839
12840
  }
12840
12841
  });
12841
12842
  process.stdin.on("end", () => {
12842
- resolve14(data);
12843
+ resolve15(data);
12843
12844
  });
12844
12845
  process.stdin.on("error", (err2) => {
12845
12846
  reject(err2);
12846
12847
  });
12847
12848
  if (process.stdin.isTTY) {
12848
- resolve14("");
12849
+ resolve15("");
12849
12850
  }
12850
12851
  });
12851
12852
  }
12852
12853
  async function readStdinWithTimeout(timeoutMs = 5e3) {
12853
- return new Promise((resolve14, reject) => {
12854
+ return new Promise((resolve15, reject) => {
12854
12855
  const timeout2 = setTimeout(() => {
12855
12856
  reject(new Error(`Stdin read timeout after ${String(timeoutMs)}ms`));
12856
12857
  }, timeoutMs);
12857
12858
  readStdin().then((data) => {
12858
12859
  clearTimeout(timeout2);
12859
- resolve14(data);
12860
+ resolve15(data);
12860
12861
  }).catch((err2) => {
12861
12862
  clearTimeout(timeout2);
12862
12863
  reject(err2 instanceof Error ? err2 : new Error(String(err2)));
@@ -17653,64 +17654,212 @@ var PARSE_ARGS_CONFIG = {
17653
17654
  },
17654
17655
  source: {
17655
17656
  type: "string"
17657
+ },
17658
+ // init --portable command options (#2305)
17659
+ portable: {
17660
+ type: "boolean",
17661
+ default: false
17662
+ },
17663
+ gitignore: {
17664
+ type: "boolean",
17665
+ default: false
17656
17666
  }
17657
17667
  },
17658
17668
  allowPositionals: true,
17659
17669
  strict: true
17660
17670
  };
17671
+ var VALID_COMMANDS = [
17672
+ "server",
17673
+ "help",
17674
+ "version",
17675
+ "hello",
17676
+ "config",
17677
+ "expert",
17678
+ "workflow",
17679
+ "doctor",
17680
+ "verify",
17681
+ "review",
17682
+ "routing-audit",
17683
+ "orchestrate",
17684
+ "system-review",
17685
+ "vote",
17686
+ "index",
17687
+ "research",
17688
+ "validation",
17689
+ "learning-metrics",
17690
+ "swe-bench",
17691
+ "atbench",
17692
+ "setup",
17693
+ "hooks",
17694
+ "demo",
17695
+ "sprint",
17696
+ "session",
17697
+ "evaluate",
17698
+ "issue",
17699
+ "fitness-audit",
17700
+ "release-notes",
17701
+ "release-validate",
17702
+ "release-announce",
17703
+ "scaffold",
17704
+ "visualize",
17705
+ "capabilities",
17706
+ "status",
17707
+ "memory-benchmark",
17708
+ "auth",
17709
+ "scenario",
17710
+ "warm-up",
17711
+ "e2e-eval",
17712
+ "routing-ab",
17713
+ "memory-eval",
17714
+ "health",
17715
+ "init",
17716
+ "validate",
17717
+ "registry"
17718
+ ];
17661
17719
  function isValidCommand(value) {
17662
- const validCommands = [
17663
- "server",
17664
- "help",
17665
- "version",
17666
- "hello",
17667
- "config",
17668
- "expert",
17669
- "workflow",
17670
- "doctor",
17671
- "verify",
17672
- "review",
17673
- "routing-audit",
17674
- "orchestrate",
17675
- "system-review",
17676
- "vote",
17677
- "index",
17678
- "research",
17679
- "validation",
17680
- "learning-metrics",
17681
- "swe-bench",
17682
- "atbench",
17683
- "setup",
17684
- "hooks",
17685
- "demo",
17686
- "sprint",
17687
- "session",
17688
- "evaluate",
17689
- "issue",
17690
- "fitness-audit",
17691
- "release-notes",
17692
- "release-validate",
17693
- "release-announce",
17694
- "scaffold",
17695
- "visualize",
17696
- "capabilities",
17697
- "status",
17698
- "memory-benchmark",
17699
- "auth",
17700
- "scenario",
17701
- "warm-up",
17702
- "e2e-eval",
17703
- "routing-ab",
17704
- "memory-eval",
17705
- "health",
17706
- "validate",
17707
- "registry"
17708
- ];
17709
- return validCommands.includes(value);
17720
+ return VALID_COMMANDS.includes(value);
17710
17721
  }
17711
17722
 
17712
17723
  // src/cli-commands-handlers.ts
17713
- import { existsSync as existsSync18 } from "fs";
17724
+ import { existsSync as existsSync19 } from "fs";
17725
+
17726
+ // src/cli/init-portable.ts
17727
+ import {
17728
+ existsSync as existsSync17,
17729
+ mkdirSync as mkdirSync3,
17730
+ readdirSync as readdirSync2,
17731
+ statSync as statSync3,
17732
+ appendFileSync,
17733
+ readFileSync as readFileSync10
17734
+ } from "fs";
17735
+ import { resolve as resolve11, join as join13, isAbsolute as isAbsolute2 } from "path";
17736
+ var DEFAULT_PORTABLE_DIRNAME = ".nexus-agents";
17737
+ var RESTRICTED_SUBDIRS = /* @__PURE__ */ new Set(["auth"]);
17738
+ function resolveTargetPath(rawPath) {
17739
+ if (rawPath === void 0 || rawPath === "") {
17740
+ return resolve11(process.cwd(), DEFAULT_PORTABLE_DIRNAME);
17741
+ }
17742
+ return isAbsolute2(rawPath) ? rawPath : resolve11(process.cwd(), rawPath);
17743
+ }
17744
+ function isNonEmpty(dir) {
17745
+ if (!existsSync17(dir)) return false;
17746
+ const stat2 = statSync3(dir);
17747
+ if (!stat2.isDirectory()) return true;
17748
+ return readdirSync2(dir).length > 0;
17749
+ }
17750
+ function ensureDir(path23, dryRun, created, alreadyExisted, mode) {
17751
+ if (existsSync17(path23)) {
17752
+ alreadyExisted.push(path23);
17753
+ return;
17754
+ }
17755
+ if (!dryRun) {
17756
+ mkdirSync3(path23, { recursive: true, ...mode !== void 0 ? { mode } : {} });
17757
+ }
17758
+ created.push(path23);
17759
+ }
17760
+ function maybeUpdateGitignore(workspaceDir, portableDirName, dryRun) {
17761
+ const gitDir = join13(workspaceDir, ".git");
17762
+ if (!existsSync17(gitDir)) return false;
17763
+ const gitignorePath = join13(workspaceDir, ".gitignore");
17764
+ const entry = `${portableDirName}/`;
17765
+ let existing = "";
17766
+ if (existsSync17(gitignorePath)) {
17767
+ existing = readFileSync10(gitignorePath, "utf-8");
17768
+ if (existing.split("\n").some((l) => l.trim() === entry || l.trim() === portableDirName)) {
17769
+ return false;
17770
+ }
17771
+ }
17772
+ if (!dryRun) {
17773
+ const sep3 = existing.length > 0 && !existing.endsWith("\n") ? "\n" : "";
17774
+ appendFileSync(gitignorePath, `${sep3}${entry}
17775
+ `, "utf-8");
17776
+ }
17777
+ return true;
17778
+ }
17779
+ function inspectTarget(target) {
17780
+ const exists = existsSync17(target);
17781
+ if (!exists) return { exists: false, nonEmpty: false, isExistingNexusDir: false };
17782
+ const nonEmpty = isNonEmpty(target);
17783
+ const stat2 = statSync3(target);
17784
+ const isExistingNexusDir = stat2.isDirectory() && existsSync17(join13(target, "audit"));
17785
+ return { exists, nonEmpty, isExistingNexusDir };
17786
+ }
17787
+ function createDataLayout(target, dryRun, created, alreadyExisted) {
17788
+ ensureDir(target, dryRun, created, alreadyExisted);
17789
+ for (const subdir of DATA_SUBDIRECTORIES) {
17790
+ const mode = RESTRICTED_SUBDIRS.has(subdir) ? 448 : void 0;
17791
+ ensureDir(join13(target, subdir), dryRun, created, alreadyExisted, mode);
17792
+ }
17793
+ }
17794
+ function makeResult(opts) {
17795
+ return {
17796
+ success: opts.success,
17797
+ absolutePath: opts.absolutePath,
17798
+ created: opts.created,
17799
+ alreadyExisted: opts.alreadyExisted,
17800
+ skipped: opts.skipped ?? false,
17801
+ gitignoreUpdated: opts.gitignoreUpdated ?? false,
17802
+ error: opts.error ?? null
17803
+ };
17804
+ }
17805
+ function applyGitignoreOption(target, options, dryRun) {
17806
+ if (options.gitignore !== true) return false;
17807
+ const workspaceDir = resolve11(target, "..");
17808
+ const portableName = target.slice(workspaceDir.length + 1);
17809
+ return maybeUpdateGitignore(workspaceDir, portableName, dryRun);
17810
+ }
17811
+ function initPortable(options = {}) {
17812
+ const created = [];
17813
+ const alreadyExisted = [];
17814
+ const dryRun = options.dryRun === true;
17815
+ const force = options.force === true;
17816
+ const target = resolveTargetPath(options.path);
17817
+ const base = { absolutePath: target, created, alreadyExisted };
17818
+ try {
17819
+ const state = inspectTarget(target);
17820
+ if (state.isExistingNexusDir && !force) {
17821
+ createDataLayout(target, dryRun, created, alreadyExisted);
17822
+ return makeResult({ ...base, success: true, skipped: true });
17823
+ }
17824
+ if (state.nonEmpty && !state.isExistingNexusDir && !force) {
17825
+ const error = `target ${target} already exists and is not empty; pass --force to use anyway`;
17826
+ return makeResult({ ...base, success: false, error });
17827
+ }
17828
+ createDataLayout(target, dryRun, created, alreadyExisted);
17829
+ const gitignoreUpdated = applyGitignoreOption(target, options, dryRun);
17830
+ return makeResult({ ...base, success: true, gitignoreUpdated });
17831
+ } catch (error) {
17832
+ const msg = error instanceof Error ? error.message : String(error);
17833
+ return makeResult({ ...base, success: false, error: msg });
17834
+ }
17835
+ }
17836
+ function formatInitPortableMessage(result, dryRun) {
17837
+ if (!result.success) {
17838
+ return `init --portable failed: ${result.error ?? "unknown error"}
17839
+ `;
17840
+ }
17841
+ const lines = [];
17842
+ if (dryRun) {
17843
+ lines.push(`(dry-run) would create ${String(result.created.length)} entries under:`);
17844
+ lines.push(` ${result.absolutePath}`);
17845
+ return lines.join("\n") + "\n";
17846
+ }
17847
+ if (result.skipped) {
17848
+ lines.push(`\u2713 Already initialized: ${result.absolutePath}`);
17849
+ } else {
17850
+ lines.push(`\u2713 Created: ${result.absolutePath}`);
17851
+ }
17852
+ if (result.gitignoreUpdated) {
17853
+ lines.push(`\u2713 Added entry to .gitignore`);
17854
+ }
17855
+ lines.push("");
17856
+ lines.push("Activate by exporting:");
17857
+ lines.push(` export NEXUS_DATA_DIR=${result.absolutePath}`);
17858
+ lines.push("");
17859
+ lines.push("Or one-off:");
17860
+ lines.push(` NEXUS_DATA_DIR=${result.absolutePath} nexus-agents <cmd>`);
17861
+ return lines.join("\n") + "\n";
17862
+ }
17714
17863
 
17715
17864
  // src/mcp/tools/dev-pipeline-tool.ts
17716
17865
  import { z as z9 } from "zod";
@@ -18668,7 +18817,7 @@ function logFinalEventBusStats(logger17) {
18668
18817
  // src/cli-orchestrator.ts
18669
18818
  import * as readline2 from "readline";
18670
18819
  function runOrchestratorRepl(options, logger17) {
18671
- return new Promise((resolve14) => {
18820
+ return new Promise((resolve15) => {
18672
18821
  const rl = readline2.createInterface({
18673
18822
  input: process.stdin,
18674
18823
  output: process.stdout,
@@ -18704,7 +18853,7 @@ function runOrchestratorRepl(options, logger17) {
18704
18853
  });
18705
18854
  rl.on("close", () => {
18706
18855
  logger17.info("Orchestrator REPL closed");
18707
- resolve14();
18856
+ resolve15();
18708
18857
  });
18709
18858
  });
18710
18859
  }
@@ -20523,8 +20672,8 @@ function printFirstRunHint() {
20523
20672
  const isTTY = process.stderr.isTTY;
20524
20673
  if (!isTTY) return;
20525
20674
  const dataDir = getNexusDataDir();
20526
- const hasConfig = existsSync18("./nexus-agents.yaml") || existsSync18("./nexus-agents.yml");
20527
- if (existsSync18(dataDir) || hasConfig) return;
20675
+ const hasConfig = existsSync19("./nexus-agents.yaml") || existsSync19("./nexus-agents.yml");
20676
+ if (existsSync19(dataDir) || hasConfig) return;
20528
20677
  process.stderr.write(
20529
20678
  "\n\x1B[36mnexus-agents\x1B[0m: First time? Run \x1B[1mnexus-agents setup\x1B[0m to configure.\n\n"
20530
20679
  );
@@ -20690,6 +20839,23 @@ async function handleDoctorCommand(args) {
20690
20839
  }
20691
20840
  process.exit(exitCode === 0 ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED);
20692
20841
  }
20842
+ function handleInitCommand(args) {
20843
+ if (args.options.portable !== true) {
20844
+ process.stderr.write(
20845
+ "Usage: nexus-agents init --portable [path] [--force] [--dry-run] [--gitignore]\nBootstraps a workspace-local nexus-agents data directory.\n"
20846
+ );
20847
+ process.exit(EXIT_CODES.INVALID_ARGS);
20848
+ }
20849
+ const targetPath = args.positionals[1];
20850
+ const result = initPortable({
20851
+ ...targetPath !== void 0 && targetPath !== "" ? { path: targetPath } : {},
20852
+ force: args.options.force,
20853
+ dryRun: args.options.dryRun,
20854
+ gitignore: args.options.gitignore ?? false
20855
+ });
20856
+ process.stdout.write(formatInitPortableMessage(result, args.options.dryRun));
20857
+ process.exit(result.success ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED);
20858
+ }
20693
20859
  async function handleSetupCommandAsync(args) {
20694
20860
  if (args.options.customApi !== void 0 && args.options.customApi !== "") {
20695
20861
  const exitCode2 = await runCustomApiSetup(args);
@@ -22163,7 +22329,7 @@ function handleStatusCommand2(args) {
22163
22329
 
22164
22330
  // src/cli/scenario-command.ts
22165
22331
  import { readdir as readdir4 } from "fs/promises";
22166
- import { join as join14, resolve as resolve13 } from "path";
22332
+ import { join as join15, resolve as resolve14 } from "path";
22167
22333
 
22168
22334
  // src/testing/e2e/scenario-runner.ts
22169
22335
  import { readFile as readFile7 } from "fs/promises";
@@ -22323,7 +22489,7 @@ function checkCircularDependencies(workflow) {
22323
22489
  var defaultStubFactory = {
22324
22490
  createAgentStub(agentType, action) {
22325
22491
  return async (inputs) => {
22326
- await new Promise((resolve14) => setTimeout(resolve14, 10));
22492
+ await new Promise((resolve15) => setTimeout(resolve15, 10));
22327
22493
  return {
22328
22494
  stepId: `${agentType}-${action}`,
22329
22495
  status: "success",
@@ -22482,7 +22648,7 @@ function createScenarioRunner(stubFactory) {
22482
22648
  }
22483
22649
 
22484
22650
  // src/cli/scenario-command.ts
22485
- var FIXTURES_DIR = resolve13(import.meta.dirname, "../testing/e2e/fixtures");
22651
+ var FIXTURES_DIR = resolve14(import.meta.dirname, "../testing/e2e/fixtures");
22486
22652
  var SCENARIO_SUFFIX = ".scenario.yaml";
22487
22653
  async function listScenarios() {
22488
22654
  try {
@@ -22533,7 +22699,7 @@ async function handleRun(args) {
22533
22699
  process.exit(EXIT_CODES.SERVER_START_FAILED);
22534
22700
  }
22535
22701
  const runner = createScenarioRunner();
22536
- const fixturePath = join14(FIXTURES_DIR, `${name}${SCENARIO_SUFFIX}`);
22702
+ const fixturePath = join15(FIXTURES_DIR, `${name}${SCENARIO_SUFFIX}`);
22537
22703
  try {
22538
22704
  const fixture = await runner.loadFixture(fixturePath);
22539
22705
  const result = await runner.run(fixture);
@@ -22796,6 +22962,8 @@ var SYNC_COMMAND_HANDLERS = {
22796
22962
  status: handleStatusCommand2,
22797
22963
  // Issue #1023: Warm-Up Command
22798
22964
  "warm-up": handleWarmUpCommand,
22965
+ // #2305: Init Portable Command
22966
+ init: handleInitCommand,
22799
22967
  "e2e-eval": handleE2EEvalCommand,
22800
22968
  "routing-ab": handleRoutingABCommand,
22801
22969
  "memory-eval": handleMemoryEvalCommand,