@elizaos/cli 1.3.2 → 1.4.2

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 (122) hide show
  1. package/README.md +46 -0
  2. package/dist/{bun-exec-6CQHTS4F.js → bun-exec-ULMPAIQC.js} +1 -1
  3. package/dist/{chunk-E6XYTE3A.js → chunk-D3QSET5H.js} +69 -72
  4. package/dist/{chunk-FDEDLANP.js → chunk-FQYWRHLX.js} +1 -1
  5. package/dist/{chunk-T2QDIXGU.js → chunk-FSSUAWXQ.js} +3 -3
  6. package/dist/{chunk-D3Q2UZLZ.js → chunk-I4L4T7QX.js} +1 -1
  7. package/dist/{chunk-5GUS4CFO.js → chunk-SMZBJQJR.js} +1 -1
  8. package/dist/commands/agent/actions/index.js +3 -3
  9. package/dist/commands/agent/index.js +3 -3
  10. package/dist/commands/create/actions/index.js +4 -4
  11. package/dist/commands/create/index.js +5 -5
  12. package/dist/index.js +134 -109
  13. package/dist/{plugin-creator-H26ZLR6H.js → plugin-creator-TCUFII32.js} +2 -2
  14. package/dist/{registry-433S5F3Y.js → registry-RF6PW3EN.js} +3 -3
  15. package/dist/templates/plugin-quick-starter/README.md +52 -10
  16. package/dist/templates/plugin-quick-starter/package.json +2 -2
  17. package/dist/templates/plugin-quick-starter/src/__tests__/e2e/README.md +140 -0
  18. package/dist/templates/plugin-quick-starter/src/__tests__/e2e/plugin-quick-starter.e2e.ts +339 -0
  19. package/dist/templates/plugin-quick-starter/src/__tests__/plugin.test.ts +55 -17
  20. package/dist/templates/plugin-quick-starter/src/plugin.ts +14 -14
  21. package/dist/templates/plugin-starter/README.md +124 -49
  22. package/dist/templates/plugin-starter/package.json +2 -2
  23. package/dist/templates/plugin-starter/src/__tests__/e2e/README.md +44 -9
  24. package/{templates/plugin-starter/src/__tests__/e2e/starter-plugin.ts → dist/templates/plugin-starter/src/__tests__/e2e/plugin-starter.e2e.ts} +13 -20
  25. package/dist/templates/plugin-starter/src/plugin.ts +5 -7
  26. package/dist/templates/project-starter/README.md +24 -11
  27. package/dist/templates/project-starter/package.json +4 -4
  28. package/dist/templates/project-starter/src/__tests__/actions.test.ts +2 -2
  29. package/dist/templates/project-starter/src/__tests__/e2e/README.md +103 -0
  30. package/dist/templates/project-starter/src/__tests__/e2e/project-starter.e2e.ts +575 -0
  31. package/dist/templates/project-starter/src/__tests__/integration.test.ts +1 -1
  32. package/dist/templates/project-starter/src/__tests__/models.test.ts +3 -3
  33. package/dist/templates/project-starter/src/__tests__/plugin.test.ts +3 -3
  34. package/dist/templates/project-starter/src/__tests__/provider.test.ts +2 -2
  35. package/dist/templates/project-starter/src/index.ts +4 -3
  36. package/dist/templates/project-starter/src/plugin.ts +5 -5
  37. package/dist/templates/project-tee-starter/README.md +44 -5
  38. package/dist/templates/project-tee-starter/package.json +4 -4
  39. package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/build-order.test.ts +1 -1
  40. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/character.test.ts +1 -1
  41. package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/config.test.ts +1 -1
  42. package/dist/templates/project-tee-starter/src/__tests__/e2e/README.md +128 -0
  43. package/dist/templates/project-tee-starter/src/__tests__/e2e/project-tee-starter.e2e.ts +280 -0
  44. package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/env.test.ts +1 -1
  45. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/error-handling.test.ts +2 -2
  46. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/events.test.ts +1 -1
  47. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/file-structure.test.ts +2 -2
  48. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/integration.test.ts +2 -2
  49. package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/models.test.ts +1 -1
  50. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/plugin.test.ts +1 -1
  51. package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/provider.test.ts +2 -2
  52. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/routes.test.ts +1 -1
  53. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/tee-validation.test.ts +1 -1
  54. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/test-utils.ts +2 -2
  55. package/{templates/project-tee-starter → dist/templates/project-tee-starter/src}/__tests__/vite-config-utils.ts +14 -2
  56. package/dist/templates/project-tee-starter/src/index.ts +2 -0
  57. package/dist/templates/project-tee-starter/src/plugin.ts +19 -7
  58. package/dist/{utils-DBLSDYBF.js → utils-5HPZSIF6.js} +3 -3
  59. package/package.json +6 -6
  60. package/templates/plugin-quick-starter/README.md +52 -10
  61. package/templates/plugin-quick-starter/package.json +2 -2
  62. package/templates/plugin-quick-starter/src/__tests__/e2e/README.md +140 -0
  63. package/templates/plugin-quick-starter/src/__tests__/e2e/plugin-quick-starter.e2e.ts +339 -0
  64. package/templates/plugin-quick-starter/src/__tests__/plugin.test.ts +55 -17
  65. package/templates/plugin-quick-starter/src/plugin.ts +14 -14
  66. package/templates/plugin-starter/README.md +124 -49
  67. package/templates/plugin-starter/package.json +2 -2
  68. package/templates/plugin-starter/src/__tests__/e2e/README.md +44 -9
  69. package/{dist/templates/plugin-starter/src/__tests__/e2e/starter-plugin.ts → templates/plugin-starter/src/__tests__/e2e/plugin-starter.e2e.ts} +13 -20
  70. package/templates/plugin-starter/src/plugin.ts +5 -7
  71. package/templates/project-starter/README.md +24 -11
  72. package/templates/project-starter/package.json +4 -4
  73. package/templates/project-starter/src/__tests__/actions.test.ts +2 -2
  74. package/templates/project-starter/src/__tests__/e2e/README.md +103 -0
  75. package/templates/project-starter/src/__tests__/e2e/project-starter.e2e.ts +575 -0
  76. package/templates/project-starter/src/__tests__/integration.test.ts +1 -1
  77. package/templates/project-starter/src/__tests__/models.test.ts +3 -3
  78. package/templates/project-starter/src/__tests__/plugin.test.ts +3 -3
  79. package/templates/project-starter/src/__tests__/provider.test.ts +2 -2
  80. package/templates/project-starter/src/index.ts +4 -3
  81. package/templates/project-starter/src/plugin.ts +5 -5
  82. package/templates/project-tee-starter/README.md +44 -5
  83. package/templates/project-tee-starter/package.json +4 -4
  84. package/templates/project-tee-starter/{__tests__ → src/__tests__}/build-order.test.ts +1 -1
  85. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/character.test.ts +1 -1
  86. package/templates/project-tee-starter/{__tests__ → src/__tests__}/config.test.ts +1 -1
  87. package/templates/project-tee-starter/src/__tests__/e2e/README.md +128 -0
  88. package/templates/project-tee-starter/src/__tests__/e2e/project-tee-starter.e2e.ts +280 -0
  89. package/templates/project-tee-starter/{__tests__ → src/__tests__}/env.test.ts +1 -1
  90. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/error-handling.test.ts +2 -2
  91. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/events.test.ts +1 -1
  92. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/file-structure.test.ts +2 -2
  93. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/integration.test.ts +2 -2
  94. package/templates/project-tee-starter/{__tests__ → src/__tests__}/models.test.ts +1 -1
  95. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/plugin.test.ts +1 -1
  96. package/templates/project-tee-starter/{__tests__ → src/__tests__}/provider.test.ts +2 -2
  97. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/routes.test.ts +1 -1
  98. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/tee-validation.test.ts +1 -1
  99. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/test-utils.ts +2 -2
  100. package/{dist/templates/project-tee-starter → templates/project-tee-starter/src}/__tests__/vite-config-utils.ts +14 -2
  101. package/templates/project-tee-starter/src/index.ts +2 -0
  102. package/templates/project-tee-starter/src/plugin.ts +19 -7
  103. package/dist/templates/plugin-starter/src/tests.ts +0 -6
  104. package/dist/templates/project-starter/src/__tests__/e2e/index.ts +0 -14
  105. package/dist/templates/project-starter/src/__tests__/e2e/natural-language.test.ts +0 -246
  106. package/dist/templates/project-starter/src/__tests__/e2e/project.test.ts +0 -155
  107. package/dist/templates/project-starter/src/__tests__/e2e/starter-plugin.test.ts +0 -421
  108. package/dist/templates/project-tee-starter/e2e/project.test.ts +0 -38
  109. package/dist/templates/project-tee-starter/e2e/starter-plugin.test.ts +0 -92
  110. package/templates/plugin-starter/src/tests.ts +0 -6
  111. package/templates/project-starter/src/__tests__/e2e/index.ts +0 -14
  112. package/templates/project-starter/src/__tests__/e2e/natural-language.test.ts +0 -246
  113. package/templates/project-starter/src/__tests__/e2e/project.test.ts +0 -155
  114. package/templates/project-starter/src/__tests__/e2e/starter-plugin.test.ts +0 -421
  115. package/templates/project-tee-starter/e2e/project.test.ts +0 -38
  116. package/templates/project-tee-starter/e2e/starter-plugin.test.ts +0 -92
  117. /package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/actions.test.ts +0 -0
  118. /package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/frontend.test.ts +0 -0
  119. /package/dist/templates/project-tee-starter/{__tests__ → src/__tests__}/utils/core-test-utils.ts +0 -0
  120. /package/templates/project-tee-starter/{__tests__ → src/__tests__}/actions.test.ts +0 -0
  121. /package/templates/project-tee-starter/{__tests__ → src/__tests__}/frontend.test.ts +0 -0
  122. /package/templates/project-tee-starter/{__tests__ → src/__tests__}/utils/core-test-utils.ts +0 -0
package/README.md CHANGED
@@ -279,6 +279,19 @@ If any character files fail to load, ElizaOS will:
279
279
 
280
280
  Run tests for Eliza agent plugins and projects.
281
281
 
282
+ ElizaOS employs a dual testing strategy:
283
+
284
+ 1. **Component Tests** (`src/__tests__/*.test.ts`)
285
+
286
+ - Run with Bun's native test runner
287
+ - Fast, isolated tests using mocks
288
+ - Perfect for TDD and component logic
289
+
290
+ 2. **E2E Tests** (`src/__tests__/e2e/*.e2e.ts`)
291
+ - Run with ElizaOS custom test runner
292
+ - Real runtime with actual database (PGLite)
293
+ - Test complete user scenarios
294
+
282
295
  - **Subcommands:**
283
296
  - `component`: Run component tests (via bun:test)
284
297
  - `e2e`: Run end-to-end runtime tests
@@ -288,6 +301,13 @@ Run tests for Eliza agent plugins and projects.
288
301
  - `-n, --name <n>`: Filter tests by name (matches file names or test suite names)
289
302
  - `--skip-build`: Skip building before running tests
290
303
 
304
+ **E2E Test Structure:**
305
+
306
+ - Plugins export tests in `src/plugin.ts` via the `tests` array
307
+ - Projects export tests in `src/index.ts` via the `tests` array
308
+ - Test files follow naming convention: `[template-name].e2e.ts`
309
+ - Each e2e folder should have a README explaining the testing approach
310
+
291
311
  ### Trusted Execution Environment (TEE) Management
292
312
 
293
313
  #### `elizaos tee phala <subcommand>`
@@ -650,6 +670,19 @@ Plugins extend the functionality of ElizaOS agents by providing additional capab
650
670
  elizaos test e2e
651
671
  ```
652
672
 
673
+ **E2E Test Structure:**
674
+
675
+ ```
676
+ plugin-my-plugin/
677
+ ├── src/
678
+ │ ├── __tests__/
679
+ │ │ ├── e2e/
680
+ │ │ │ ├── plugin-my-plugin.e2e.ts # E2E test suite
681
+ │ │ │ └── README.md # E2E test documentation
682
+ │ │ └── *.test.ts # Component unit tests
683
+ │ └── plugin.ts # Export tests here: tests: [MyPluginTestSuite]
684
+ ```
685
+
653
686
  6. **Publish your plugin**:
654
687
 
655
688
  ```bash
@@ -765,6 +798,19 @@ Projects contain agent configurations and code for building agent-based applicat
765
798
  elizaos test --port 4000 --name specific-test
766
799
  ```
767
800
 
801
+ **E2E Test Structure for Projects:**
802
+
803
+ ```
804
+ my-agent-project/
805
+ ├── src/
806
+ │ ├── __tests__/
807
+ │ │ ├── e2e/
808
+ │ │ │ ├── project-my-agent.e2e.ts # E2E test suite
809
+ │ │ │ └── README.md # E2E test documentation
810
+ │ │ └── *.test.ts # Component unit tests
811
+ │ └── index.ts # Export tests here: tests: [MyProjectTestSuite]
812
+ ```
813
+
768
814
  8. **Development workflow**:
769
815
 
770
816
  ```bash
@@ -5,7 +5,7 @@ import {
5
5
  bunExecInherit,
6
6
  bunExecSimple,
7
7
  commandExists
8
- } from "./chunk-D3Q2UZLZ.js";
8
+ } from "./chunk-I4L4T7QX.js";
9
9
  import "./chunk-3RG5ZIWI.js";
10
10
  export {
11
11
  ProcessExecutionError,
@@ -2,7 +2,7 @@ import {
2
2
  displayBunInstallationTipCompact,
3
3
  emoji,
4
4
  runBunCommand
5
- } from "./chunk-FDEDLANP.js";
5
+ } from "./chunk-FQYWRHLX.js";
6
6
  import {
7
7
  createApiClientConfig,
8
8
  getAgentRuntimeUrl,
@@ -13,7 +13,7 @@ import {
13
13
  bunExecInherit,
14
14
  bunExecSimple,
15
15
  commandExists
16
- } from "./chunk-D3Q2UZLZ.js";
16
+ } from "./chunk-I4L4T7QX.js";
17
17
  import {
18
18
  __require
19
19
  } from "./chunk-3RG5ZIWI.js";
@@ -119,7 +119,7 @@ async function isBunInstalled() {
119
119
  const result = await bunExec("bun", ["--version"], { stdio: "ignore" });
120
120
  return result.success;
121
121
  } catch (error) {
122
- logger.debug("Error checking if Bun is installed:", error);
122
+ logger.debug({ error }, "Error checking if Bun is installed:");
123
123
  return false;
124
124
  }
125
125
  }
@@ -210,9 +210,7 @@ var UserEnvironment = class _UserEnvironment {
210
210
  path: process.argv[1] || ""
211
211
  };
212
212
  } catch (error) {
213
- logger2.warn(
214
- `[UserEnvironment] Error getting CLI info: ${error instanceof Error ? error.message : String(error)}`
215
- );
213
+ logger2.warn({ error }, `[UserEnvironment] Error getting CLI info`);
216
214
  return {
217
215
  version: "0.0.0",
218
216
  name: "@elizaos/cli",
@@ -238,9 +236,7 @@ var UserEnvironment = class _UserEnvironment {
238
236
  version = stdout.trim();
239
237
  logger2.debug(`[UserEnvironment] Bun version: ${version}`);
240
238
  } catch (e) {
241
- logger2.debug(
242
- `[UserEnvironment] Could not get bun version: ${e instanceof Error ? e.message : String(e)}`
243
- );
239
+ logger2.debug({ error: e }, `[UserEnvironment] Could not get bun version:`);
244
240
  if (shouldAutoInstall()) {
245
241
  logger2.info(`${emoji.info("Attempting to automatically install Bun...")}`);
246
242
  const installSuccess = await autoInstallBun();
@@ -251,7 +247,8 @@ var UserEnvironment = class _UserEnvironment {
251
247
  logger2.debug(`[UserEnvironment] Bun version after auto-install: ${version}`);
252
248
  } catch (retryError) {
253
249
  logger2.error(
254
- `Failed to verify Bun installation after auto-install: ${retryError instanceof Error ? retryError.message : String(retryError)}`
250
+ { error: retryError },
251
+ "Failed to verify Bun installation after auto-install:"
255
252
  );
256
253
  }
257
254
  }
@@ -445,7 +442,7 @@ var UserEnvironment = class _UserEnvironment {
445
442
  }
446
443
  return "0.25.9";
447
444
  } catch (error) {
448
- logger2.warn(`Error getting package version for ${packageName}: ${error}`);
445
+ logger2.warn({ error, packageName }, `Error getting package version`);
449
446
  return "0.25.9";
450
447
  }
451
448
  }
@@ -462,7 +459,7 @@ var UserEnvironment = class _UserEnvironment {
462
459
  const pluginPackages = packagesDirEntries.filter((entry) => entry.isDirectory() && entry.name.startsWith("plugin-")).map((entry) => `@elizaos/${entry.name}`);
463
460
  return pluginPackages;
464
461
  } catch (error) {
465
- logger2.warn(`Error getting local packages: ${error}`);
462
+ logger2.warn({ error }, `Error getting local packages`);
466
463
  return [];
467
464
  }
468
465
  }
@@ -1766,11 +1763,10 @@ async function getElizaDirectories(targetProjectDir) {
1766
1763
  const projectRoot = targetProjectDir || paths.monorepoRoot || process.cwd();
1767
1764
  const elizaDir = targetProjectDir ? path9.resolve(targetProjectDir, ".eliza") : paths.elizaDir;
1768
1765
  const envFilePath = targetProjectDir ? path9.resolve(targetProjectDir, ".env") : paths.envFilePath;
1769
- logger9.debug("Eliza directories:", {
1770
- elizaDir,
1771
- projectRoot,
1772
- targetProjectDir: targetProjectDir || "none"
1773
- });
1766
+ logger9.debug(
1767
+ { elizaDir, projectRoot, targetProjectDir: targetProjectDir || "none" },
1768
+ "Eliza directories:"
1769
+ );
1774
1770
  const defaultElizaDbDir = path9.resolve(projectRoot, ".eliza", ".elizadb");
1775
1771
  const elizaDbDir = await resolvePgliteDir(void 0, defaultElizaDbDir, targetProjectDir);
1776
1772
  return { elizaDir, elizaDbDir, envFilePath };
@@ -1802,10 +1798,10 @@ async function setupEnvFile(envFilePath) {
1802
1798
  }
1803
1799
  }
1804
1800
  } catch (error) {
1805
- logger9.error("Error setting up .env file:", {
1806
- error: error instanceof Error ? error.message : String(error),
1807
- envFilePath
1808
- });
1801
+ logger9.error(
1802
+ { error: error instanceof Error ? error.message : String(error), envFilePath },
1803
+ "Error setting up .env file:"
1804
+ );
1809
1805
  throw error;
1810
1806
  }
1811
1807
  }
@@ -1831,16 +1827,15 @@ async function setupPgLite(dbDir, envPath, targetProjectDir) {
1831
1827
  const targetEnvPath = envPath || envFilePath;
1832
1828
  try {
1833
1829
  await ensureDir(targetDbDir);
1834
- logger9.debug("[PGLite] Created database directory:", targetDbDir);
1830
+ logger9.debug({ targetDbDir }, "[PGLite] Created database directory:");
1835
1831
  await setupEnvFile(targetEnvPath);
1836
1832
  await storePgliteDataDir(targetDbDir, targetEnvPath);
1837
1833
  logger9.success("PGLite configuration saved");
1838
1834
  } catch (error) {
1839
- logger9.error("Error setting up PGLite directory:", {
1840
- error: error instanceof Error ? error.message : String(error),
1841
- elizaDbDir,
1842
- envFilePath
1843
- });
1835
+ logger9.error(
1836
+ { error: error instanceof Error ? error.message : String(error), elizaDbDir, envFilePath },
1837
+ "Error setting up PGLite directory:"
1838
+ );
1844
1839
  throw error;
1845
1840
  }
1846
1841
  }
@@ -1859,7 +1854,7 @@ async function storePostgresUrl(url, envFilePath) {
1859
1854
  process.env.POSTGRES_URL = url;
1860
1855
  logger9.success("Postgres URL saved to configuration");
1861
1856
  } catch (error) {
1862
- logger9.error("Error saving database configuration:", error);
1857
+ logger9.error({ error }, "Error saving database configuration:");
1863
1858
  throw error;
1864
1859
  }
1865
1860
  }
@@ -1876,7 +1871,7 @@ async function storePgliteDataDir(dataDir, envFilePath) {
1876
1871
  process.env.PGLITE_DATA_DIR = dataDir;
1877
1872
  logger9.success("PGLite data directory saved to configuration");
1878
1873
  } catch (error) {
1879
- logger9.error("Error saving PGLite configuration:", error);
1874
+ logger9.error({ error }, "Error saving PGLite configuration:");
1880
1875
  throw error;
1881
1876
  }
1882
1877
  }
@@ -2762,7 +2757,7 @@ async function getGitHubCredentials() {
2762
2757
  }
2763
2758
  logger10.warn("Invalid GitHub token found in environment variables");
2764
2759
  }
2765
- const { getGitHubToken: getGitHubToken2 } = await import("./registry-433S5F3Y.js");
2760
+ const { getGitHubToken: getGitHubToken2 } = await import("./registry-RF6PW3EN.js");
2766
2761
  const token = await getGitHubToken2() || void 0;
2767
2762
  if (token) {
2768
2763
  const isValid2 = await validateGitHubToken(token);
@@ -3425,7 +3420,7 @@ async function stopAgent(opts) {
3425
3420
  process.exit(1);
3426
3421
  }
3427
3422
  try {
3428
- const { bunExec: bunExec2 } = await import("./bun-exec-6CQHTS4F.js");
3423
+ const { bunExec: bunExec2 } = await import("./bun-exec-ULMPAIQC.js");
3429
3424
  const patterns = [
3430
3425
  "(node|bun).*elizaos",
3431
3426
  "(node|bun).*eliza.*start",
@@ -3518,13 +3513,13 @@ function handleError(error) {
3518
3513
  logger12.error(colors3.red(String(error)));
3519
3514
  }
3520
3515
  } else {
3521
- logger12.error("An error occurred:", error);
3516
+ logger12.error({ error }, "An error occurred:");
3522
3517
  if (error instanceof Error) {
3523
- logger12.error("Error details:", error.message);
3524
- logger12.error("Stack trace:", error.stack);
3518
+ logger12.error({ message: error.message }, "Error details:");
3519
+ logger12.error({ stack: error.stack }, "Stack trace:");
3525
3520
  } else {
3526
- logger12.error("Unknown error type:", typeof error);
3527
- logger12.error("Error value:", error);
3521
+ logger12.error({ type: typeof error }, "Unknown error type:");
3522
+ logger12.error({ error }, "Error value:");
3528
3523
  }
3529
3524
  }
3530
3525
  process.exit(1);
@@ -4021,7 +4016,7 @@ function getCliDirectory() {
4021
4016
  }
4022
4017
  return null;
4023
4018
  } catch (error) {
4024
- logger17.error("Failed to determine CLI directory:", error);
4019
+ logger17.error({ error }, "Failed to determine CLI directory:");
4025
4020
  return null;
4026
4021
  }
4027
4022
  }
@@ -4178,7 +4173,7 @@ function isRunningFromLocalCli() {
4178
4173
  const isInLocalCli = path18.resolve(currentScriptPath) === path18.resolve(expectedLocalCliPath);
4179
4174
  return isInLocalCli;
4180
4175
  } catch (error) {
4181
- logger18.debug("Error checking if running from local CLI:", error);
4176
+ logger18.debug({ error }, "Error checking if running from local CLI:");
4182
4177
  return false;
4183
4178
  }
4184
4179
  }
@@ -4236,7 +4231,7 @@ async function delegateToLocalCli(localCliPath) {
4236
4231
  resolve2();
4237
4232
  });
4238
4233
  childProcess.on("error", (error) => {
4239
- logger18.error(`Failed to start local CLI: ${error.message}`);
4234
+ logger18.error({ message: error.message }, `Failed to start local CLI:`);
4240
4235
  reject(error);
4241
4236
  });
4242
4237
  const forwardSignal = (signal) => {
@@ -4535,10 +4530,10 @@ async function testPublishToNpm(cwd) {
4535
4530
  logger20.info("[\u2713] Have publish permissions");
4536
4531
  return true;
4537
4532
  } catch (error) {
4538
- logger20.error("Test failed:", error);
4533
+ logger20.error({ error }, "Test failed:");
4539
4534
  if (error instanceof Error) {
4540
- logger20.error(`Error message: ${error.message}`);
4541
- logger20.error(`Error stack: ${error.stack}`);
4535
+ logger20.error({ message: error.message }, "Error message:");
4536
+ logger20.error({ stack: error.stack }, "Error stack:");
4542
4537
  }
4543
4538
  return false;
4544
4539
  }
@@ -4633,7 +4628,7 @@ async function publishToNpm(cwd) {
4633
4628
  await bunExecInherit("npm", ["publish"], { cwd });
4634
4629
  return true;
4635
4630
  } catch (error) {
4636
- logger20.error("Failed to publish to npm:", error);
4631
+ logger20.error({ error }, "Failed to publish to npm:");
4637
4632
  return false;
4638
4633
  }
4639
4634
  }
@@ -4858,11 +4853,11 @@ import * as fs9 from "fs";
4858
4853
  import * as path20 from "path";
4859
4854
  import { pathToFileURL as pathToFileURL2 } from "url";
4860
4855
  var safeLogger = {
4861
- debug: logger21?.debug || console.log,
4862
- info: logger21?.info || console.log,
4863
- warn: logger21?.warn || console.warn,
4864
- error: logger21?.error || console.error,
4865
- success: logger21?.success || console.log
4856
+ debug: logger21?.debug?.bind(logger21) ?? console.debug,
4857
+ info: logger21?.info.bind(logger21) ?? console.log,
4858
+ warn: logger21?.warn.bind(logger21) ?? console.warn,
4859
+ error: logger21?.error?.bind(logger21) ?? console.error,
4860
+ success: logger21?.success?.bind(logger21) ?? console.log
4866
4861
  };
4867
4862
  var TestRunner = class {
4868
4863
  runtime;
@@ -4916,8 +4911,12 @@ var TestRunner = class {
4916
4911
  let processedFilter = filter;
4917
4912
  if (processedFilter.endsWith(".test.ts") || processedFilter.endsWith(".test.js")) {
4918
4913
  processedFilter = processedFilter.slice(0, -8);
4914
+ } else if (processedFilter.endsWith(".spec.ts") || processedFilter.endsWith(".spec.js")) {
4915
+ processedFilter = processedFilter.slice(0, -8);
4919
4916
  } else if (processedFilter.endsWith(".test")) {
4920
4917
  processedFilter = processedFilter.slice(0, -5);
4918
+ } else if (processedFilter.endsWith(".spec")) {
4919
+ processedFilter = processedFilter.slice(0, -5);
4921
4920
  }
4922
4921
  return name.toLowerCase().includes(processedFilter.toLowerCase());
4923
4922
  }
@@ -4991,9 +4990,9 @@ Running test suite: ${suite.name}`);
4991
4990
  export const myPlugin = {
4992
4991
  name: "my-plugin",
4993
4992
  description: "My awesome plugin",
4994
-
4993
+
4995
4994
  // ... other plugin properties ...
4996
-
4995
+
4997
4996
  tests: [
4998
4997
  {
4999
4998
  name: "Basic Tests",
@@ -5039,14 +5038,14 @@ export const myPlugin = {
5039
5038
  return;
5040
5039
  }
5041
5040
  try {
5042
- const e2eDir = path20.join(process.cwd(), "e2e");
5041
+ const e2eDir = path20.join(process.cwd(), "src", "__tests__", "e2e");
5043
5042
  if (!fs9.existsSync(e2eDir)) {
5044
- safeLogger.debug("No e2e directory found, skipping e2e tests");
5043
+ safeLogger.debug("No test files found in src/__tests__/e2e/, skipping e2e tests");
5045
5044
  return;
5046
5045
  }
5047
5046
  safeLogger.info("\nRunning e2e tests...");
5048
5047
  const walk = (dir) => fs9.readdirSync(dir, { withFileTypes: true }).flatMap(
5049
- (entry) => entry.isDirectory() ? walk(path20.join(dir, entry.name)) : entry.name.match(/\.test\.(t|j)sx?$/) ? [path20.join(dir, entry.name)] : []
5048
+ (entry) => entry.isDirectory() ? walk(path20.join(dir, entry.name)) : entry.name.match(/\.(test|spec|e2e)\.(ts|js|tsx|jsx)$/) ? [path20.join(dir, entry.name)] : []
5050
5049
  );
5051
5050
  const testFiles = walk(e2eDir);
5052
5051
  if (testFiles.length === 0) {
@@ -5054,16 +5053,17 @@ export const myPlugin = {
5054
5053
  return;
5055
5054
  }
5056
5055
  safeLogger.info(`Found ${testFiles.length} e2e test files`);
5057
- const distE2eDir = path20.join(process.cwd(), "dist", "e2e");
5056
+ const distE2eDir = path20.join(process.cwd(), "dist", "__tests__", "e2e");
5058
5057
  const hasDistE2e = fs9.existsSync(distE2eDir);
5059
5058
  for (const testFile of testFiles) {
5060
5059
  try {
5061
5060
  const fileName = path20.basename(testFile);
5062
- const fileNameWithoutExt = path20.basename(testFile, ".test.ts");
5061
+ const fileNameWithoutExt = fileName.replace(/\.(test|spec|e2e)\.(ts|js|tsx|jsx)$/, "");
5063
5062
  safeLogger.info(`Loading test file: ${fileName}`);
5064
5063
  let moduleImportPath = testFile;
5065
5064
  if (hasDistE2e) {
5066
- const distFile = path20.join(distE2eDir, `${fileNameWithoutExt}.test.js`);
5065
+ const relativePath = path20.relative(e2eDir, testFile);
5066
+ const distFile = path20.join(distE2eDir, relativePath.replace(/\.ts$/, ".js"));
5067
5067
  if (fs9.existsSync(distFile)) {
5068
5068
  moduleImportPath = distFile;
5069
5069
  safeLogger.debug(`Using compiled version from ${distFile}`);
@@ -5074,7 +5074,7 @@ export const myPlugin = {
5074
5074
  }
5075
5075
  } else {
5076
5076
  safeLogger.warn(
5077
- `No dist/e2e directory found. E2E tests should be compiled first. Import may fail.`
5077
+ `No dist/__tests__/e2e directory found. E2E tests should be compiled first. Import may fail.`
5078
5078
  );
5079
5079
  }
5080
5080
  let testModule;
@@ -5311,9 +5311,7 @@ async function getLocalRegistryIndex() {
5311
5311
  }
5312
5312
  }
5313
5313
  } catch (error) {
5314
- logger22.debug(
5315
- `Failed to fetch registry from public URL: ${error instanceof Error ? error.message : String(error)}`
5316
- );
5314
+ logger22.debug({ error }, "Failed to fetch registry from public URL:");
5317
5315
  }
5318
5316
  try {
5319
5317
  if (existsSync18(REGISTRY_CACHE_FILE)) {
@@ -5323,9 +5321,7 @@ async function getLocalRegistryIndex() {
5323
5321
  return cachedRegistry;
5324
5322
  }
5325
5323
  } catch (error) {
5326
- logger22.debug(
5327
- `Failed to read registry cache: ${error instanceof Error ? error.message : String(error)}`
5328
- );
5324
+ logger22.debug({ error }, "Failed to read registry cache:");
5329
5325
  }
5330
5326
  const directoryInfo = detectDirectoryType(process.cwd());
5331
5327
  if (directoryInfo.monorepoRoot) {
@@ -5340,9 +5336,7 @@ async function getLocalRegistryIndex() {
5340
5336
  }
5341
5337
  return { ...DEFAULT_REGISTRY, ...localRegistry };
5342
5338
  } catch (error) {
5343
- logger22.debug(
5344
- `Failed to discover local plugins: ${error instanceof Error ? error.message : String(error)}`
5345
- );
5339
+ logger22.debug({ error }, "Failed to discover local plugins:");
5346
5340
  }
5347
5341
  }
5348
5342
  return DEFAULT_REGISTRY;
@@ -5532,13 +5526,14 @@ async function getPackageDetails(packageName) {
5532
5526
  try {
5533
5527
  return JSON.parse(text4);
5534
5528
  } catch {
5535
- logger22.warn(`Invalid JSON response received from registry for package ${packageName}:`, text4);
5529
+ logger22.warn(
5530
+ { packageName, text: text4 },
5531
+ `Invalid JSON response received from registry for package`
5532
+ );
5536
5533
  return null;
5537
5534
  }
5538
5535
  } catch (error) {
5539
- logger22.warn(
5540
- `Failed to fetch package details from registry: ${error instanceof Error ? error.message : String(error)}`
5541
- );
5536
+ logger22.warn({ error }, "Failed to fetch package details from registry:");
5542
5537
  return null;
5543
5538
  }
5544
5539
  }
@@ -5554,14 +5549,16 @@ async function getBestPluginVersion(packageName, runtimeVersion) {
5554
5549
  const [packageMajor, packageMinor] = packageDetails.runtimeVersion.split(".").map(Number);
5555
5550
  if (runtimeMajor !== packageMajor) {
5556
5551
  logger22.warn(
5557
- `Plugin ${packageName} was built for runtime v${packageDetails.runtimeVersion}, but you're using v${runtimeVersion}`
5552
+ { packageName, expected: packageDetails.runtimeVersion, actual: runtimeVersion },
5553
+ `Plugin runtime version mismatch`
5558
5554
  );
5559
5555
  logger22.warn("This may cause compatibility issues.");
5560
5556
  return packageDetails.latestVersion;
5561
5557
  }
5562
5558
  if (runtimeMinor !== packageMinor) {
5563
5559
  logger22.warn(
5564
- `Plugin ${packageName} was built for runtime v${packageDetails.runtimeVersion}, you're using v${runtimeVersion}`
5560
+ { packageName, expected: packageDetails.runtimeVersion, actual: runtimeVersion },
5561
+ `Plugin runtime minor version differs`
5565
5562
  );
5566
5563
  }
5567
5564
  return packageDetails.latestVersion;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  bunExec,
3
3
  bunExecInherit
4
- } from "./chunk-D3Q2UZLZ.js";
4
+ } from "./chunk-I4L4T7QX.js";
5
5
 
6
6
  // src/utils/emoji-handler.ts
7
7
  import { logger } from "@elizaos/core";
@@ -9,11 +9,11 @@ import {
9
9
  selectEmbeddingModel,
10
10
  validateCreateOptions,
11
11
  validateProjectName
12
- } from "./chunk-5GUS4CFO.js";
12
+ } from "./chunk-SMZBJQJR.js";
13
13
  import {
14
14
  displayBanner,
15
15
  handleError
16
- } from "./chunk-E6XYTE3A.js";
16
+ } from "./chunk-D3QSET5H.js";
17
17
 
18
18
  // src/commands/create/index.ts
19
19
  import { Command } from "commander";
@@ -195,7 +195,7 @@ var create = new Command("create").description("Create a new ElizaOS project, pl
195
195
  const errorType = formatProjectType(projectType || "project");
196
196
  clack.cancel(`Failed to create ${errorType}.`);
197
197
  }
198
- logger.error("Create command failed:", error);
198
+ logger.error({ error }, "Create command failed:");
199
199
  handleError(error);
200
200
  process.exit(1);
201
201
  }
@@ -110,7 +110,7 @@ async function bunExec(command, args = [], options = {}) {
110
110
  if (!success && options.stdio !== "ignore") {
111
111
  logger.debug(`[bunExec] Command failed with exit code ${exitCode}`);
112
112
  if (stderr) {
113
- logger.debug(`[bunExec] stderr: ${stderr}`);
113
+ logger.debug({ stderr }, `[bunExec] stderr:`);
114
114
  }
115
115
  }
116
116
  return {
@@ -15,7 +15,7 @@ import {
15
15
  promptAndStorePostgresUrl,
16
16
  runTasks,
17
17
  setupPgLite
18
- } from "./chunk-E6XYTE3A.js";
18
+ } from "./chunk-D3QSET5H.js";
19
19
 
20
20
  // src/characters/eliza.ts
21
21
  var baseCharacter = {
@@ -5,10 +5,10 @@ import {
5
5
  setAgentConfig,
6
6
  startAgent,
7
7
  stopAgent
8
- } from "../../../chunk-E6XYTE3A.js";
9
- import "../../../chunk-FDEDLANP.js";
8
+ } from "../../../chunk-D3QSET5H.js";
9
+ import "../../../chunk-FQYWRHLX.js";
10
10
  import "../../../chunk-GXWWPFBO.js";
11
- import "../../../chunk-D3Q2UZLZ.js";
11
+ import "../../../chunk-I4L4T7QX.js";
12
12
  import "../../../chunk-3RG5ZIWI.js";
13
13
  export {
14
14
  clearAgentMemories,
@@ -2,13 +2,13 @@ import {
2
2
  agent,
3
3
  getAgents,
4
4
  resolveAgentId
5
- } from "../../chunk-E6XYTE3A.js";
6
- import "../../chunk-FDEDLANP.js";
5
+ } from "../../chunk-D3QSET5H.js";
6
+ import "../../chunk-FQYWRHLX.js";
7
7
  import {
8
8
  getAgentRuntimeUrl,
9
9
  getAgentsBaseUrl
10
10
  } from "../../chunk-GXWWPFBO.js";
11
- import "../../chunk-D3Q2UZLZ.js";
11
+ import "../../chunk-I4L4T7QX.js";
12
12
  import "../../chunk-3RG5ZIWI.js";
13
13
  export {
14
14
  agent,
@@ -8,11 +8,11 @@ import {
8
8
  setupAIModelConfig,
9
9
  setupEmbeddingModelConfig,
10
10
  setupProjectEnvironment
11
- } from "../../../chunk-5GUS4CFO.js";
12
- import "../../../chunk-E6XYTE3A.js";
13
- import "../../../chunk-FDEDLANP.js";
11
+ } from "../../../chunk-SMZBJQJR.js";
12
+ import "../../../chunk-D3QSET5H.js";
13
+ import "../../../chunk-FQYWRHLX.js";
14
14
  import "../../../chunk-GXWWPFBO.js";
15
- import "../../../chunk-D3Q2UZLZ.js";
15
+ import "../../../chunk-I4L4T7QX.js";
16
16
  import "../../../chunk-3RG5ZIWI.js";
17
17
  export {
18
18
  createAgent,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  create
3
- } from "../../chunk-T2QDIXGU.js";
4
- import "../../chunk-5GUS4CFO.js";
5
- import "../../chunk-E6XYTE3A.js";
6
- import "../../chunk-FDEDLANP.js";
3
+ } from "../../chunk-FSSUAWXQ.js";
4
+ import "../../chunk-SMZBJQJR.js";
5
+ import "../../chunk-D3QSET5H.js";
6
+ import "../../chunk-FQYWRHLX.js";
7
7
  import "../../chunk-GXWWPFBO.js";
8
- import "../../chunk-D3Q2UZLZ.js";
8
+ import "../../chunk-I4L4T7QX.js";
9
9
  import "../../chunk-3RG5ZIWI.js";
10
10
  export {
11
11
  create