Skip to content

Commit c2bc199

Browse files
author
Shaw
committed
docs: align project scaffolding references
1 parent 7eb9527 commit c2bc199

17 files changed

Lines changed: 236 additions & 981 deletions

File tree

README.md

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,42 @@ For complete guides and API references, visit our official **[documentation](htt
2323

2424
> **Looking for plugins?** Browse the community plugin registry at **[elizaOS-plugins/registry](https://github.com/elizaOS-plugins/registry)** for a full list of available ElizaOS plugins.
2525
26-
## Framework vs. application
26+
## Framework, Projects, And App Plugins
2727

28-
elizaOS is two things stacked together. Knowing which one you're working with makes everything else easier.
28+
elizaOS is a framework plus packages built on top of it. Knowing which layer
29+
you're working with keeps projects, plugins, and app surfaces from getting
30+
mixed together.
2931

3032
**The framework** is the runtime: `@elizaos/core`, the agent loop, the plugin model (actions, providers, services, evaluators), the message/memory/state primitives, and the model-agnostic LLM layer. If you depend on `@elizaos/core` from your own code, you are using the framework.
3133

32-
**An application** is a product *built on* the framework. [`apps/app-companion`](apps/app-companion), [`apps/app-browser`](apps/app-browser), [`apps/app-knowledge`](apps/app-knowledge), [`apps/app-phone`](apps/app-phone), and the rest of [`apps/`](apps) are first-party examples. Each is a self-contained package with its own UI, runtime plugin, data model, and deployment story. They share the framework, not the implementation.
34+
**A project** is a deployable product workspace built on the framework. A
35+
generated project owns its branded app shell, usually under `apps/app` inside
36+
that project workspace.
37+
38+
**An app plugin** is a runtime plugin that also contributes an app surface inside
39+
Eliza. First-party app plugins live under [`plugins/app-*`](plugins), keep npm
40+
names like `@elizaos/app-companion`, and are loaded by package name. They are
41+
plugins, not top-level repo applications.
3342

3443
The same split shows up in the directory tree:
3544

3645
```
37-
packages/ ← FRAMEWORK
46+
packages/ ← framework and shared packages
3847
core/ # @elizaos/core — runtime, types, agent loop
3948
agent/ # @elizaos/agent — AgentRuntime + plugin loader
4049
app-core/ # API + dashboard host
4150
elizaos/ # the `elizaos` CLI
4251
prompts/ # shared prompt scaffolding
4352
ui/ # shared React component library
44-
examples/ # 30+ standalone examples (chat, discord, mcp, )
45-
benchmarks/ # 30+ evaluation suites (gaia, swe_bench, tau-bench, )
53+
examples/ # standalone examples (chat, discord, mcp, ...)
54+
benchmarks/ # evaluation suites (gaia, swe_bench, tau-bench, ...)
4655
47-
apps/ ← APPLICATIONS
56+
plugins/ ← runtime plugins and app plugins
4857
app-companion/ app-browser/ app-knowledge/ app-phone/
4958
app-task-coordinator/ app-training/ app-form/ ...
59+
plugin-discord/ plugin-openai/ plugin-sql/ ...
5060
51-
plugins/ ← runtime plugins (connectors + capabilities)
52-
templates/ ← scaffolds used by `APP create` / `PLUGIN create` flows
61+
templates/ ← scaffolds used by project and plugin create flows
5362
```
5463

5564
A *plugin* sits between the two: framework-shaped (registers actions/providers/services with the runtime) but shipped and consumed like a product. Community plugins are listed at [elizaOS-plugins/registry](https://github.com/elizaOS-plugins/registry).
@@ -60,26 +69,26 @@ A *plugin* sits between the two: framework-shaped (registers actions/providers/s
6069
|---|---|
6170
| Try an agent in 5 minutes | [CLI quick start](#cli-quick-start) |
6271
| Use the runtime from your own TypeScript code (no CLI, no UI) | [Standalone usage](#standalone-usage) |
63-
| Build a new agent application | [Create a new app](#create-a-new-app) |
72+
| Build a new deployable product | [Create a new project](#create-a-new-project) |
6473
| Build a runtime plugin (action / provider / service) | [Create a new plugin](#create-a-new-plugin) |
6574
| See how others did it | [Examples](#examples) |
6675
| Evaluate or benchmark an agent | [Benchmarks](#benchmarks) |
6776
| Read the docs | [docs.elizaos.ai](https://docs.elizaos.ai/) |
6877

6978
## CLI quick start
7079

71-
**Prerequisites:** [Node.js v23+](https://nodejs.org/), [bun](https://bun.sh/docs/installation). On Windows, use [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual).
80+
**Prerequisites:** [Node.js v24+](https://nodejs.org/), [bun](https://bun.sh/docs/installation). On Windows, use [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual).
7281

7382
```bash
74-
bun install -g elizaos@alpha
75-
elizaos create my-first-agent # interactive — pick `fullstack-app` for the standard path
83+
bun add -g elizaos
84+
elizaos create my-first-agent --template project
7685
cd my-first-agent
7786
# add OPENAI_API_KEY=... to .env (or your provider's key)
7887
bun install
7988
bun run dev
8089
```
8190

82-
The scaffolded `fullstack-app` exposes the runtime scripts you'll use day-to-day: `bun run dev`, `bun run build`, `bun run test`, `bun run typecheck`, `bun run lint`, `bun run verify`. The `elizaos` CLI itself is intentionally minimal — its job is scaffolding (`elizaos create`) and template upgrades (`elizaos upgrade`). For a list of available templates, run `elizaos info`.
91+
The generated project exposes the runtime scripts you'll use day-to-day: `bun run dev`, `bun run build`, `bun run test`, `bun run typecheck`, `bun run lint`, `bun run verify`. The `elizaos` CLI itself is intentionally minimal — its job is scaffolding (`elizaos create`) and template upgrades (`elizaos upgrade`). For a list of available templates, run `elizaos info`.
8392

8493
Full reference: `elizaos --help` or `elizaos <command> --help`.
8594

@@ -100,32 +109,34 @@ Nearly every surface has a working example in [`packages/examples/`](packages/ex
100109

101110
> **About the partial clone.** `--filter=blob:none` gives you the full history but fetches file contents on demand — about 10× smaller. `git log`, branches, and `git checkout` work normally; `git blame` and `git log -p` will fetch on first use. To upgrade later: `git config --unset remote.origin.partialclonefilter && git fetch --refetch`. For one-off CI, `--depth=1 --single-branch` is even smaller.
102111
103-
## Create a new app
112+
## Create a new project
104113

105-
An *application* is a self-contained product on top of the runtime: UI, runtime plugin, metadata. Two paths:
114+
A project is a self-contained product workspace on top of the runtime: branded
115+
app shell, local eliza checkout, app plugin selection, platform config, and
116+
deployment scripts. Two paths:
106117

107118
**1. CLI scaffold (recommended).**
108119

109120
```bash
110-
elizaos create my-app -t fullstack-app
121+
elizaos create my-app --template project
111122
cd my-app
112123
bun install
113124
bun run dev
114125
```
115126

116-
`fullstack-app` lays out a full workspace with a local eliza checkout, default plugins (`plugin-sql`, `plugin-elizacloud`, `plugin-local-ai`, `plugin-ollama`), and a Vite + React UI you can edit immediately.
127+
The project template lays out a full workspace with a local eliza checkout, default plugins (`plugin-sql`, `plugin-elizacloud`, `plugin-local-ai`, `plugin-ollama`), and a Vite + React UI you can edit immediately.
117128

118129
**2. Copy a template directly.** [`templates/min-app/`](templates/min-app) is the smallest possible app — Vite + React UI, a runtime `Plugin` with one action, the `elizaos.app` metadata block in `package.json`, and a vitest smoke test. Read [`templates/min-app/SCAFFOLD.md`](templates/min-app/SCAFFOLD.md) for the placeholders to replace and the verification contract.
119130

120-
For real-world references, browse [`apps/`](apps). A few starting points by complexity:
131+
For first-party app plugin references, browse [`plugins/app-*`](plugins). A few starting points by complexity:
121132

122-
- [`app-companion`](apps/app-companion) — chat-first companion with a custom React UI.
123-
- [`app-browser`](apps/app-browser) — agent-driven browser automation.
124-
- [`app-knowledge`](apps/app-knowledge) — RAG over user documents.
125-
- [`app-phone`](apps/app-phone) — voice + telephony surface.
126-
- [`app-form`](apps/app-form) — form-driven data collection.
127-
- [`app-task-coordinator`](apps/app-task-coordinator) — multi-agent orchestration.
128-
- [`app-training`](apps/app-training) — trajectory capture + native prompt optimization.
133+
- [`app-companion`](plugins/app-companion) — chat-first companion with a custom React UI.
134+
- [`app-browser`](plugins/app-browser) — agent-driven browser automation.
135+
- [`app-knowledge`](plugins/app-knowledge) — RAG over user documents.
136+
- [`app-phone`](plugins/app-phone) — voice + telephony surface.
137+
- [`app-form`](plugins/app-form) — form-driven data collection.
138+
- [`app-task-coordinator`](plugins/app-task-coordinator) — multi-agent orchestration.
139+
- [`app-training`](plugins/app-training) — trajectory capture + native prompt optimization.
129140

130141
## Create a new plugin
131142

cloud/packages/content/agents.mdx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,16 @@ Response:
8686
### Using the CLI
8787

8888
```bash
89-
# Install the CLI
90-
bun add -g @elizaos/cli
89+
# Install the scaffolding CLI
90+
bun add -g elizaos
9191

92-
# Login to elizaOS Cloud
93-
elizaos login
92+
# Create a local project
93+
elizaos create research-assistant --template project
94+
cd research-assistant
9495

95-
# Deploy from character file
96-
elizaos deploy --character ./character.json
96+
# Run the generated project scripts
97+
bun install
98+
bun run dev
9799
```
98100

99101
</Tabs.Tab>

cloud/packages/content/installation.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Installation
3-
description: Install the elizaOS SDK and CLI tools for local development.
3+
description: Install the elizaOS SDK and scaffolding CLI for local development.
44
---
55

66
import { Tabs, Callout, Steps } from "@/docs/components";
@@ -29,10 +29,10 @@ Install the official elizaOS packages:
2929

3030
## CLI Installation
3131

32-
Install the elizaOS CLI for deployment and management:
32+
Install the elizaOS CLI for project and plugin scaffolding:
3333

3434
```bash
35-
bun add -g @elizaos/cli
35+
bun add -g elizaos
3636
```
3737

3838
Verify the installation:
@@ -45,7 +45,7 @@ elizaos --version
4545

4646
| Requirement | Version |
4747
| ----------- | ------------------ |
48-
| Node.js | 18.0+ |
48+
| Node.js | 24.0+ |
4949
| Bun | Latest |
5050
| TypeScript | 5.0+ (recommended) |
5151

@@ -55,7 +55,7 @@ elizaos --version
5555
### Initialize a New Project
5656

5757
```bash
58-
elizaos init my-agent
58+
elizaos create my-agent --template project
5959
cd my-agent
6060
```
6161

cloud/packages/content/quickstart.mdx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -250,29 +250,31 @@ print(completion['choices'][0]['message']['content'])
250250
251251
## Using the CLI
252252
253-
Deploy agents from your local elizaOS project.
253+
Create a local elizaOS project. Cloud deployment and hosted app registration use
254+
the dashboard, Cloud API, or SDK endpoints documented in the app and container
255+
sections.
254256
255257
<Steps>
256258
### Install the CLI
257259
258260
```bash
259-
bun add -g @elizaos/cli
261+
bun add -g elizaos
260262
```
261263

262-
### Login to elizaOS Cloud
264+
### Create a Project
263265

264266
```bash
265-
elizaos login
267+
elizaos create my-cloud-app --template project
268+
cd my-cloud-app
266269
```
267270

268-
### Deploy Your Agent
271+
### Run Locally
269272

270273
```bash
271-
elizaos deploy --character ./character.json
274+
bun install
275+
bun run dev
272276
```
273277

274-
This uploads your character configuration and deploys it to elizaOS Cloud.
275-
276278
</Steps>
277279

278280
## Environment Variables

packages/app-core/test/regression-matrix.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@
264264
"name": "e2e-test-harness",
265265
"globs": [
266266
"test/**",
267-
"eliza/apps/**/test/**",
267+
"eliza/plugins/app-*/test/**",
268268
"eliza/packages/app-core/test/**",
269269
"eliza/test/vitest/integration.config.ts",
270270
"eliza/test/vitest/e2e.config.ts"

packages/app-core/test/scripts/test-root-unit.mjs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ function collectTestFiles(...relativeRoots) {
6363
return files.sort();
6464
}
6565

66-
function collectAppTestFiles() {
67-
const appsRoot = path.join(repoRoot, "eliza", "apps");
68-
if (!fs.existsSync(appsRoot)) return [];
66+
function collectAppPluginTestFiles() {
67+
const appPluginsRoot = path.join(repoRoot, "eliza", "plugins");
68+
if (!fs.existsSync(appPluginsRoot)) return [];
6969

7070
return fs
71-
.readdirSync(appsRoot, { withFileTypes: true })
72-
.filter((entry) => entry.isDirectory())
73-
.flatMap((entry) => collectTestFiles(`eliza/apps/${entry.name}/test`));
71+
.readdirSync(appPluginsRoot, { withFileTypes: true })
72+
.filter((entry) => entry.isDirectory() && entry.name.startsWith("app-"))
73+
.flatMap((entry) => collectTestFiles(`eliza/plugins/${entry.name}/test`));
7474
}
7575

7676
function chunkFiles(label, files, chunkSize = 20) {
@@ -91,7 +91,7 @@ function chunkFiles(label, files, chunkSize = 20) {
9191
return chunks;
9292
}
9393

94-
const appTestFiles = collectAppTestFiles();
94+
const appTestFiles = collectAppPluginTestFiles();
9595
const lifeOpsSourceTestFiles = collectTestFiles("eliza/plugins/app-lifeops/src");
9696
const appsAndPluginsSourceTestFiles = [
9797
...collectTestFiles(

packages/app/vite.config.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const here = path.dirname(fileURLToPath(import.meta.url));
3737
const elizaRoot = path.resolve(here, "../..");
3838
const nativePluginsRoot = path.join(elizaRoot, "packages/native-plugins");
3939
const appCoreSrcRoot = path.join(elizaRoot, "packages/app-core/src");
40+
const pluginSqlSrcRoot = path.join(elizaRoot, "plugins/plugin-sql/typescript");
4041
const appCoreNativePluginEntrypoints = path.join(
4142
appCoreSrcRoot,
4243
"platform/native-plugin-entrypoints.ts",
@@ -110,8 +111,12 @@ function createWorkspacePackageAliases(packageRoots: string[]) {
110111
const aliases = [];
111112
for (const packageRoot of packageRoots) {
112113
if (!fs.existsSync(packageRoot)) continue;
114+
const packageRootName = path.basename(packageRoot);
113115
for (const entry of fs.readdirSync(packageRoot, { withFileTypes: true })) {
114116
if (!entry.isDirectory()) continue;
117+
if (packageRootName === "plugins" && !entry.name.startsWith("app-")) {
118+
continue;
119+
}
115120
const pkgPath = path.join(packageRoot, entry.name, "package.json");
116121
if (!fs.existsSync(pkgPath)) continue;
117122
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
@@ -1487,6 +1492,21 @@ export default defineConfig({
14871492
find: /^@elizaos\/app-core\/platform\/native-plugin-entrypoints\.js$/,
14881493
replacement: appCoreNativePluginEntrypoints,
14891494
},
1495+
// Keep plugin-sql subpath imports on the repo-local source layout. Some
1496+
// cached package copies still describe the old src/ layout, which makes
1497+
// renderer builds fail before the server-only imports can be stubbed.
1498+
{
1499+
find: /^@elizaos\/plugin-sql\/drizzle$/,
1500+
replacement: path.join(pluginSqlSrcRoot, "drizzle/index.ts"),
1501+
},
1502+
{
1503+
find: /^@elizaos\/plugin-sql\/schema$/,
1504+
replacement: path.join(pluginSqlSrcRoot, "schema/index.ts"),
1505+
},
1506+
{
1507+
find: /^@elizaos\/plugin-sql\/types$/,
1508+
replacement: path.join(pluginSqlSrcRoot, "types.ts"),
1509+
},
14901510
// Node built-in subpaths that browser polyfills don't provide.
14911511
// Server-only code imports these but they're never executed in-browser.
14921512
...["util/types", "stream/promises", "stream/web"].flatMap((sub) => [
@@ -1556,12 +1576,8 @@ export default defineConfig({
15561576
find: /^@elizaos\/ui\/lib\/(.*)$/,
15571577
replacement: `${uiPkgRoot}/src/lib/$1.ts`,
15581578
},
1559-
// Dynamic aliases for local app packages. Older checkouts used
1560-
// eliza/apps/*; current workspaces use plugins/app-*.
1561-
...createWorkspacePackageAliases([
1562-
path.resolve(elizaRoot, "apps"),
1563-
path.resolve(elizaRoot, "plugins"),
1564-
]),
1579+
// Dynamic aliases for local app plugin packages.
1580+
...createWorkspacePackageAliases([path.resolve(elizaRoot, "plugins")]),
15651581
...(() => {
15661582
const sharedPkgPath = path.resolve(
15671583
elizaRoot,

0 commit comments

Comments
 (0)