Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/remove-channel-add.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"eve": minor
---

Remove the `/channels` dev TUI command, `eve channels add`, and the unused programmatic onboarding API. Channel integrations install through `eve add`, run isolated integration setup without deploying, and leave deployment as an explicit `eve deploy` step.
2 changes: 1 addition & 1 deletion docs/channels/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ agent/
intake.ts
```

Scaffold a channel file with `eve channels add` (interactive), or pass a kind: `eve channels add slack` or `eve channels add web`. You can also author the file by hand.
Install a built-in channel with `eve add channel/slack` or `eve add channel/web`. You can also author the file by hand.

## The eve HTTP channel (default)

Expand Down
4 changes: 2 additions & 2 deletions docs/channels/slack.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ The `create` step provisions a destination at the default Connect path. `detach`

## Add the channel

Scaffold the channel and its dependency with `eve channels add slack`, or set it up by hand:
Scaffold the channel and its dependency with `eve add channel/slack`, or set it up by hand:

```bash
npm install @vercel/connect
Expand All @@ -38,7 +38,7 @@ export default slackChannel({

`connectSlackCredentials` returns `{ botToken, webhookVerifier }`, keeping token rotation, multi-workspace tenancy, and request verification inside Connect rather than your code.

If eve cannot find an authenticated Vercel session, `eve channels add slack` asks whether to set up Vercel Connect or use portable environment credentials. The portable option adds the required names to `.env.example`. Before deploying, appropriate values must be supplied to your runtime environment.
If eve cannot find an authenticated Vercel session, `eve add channel/slack` asks whether to set up Vercel Connect or use portable environment credentials. The portable option adds the required names to `.env.example`. Before deploying, appropriate values must be supplied to your runtime environment.

### Deploy

Expand Down
10 changes: 3 additions & 7 deletions docs/guides/dev-tui.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ On startup the TUI prints a brand line with your agent's name, plus a rotating t

```text
eve weather-agent
Use /channels to add more ways to reach your agent.
Use /add to install integrations from the registry.
```

If agent discovery reported problems, an error and warning count renders between the two lines. Instructions, tools, skills, and subagents are one `eve info` away, and `/help` lists every command. The TUI also runs a startup check. A fresh `eve init` starts local `eve dev` with `/model` prefilled. That input starts onboarding: the flow installs the Vercel CLI if needed, asks you to log in if needed, opens `/model`, then offers categorized next steps for channels, connections, capabilities, and observability through the registry before the first prompt. Other `eve dev` sessions show missing setup as an attention line, with each command's outcome hanging under it on a `⎿` connector.
Expand All @@ -35,7 +35,7 @@ Each command echoes as an invocation line, asks through a bordered panel that ta
| Command | Does |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `/model` | Opens a configure menu that loops until Done (or Esc). See [Configure the model and provider](#configure-the-model-and-provider). |
| `/channels` | Shows the agent's channel list and adds the one you pick. See [Add a channel](#add-a-channel). |
| `/add` | Browses and installs integrations from the registry. |
| `/connect` | Shows the Vercel Connect MCP catalog and configures the server you pick. See [Add a connection](#add-a-connection). |
| `/add` | Searches registry integrations or adds an item address entered directly. |
| `/deploy` | Ships the agent to Vercel production, linking the directory first when it is unlinked. |
Expand All @@ -46,7 +46,7 @@ Each command echoes as an invocation line, asks through a bordered panel that ta
| `/exit` | Quits the TUI. |
| `/help` | Lists the commands available for the current local or remote session. |

`/model`, `/channels`, `/connect`, `/add`, and `/deploy` manage the local agent or its linked project. They are available only when `eve dev` runs the server locally, not when connected to a remote server with `--url`.
`/model`, `/connect`, `/add`, and `/deploy` manage the local agent or its linked project. They are available only when `eve dev` runs the server locally, not when connected to a remote server with `--url`.

### Configure the model and provider

Expand All @@ -56,10 +56,6 @@ The provider row opens one menu: AI Gateway via a project, AI Gateway via `AI_GA

The provider row demands attention (a bold yellow "Configure model access" with a yellow "Not configured" hint that dims when unselected and uses the terminal foreground when selected) until a link or gateway credential is detected, then names the connection afterward (for example "AI Gateway (Linked to my-project in my-team)"). Setup menus mark the cursor row with a padded, filled-arrow inverse label that inherits the row's accent: blue normally and yellow for warning rows. In stacked menus, the selected row's description appears directly beneath that option. The completed command's outcome stays in the transcript after the panel closes. When a turn fails because AI Gateway authentication is missing or stale, the error points you at `/model` directly.

### Add a channel

`/channels` shows the agent's channel list. Already-registered channels render as checked, focusable rows with an "Already installed" hint. Picking one adds it (including the Slack Connect provisioning), then installs the dependencies the scaffold added so the dev server can load the new channels right away. After each addition the list repaints with the channel checked, until Done (or Esc) leaves the flow.

### Browse registry integrations

`/add` first organizes integrations by what they add: a way to chat, tools and data, capabilities, or observability. Pick a category to open its searchable catalog from the official eve registry and the registry namespaces configured in `package.json`, or browse everything. Each integration shows its source beside its name, such as `Vercel` or a configured registry namespace. Select a result to review its source, packages, environment variables, and target files before adding it, or type an official item path, configured namespace address, or HTTP(S) URL directly into the search bar. After an add attempt finishes, the panel closes instead of returning to the catalog.
Expand Down
4 changes: 2 additions & 2 deletions docs/tutorial/ship-it.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ The analytics assistant runs fine in the TUI. Now ship it for real, as a web das

## Add the Web Chat app

Step 1 scaffolded the agent without a web frontend. Add one now with `eve channels add`, run from the `analytics-assistant/` directory:
Step 1 scaffolded the agent without a web frontend. Add one now with `eve add channel/web`, run from the `analytics-assistant/` directory:

```bash
npx eve channels add web
npx eve add channel/web
```

This adds a Next.js app (`next.config.ts`, `app/page.tsx`, `app/_components/`) wired to the existing eve channel, plus the chat UI components and their dependencies. Run `npm install` afterward to install the added packages. The generated `next.config.ts` wraps your config with `withEve`, which wires the eve routes automatically:
Expand Down
2 changes: 1 addition & 1 deletion packages/eve/src/cli/commands/agent-instructions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ describe("initAgentInstructions", () => {
const instructions = initAgentInstructions();

// Channels: Slack credentials are provisioned by Connect, not hand-managed.
expect(instructions).toContain("eve channels add slack");
expect(instructions).toContain("eve add channel/slack");
// Connections: per-user auth wires through Connect's eve helper.
expect(instructions).toContain("agent/connections/");
expect(instructions).toContain("@vercel/connect/eve");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ the coding harness's prompt tools when available, and do not guess.
2. Where should it be reachable? Every agent ships the built-in HTTP channel. On
top of that:
- **Web Chat** (a Next.js app): add it at init with `--channel-web-nextjs`.
- **Slack** and other platforms: add after deploy with `eve channels add slack`.
- **Slack** and other platforms: add after deploy with `eve add channel/slack`.
Credentials run through **Vercel Connect**, which provisions the bot token
and verifies inbound webhooks, so there is no `SLACK_BOT_TOKEN` or signing
secret to manage.
Expand Down
102 changes: 0 additions & 102 deletions packages/eve/src/cli/commands/channels.integration.test.ts

This file was deleted.

67 changes: 2 additions & 65 deletions packages/eve/src/cli/commands/channels.ts
Original file line number Diff line number Diff line change
@@ -1,75 +1,12 @@
import { isEveProject, listAuthoredChannels, type ChannelKind } from "#setup/scaffold/index.js";
import { createPrompter, type Prompter } from "#setup/prompter.js";
import type { runChannelsFlow } from "#setup/flows/channels.js";
import { isEveProject, listAuthoredChannels } from "#setup/scaffold/index.js";

import { NOT_AN_AGENT_MESSAGE } from "./preconditions.js";
import type { AddCommandOptions, runAddCommand } from "./registry.js";

export interface CliLogger {
error(message: string): void;
log(message: string): void;
}

const KNOWN_CHANNEL_KINDS: readonly ChannelKind[] = ["slack", "web"];

function parseChannelKind(value: string): ChannelKind {
if (KNOWN_CHANNEL_KINDS.includes(value as ChannelKind)) return value as ChannelKind;
throw new Error(`Unknown channel kind "${value}". Known: ${KNOWN_CHANNEL_KINDS.join(", ")}.`);
}

export interface AddChannelCommandOptions {
force?: boolean;
yes?: boolean;
}

export interface ChannelsAddDependencies {
createPrompter(): Prompter;
loadAddCommand(): Promise<typeof runAddCommand>;
loadChannelsFlow(): Promise<typeof runChannelsFlow>;
}

const defaultChannelsAddDependencies: ChannelsAddDependencies = {
createPrompter,
loadAddCommand: async () => (await import("./registry.js")).runAddCommand,
loadChannelsFlow: async () => (await import("#setup/flows/channels.js")).runChannelsFlow,
};

/** Compatibility adapter from `eve channels add` to registry-backed installation. */
export async function runChannelsAddCompatibilityCommand(
logger: CliLogger,
appRoot: string,
args: { kind?: string; options: AddChannelCommandOptions },
dependencies: ChannelsAddDependencies = defaultChannelsAddDependencies,
): Promise<void> {
if (!(await isEveProject(appRoot))) {
logger.error(NOT_AN_AGENT_MESSAGE);
process.exitCode = 1;
return;
}

try {
if (args.kind !== undefined) {
const kind = parseChannelKind(args.kind);
const runAdd = await dependencies.loadAddCommand();
const addOptions: AddCommandOptions = {};
if (args.options.force === true) addOptions.overwrite = true;
if (args.options.yes === true) addOptions.yes = true;
await runAdd(logger, appRoot, `channel/${kind}`, addOptions);
return;
}
if (args.options.yes || !process.stdin.isTTY || !process.stdout.isTTY) {
throw new Error(
`Pass a channel kind: \`eve channels add <${KNOWN_CHANNEL_KINDS.join("|")}>\`.`,
);
}
const runFlow = await dependencies.loadChannelsFlow();
await runFlow({ appRoot, prompter: dependencies.createPrompter() });
} catch (error) {
logger.error(error instanceof Error ? error.message : String(error));
process.exitCode = 1;
}
}

export interface ListChannelsCommandOptions {
json?: boolean;
}
Expand All @@ -93,7 +30,7 @@ export async function runChannelsListCommand(
}

if (channels.length === 0) {
logger.log("No channels defined. Run `eve channels add` to add one.");
logger.log("No channels defined. Run `eve add <channel>` to add one.");
return;
}

Expand Down
2 changes: 1 addition & 1 deletion packages/eve/src/cli/commands/init.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -931,7 +931,7 @@ describe("runInitCommand", () => {

await expect(
runInitCommand(output, parentDirectory, "host-app", { channelWebNextjs: true }, deps),
).rejects.toThrow("eve channels add web");
).rejects.toThrow("eve add channel/web");

await expect(pathExists(join(projectRoot, "agent"))).resolves.toBe(false);
expect(deps.runPackageManagerInstall).not.toHaveBeenCalled();
Expand Down
2 changes: 1 addition & 1 deletion packages/eve/src/cli/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ async function addToExistingProject(
if (options.channelWebNextjs === true) {
throw new Error(
"`--channel-web-nextjs` is not supported when adding an agent to an existing project. " +
"Run `eve channels add web` from the project afterwards instead.",
"Run `eve add channel/web` from the project afterwards instead.",
);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/eve/src/cli/commands/integration-setup.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { afterEach, describe, expect, it, vi } from "vitest";

import { createFakePrompter } from "#internal/testing/fake-prompter.js";
import type { AddChannelsDeps } from "#setup/boxes/add-channels.js";
import type { AddChannelsDeps } from "#setup/integrations/channels/setup.js";
import { deriveSlackConnectorSlug } from "#setup/scaffold/index.js";

import { runIntegrationSetupCommand } from "./integration-setup.js";
Expand Down
Loading
Loading