@opencomputer/cli 0.3.13 → 0.4.1

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.
package/README.md CHANGED
@@ -1,118 +1,46 @@
1
- # OpenComputer CLI
1
+ # @opencomputer/cli
2
2
 
3
- The OpenComputer CLI treats every agent as a normal source repository. A
4
- template creates editable instructions, TypeScript tools, connection
5
- declarations, a sandbox workspace, and committed agent identity.
6
-
7
- Node.js 22 or newer is required. Install the CLI through npm:
3
+ The agent-focused OpenComputer CLI creates, develops, and deploys projects that
4
+ contain agent code and a React application.
8
5
 
9
6
  ```bash
10
7
  npm install --global @opencomputer/cli
11
8
  opencomputer login
12
- opencomputer templates
13
- opencomputer init email-triage
14
- cd email-triage
15
- npm install
16
- opencomputer connection add gmail --alias personal
17
- opencomputer dev
18
- opencomputer session "Triage today's inbox."
19
- opencomputer deploy
20
- ```
21
-
22
- Initialize and test the PTO Calendar template the same way:
23
-
24
- ```bash
25
- opencomputer init pto-calendar
26
- cd pto-calendar
9
+ opencomputer init my-agent
10
+ cd my-agent
27
11
  npm install
28
- opencomputer connection add calendar --alias work-calendar
29
- opencomputer session
30
12
  ```
31
13
 
32
- The agent checks Calendar events and free/busy information before proposing an
33
- all-day PTO event. Creating the event requires explicit confirmation.
34
-
35
- Authentication is stored separately from the legacy `oc` CLI in
36
- `~/.opencomputer/config.json`. `OPENCOMPUTER_API_KEY` and
37
- `OPENCOMPUTER_API_URL` can be used in CI.
38
-
39
- The generated repository is deliberately flat:
40
-
41
- ```text
42
- email-triage/
43
- ├── opencomputer.toml
44
- ├── package.json
45
- ├── instructions.md
46
- ├── agent.ts
47
- ├── tools/
48
- ├── connections/
49
- ├── channels/
50
- ├── skills/
51
- ├── workspace/
52
- └── evals/
53
- ```
54
-
55
- `opencomputer.toml` is committed with the agent and contains its stable ID.
56
- The directory can be renamed without creating a different deployed agent; each
57
- `opencomputer deploy` publishes a new immutable deployment and advances the
58
- selected alias.
59
-
60
- ## Sessions
14
+ Initialization creates only the local hello-world app. Agent definitions live
15
+ under `opencomputer/agents/`; the generated React app lives under `src/`.
61
16
 
62
- `opencomputer dev` starts the local agent service and opens its React browser
63
- app. The app uses the AI SDK message lifecycle and supports multiple independent
64
- sessions, multi-turn conversations, and streamed tool activity:
17
+ Use two terminals during development:
65
18
 
66
19
  ```bash
67
- opencomputer dev
68
- ```
69
-
70
- For a terminal-only workflow, `opencomputer session` automatically starts a
71
- temporary local service when one is not already running and opens a simple
72
- multi-turn `User:` / `Agent:` prompt. Type `/exit`, `/quit`, or press Ctrl+C to
73
- leave. The service is stopped when the prompt exits:
20
+ # terminal 1 — sync agents to Development (Cloud)
21
+ npm run dev
74
22
 
75
- ```bash
76
- opencomputer session
23
+ # terminal 2 — Vite React app
24
+ npm run dev:web
77
25
  ```
78
26
 
79
- Add `--verbose` to retain reasoning, tool, and lifecycle events in the terminal:
80
-
81
- ```bash
82
- opencomputer session --verbose
83
- ```
27
+ The first `npm run dev` asks whether to create a project or select an existing
28
+ project from the authenticated account. Later runs reuse that local binding.
29
+ Use `opencomputer dev --project <id|slug>` for non-interactive selection or
30
+ `opencomputer dev --create-project <name>` to create one explicitly.
84
31
 
85
- Pass a prompt for a single turn. This also starts and stops the service
86
- automatically when needed:
32
+ The production cloud API (`https://app.opencomputer.dev`) is the default.
33
+ Override it only with `--api-url` or `OPENCOMPUTER_API_URL`.
87
34
 
88
- ```bash
89
- opencomputer session "Triage today's inbox."
90
- ```
35
+ The React app uses the generated `useAgent` hook. Vite proxies agent requests
36
+ through the CLI's authenticated bridge; agent execution remains in the cloud.
91
37
 
92
- Deployed sessions have their own lifecycle and can be resumed across CLI
93
- invocations:
38
+ Deploy the same agent source when it is ready:
94
39
 
95
40
  ```bash
96
- opencomputer session create --remote \
97
- --agent gmail-summarizer@production
98
- opencomputer session list
99
- opencomputer session send <session-id> "Summarize today's inbox."
100
- opencomputer session inspect <session-id>
101
- opencomputer session attach <session-id>
102
- opencomputer session end <session-id>
41
+ opencomputer deploy --alias production
42
+ opencomputer run hello-world "Say hello"
103
43
  ```
104
44
 
105
- Add and manage account connections and agent channels from the same CLI:
106
-
107
- ```bash
108
- opencomputer connection add gmail --alias personal
109
- opencomputer connection add gmail --alias work
110
- opencomputer connection add calendar --alias work-calendar
111
- opencomputer connection list
112
- opencomputer connection remove work
113
-
114
- opencomputer channels add slack
115
- opencomputer deploy
116
- opencomputer channels connect slack --remote
117
- opencomputer channels list
118
- ```
45
+ The CLI calls the public OpenComputer API and uses OpenComputer authentication.
46
+ It does not require a separate backend account, key, or CLI.
package/dist/api.d.ts CHANGED
@@ -21,6 +21,22 @@ export interface ManagedAgentSummary {
21
21
  createdAt: string;
22
22
  updatedAt: string;
23
23
  }
24
+ export interface ManagedProject {
25
+ id: string;
26
+ slug: string;
27
+ name: string;
28
+ environments: Array<{
29
+ name: "development" | "production";
30
+ activeDeploymentId?: string;
31
+ updatedAt: string;
32
+ }>;
33
+ agents: Array<{
34
+ id: string;
35
+ name: string;
36
+ }>;
37
+ createdAt: string;
38
+ updatedAt: string;
39
+ }
24
40
  export interface ManagedAgentDeployment {
25
41
  id: string;
26
42
  agentId: string;
@@ -109,6 +125,8 @@ export declare class OpenComputerClient {
109
125
  revokeCredential(): Promise<void>;
110
126
  templates(): Promise<ManagedAgentTemplate[]>;
111
127
  agents(): Promise<ManagedAgentSummary[]>;
128
+ projects(): Promise<ManagedProject[]>;
129
+ createProject(name: string, slug: string): Promise<ManagedProject>;
112
130
  registerDeployment(input: {
113
131
  agentId: string;
114
132
  name: string;
package/dist/api.js CHANGED
@@ -76,6 +76,16 @@ export class OpenComputerClient {
76
76
  const result = await this.request("/api/managed-agents/agents");
77
77
  return result.agents;
78
78
  }
79
+ async projects() {
80
+ const result = await this.request("/api/managed-agents/projects");
81
+ return result.projects;
82
+ }
83
+ createProject(name, slug) {
84
+ return this.request("/api/managed-agents/projects", {
85
+ method: "POST",
86
+ body: JSON.stringify({ name, slug }),
87
+ });
88
+ }
79
89
  registerDeployment(input) {
80
90
  return this.request("/api/managed-agents/deployments", { method: "POST", body: JSON.stringify(input) });
81
91
  }
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/auth.js CHANGED
@@ -35,10 +35,13 @@ export async function login(config, options) {
35
35
  throw new Error("OPENCOMPUTER_API_KEY currently controls authentication; unset it or use --force.");
36
36
  }
37
37
  const stored = await loadStoredConfig();
38
- if (stored.apiKey && !options.force) {
38
+ const storedAPIURL = stored.apiUrl ?? config.apiUrl;
39
+ if (stored.apiKey &&
40
+ !options.force &&
41
+ storedAPIURL.replace(/\/$/, "") === config.apiUrl.replace(/\/$/, "")) {
39
42
  try {
40
43
  return await new OpenComputerClient({
41
- apiUrl: stored.apiUrl ?? config.apiUrl,
44
+ apiUrl: config.apiUrl,
42
45
  apiKey: stored.apiKey,
43
46
  }).whoami();
44
47
  }
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { OpenComputerClient } from "./api.js";
2
+ import type { ResolvedConfig } from "./config.js";
3
+ export interface ProjectBinding {
4
+ version: 1;
5
+ apiUrl: string;
6
+ projectId: string;
7
+ projectName: string;
8
+ agentId: string;
9
+ }
10
+ export interface ProjectBindingOptions {
11
+ project?: string;
12
+ createProjectName?: string;
13
+ interactive?: boolean;
14
+ }
15
+ export declare function findOpenComputerProjectRoot(agentRoot: string): Promise<string>;
16
+ export declare function ensureProjectBinding(client: Pick<OpenComputerClient, "projects" | "createProject">, config: ResolvedConfig, agentRoot: string, options?: ProjectBindingOptions): Promise<ProjectBinding>;
@@ -0,0 +1,125 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, resolve } from "node:path";
4
+ import { agentIdFromName, readManifest, writeManifest, } from "./project.js";
5
+ async function exists(path) {
6
+ try {
7
+ await access(path);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ export async function findOpenComputerProjectRoot(agentRoot) {
15
+ let directory = resolve(agentRoot);
16
+ for (;;) {
17
+ if (await exists(resolve(directory, "opencomputer", "project.ts"))) {
18
+ return directory;
19
+ }
20
+ const parent = dirname(directory);
21
+ if (parent === directory)
22
+ break;
23
+ directory = parent;
24
+ }
25
+ throw new Error("This agent is not inside an OpenComputer app. Run `opencomputer init <directory>` first.");
26
+ }
27
+ function bindingPath(projectRoot) {
28
+ return resolve(projectRoot, ".opencomputer", "project.json");
29
+ }
30
+ async function readBinding(projectRoot, apiUrl) {
31
+ try {
32
+ const value = JSON.parse(await readFile(bindingPath(projectRoot), "utf8"));
33
+ return value.version === 1 &&
34
+ value.apiUrl === apiUrl &&
35
+ typeof value.projectId === "string" &&
36
+ typeof value.projectName === "string" &&
37
+ typeof value.agentId === "string"
38
+ ? value
39
+ : null;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ async function chooseProject(projects, defaultName) {
46
+ const terminal = createInterface({ input: process.stdin, output: process.stdout });
47
+ try {
48
+ process.stdout.write("\nConnect this app to a Development (Cloud) project:\n\n");
49
+ process.stdout.write(` 1) Create a new project\n`);
50
+ projects.forEach((project, index) => {
51
+ process.stdout.write(` ${String(index + 2)}) ${project.name} (${project.slug})\n`);
52
+ });
53
+ const answer = (await terminal.question("\nSelect [1]: ")).trim() || "1";
54
+ const selected = Number.parseInt(answer, 10);
55
+ if (!Number.isInteger(selected) || selected < 1 || selected > projects.length + 1) {
56
+ throw new Error("Choose one of the numbered project options.");
57
+ }
58
+ if (selected > 1)
59
+ return { project: projects[selected - 2] };
60
+ const name = (await terminal.question(`Project name [${defaultName}]: `)).trim();
61
+ return { createName: name || defaultName };
62
+ }
63
+ finally {
64
+ terminal.close();
65
+ }
66
+ }
67
+ async function persistBinding(projectRoot, agentRoot, config, project) {
68
+ const agent = project.agents[0];
69
+ if (!agent)
70
+ throw new Error(`Project ${project.name} has no agent to bind.`);
71
+ const binding = {
72
+ version: 1,
73
+ apiUrl: config.apiUrl,
74
+ projectId: project.id,
75
+ projectName: project.name,
76
+ agentId: agent.id,
77
+ };
78
+ const directory = dirname(bindingPath(projectRoot));
79
+ await mkdir(directory, { recursive: true, mode: 0o700 });
80
+ await writeFile(bindingPath(projectRoot), `${JSON.stringify(binding, null, 2)}\n`, { mode: 0o600 });
81
+ await writeManifest(agentRoot, {
82
+ ...(await readManifest(agentRoot)),
83
+ id: agent.id,
84
+ });
85
+ await writeFile(resolve(projectRoot, "opencomputer", "project.ts"), `export default {
86
+ id: ${JSON.stringify(project.id)},
87
+ name: ${JSON.stringify(project.name)},
88
+ agents: ["hello-world"],
89
+ };
90
+ `);
91
+ return binding;
92
+ }
93
+ export async function ensureProjectBinding(client, config, agentRoot, options = {}) {
94
+ if (options.project && options.createProjectName) {
95
+ throw new Error("--project and --create-project cannot be combined.");
96
+ }
97
+ const projectRoot = await findOpenComputerProjectRoot(agentRoot);
98
+ const projects = await client.projects();
99
+ if (!options.project && !options.createProjectName) {
100
+ const existing = await readBinding(projectRoot, config.apiUrl);
101
+ if (existing &&
102
+ projects.some((project) => project.id === existing.projectId &&
103
+ project.agents.some((agent) => agent.id === existing.agentId))) {
104
+ return existing;
105
+ }
106
+ }
107
+ let project = options.project
108
+ ? projects.find((candidate) => candidate.id === options.project || candidate.slug === options.project)
109
+ : undefined;
110
+ if (options.project && !project) {
111
+ throw new Error(`Project ${options.project} was not found in this account.`);
112
+ }
113
+ let createName = options.createProjectName;
114
+ if (!project && !createName) {
115
+ if (options.interactive === false || !process.stdin.isTTY || !process.stdout.isTTY) {
116
+ throw new Error("This app is not connected to a cloud project. Run `opencomputer dev --project <id|slug>` or `opencomputer dev --create-project <name>`.");
117
+ }
118
+ const choice = await chooseProject(projects, basename(projectRoot));
119
+ project = choice.project;
120
+ createName = choice.createName;
121
+ }
122
+ project ??= await client.createProject(createName, agentIdFromName(createName));
123
+ return persistBinding(projectRoot, agentRoot, config, project);
124
+ }
125
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,68 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { resolve } from "node:path";
5
+ import test from "node:test";
6
+ import { ensureProjectBinding } from "./binding.js";
7
+ import { initializeAgentProject, readManifest } from "./project.js";
8
+ function project() {
9
+ return {
10
+ id: "prj_existing",
11
+ slug: "existing-project",
12
+ name: "Existing project",
13
+ agents: [{ id: "agent-cloud", name: "Hello World" }],
14
+ environments: [
15
+ { name: "development", updatedAt: "2026-08-09T00:00:00.000Z" },
16
+ { name: "production", updatedAt: "2026-08-09T00:00:00.000Z" },
17
+ ],
18
+ createdAt: "2026-08-09T00:00:00.000Z",
19
+ updatedAt: "2026-08-09T00:00:00.000Z",
20
+ };
21
+ }
22
+ test("first dev can select an existing project and later reuses its binding", async () => {
23
+ const root = await mkdtemp(resolve(tmpdir(), "opencomputer-binding-"));
24
+ try {
25
+ const initialized = await initializeAgentProject(root);
26
+ let creates = 0;
27
+ const client = {
28
+ async projects() {
29
+ return [project()];
30
+ },
31
+ async createProject() {
32
+ creates += 1;
33
+ return project();
34
+ },
35
+ };
36
+ const config = { apiUrl: "https://app.opencomputer.dev", apiKey: "test" };
37
+ const selected = await ensureProjectBinding(client, config, initialized.agentRoot, { project: "existing-project", interactive: false });
38
+ assert.equal(selected.projectId, "prj_existing");
39
+ assert.equal(selected.agentId, "agent-cloud");
40
+ assert.equal((await readManifest(initialized.agentRoot)).id, "agent-cloud");
41
+ assert.match(await readFile(resolve(root, "opencomputer", "project.ts"), "utf8"), /id: "prj_existing"[\s\S]*name: "Existing project"/);
42
+ assert.deepEqual(JSON.parse(await readFile(resolve(root, ".opencomputer", "project.json"), "utf8")), selected);
43
+ const reused = await ensureProjectBinding(client, config, initialized.agentRoot, { interactive: false });
44
+ assert.deepEqual(reused, selected);
45
+ assert.equal(creates, 0);
46
+ }
47
+ finally {
48
+ await rm(root, { recursive: true, force: true });
49
+ }
50
+ });
51
+ test("non-interactive dev requires an explicit project choice", async () => {
52
+ const root = await mkdtemp(resolve(tmpdir(), "opencomputer-binding-"));
53
+ try {
54
+ const initialized = await initializeAgentProject(root);
55
+ await assert.rejects(ensureProjectBinding({
56
+ async projects() {
57
+ return [project()];
58
+ },
59
+ async createProject() {
60
+ return project();
61
+ },
62
+ }, { apiUrl: "https://app.opencomputer.dev" }, initialized.agentRoot, { interactive: false }), /--project <id\|slug>/);
63
+ }
64
+ finally {
65
+ await rm(root, { recursive: true, force: true });
66
+ }
67
+ });
68
+ //# sourceMappingURL=binding.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.test.js","sourceRoot":"","sources":["../src/binding.test.ts"],"names":[],"mappings":"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"}
package/dist/commands.js CHANGED
@@ -2,8 +2,9 @@ import { rm } from "node:fs/promises";
2
2
  import { OpenComputerClient, } from "./api.js";
3
3
  import { login, logout, openBrowser } from "./auth.js";
4
4
  import { resolveConfig } from "./config.js";
5
+ import { runCloudDevelopment } from "./dev.js";
5
6
  import { runLocalAgent } from "./local.js";
6
- import { addCalendarTools, addGmailTools, addSlackChannel, buildAgentArtifact, findAgentRoot, initializeAgentProject, readManifest, } from "./project.js";
7
+ import { addCalendarTools, addGmailTools, addSlackChannel, assertStarterTarget, buildAgentArtifact, findAgentRoot, initializeAgentProject, readManifest, } from "./project.js";
7
8
  import { captureLocalSlackState, clearSlackState, readLocalSlackState, readRemoteSlackState, remoteSlackStatePath, requireSlackAgentRoot, runSlackCli, slackManifest, writeRemoteSlackState, } from "./slack.js";
8
9
  function printJSON(value) {
9
10
  process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
@@ -29,12 +30,16 @@ function option(args, name) {
29
30
  async function requireAgentRoot() {
30
31
  const root = await findAgentRoot();
31
32
  if (!root) {
32
- throw new Error("No OpenComputer agent repository found. Run `opencomputer init <template>` first.");
33
+ throw new Error("No OpenComputer agent repository found. Run `opencomputer init <directory>` first.");
33
34
  }
34
35
  return root;
35
36
  }
36
37
  async function connectManagedService(client, service, label = "default") {
37
- const displayName = service === "calendar" ? "Google Calendar" : service === "github" ? "GitHub" : "Gmail";
38
+ const displayName = service === "calendar"
39
+ ? "Google Calendar"
40
+ : service === "github"
41
+ ? "GitHub"
42
+ : "Gmail";
38
43
  const started = await client.linkManagedConnection(service, label);
39
44
  if (started.status === "connected") {
40
45
  process.stdout.write(`${displayName} connection "${label}" is already connected.\n`);
@@ -287,44 +292,29 @@ export async function runCommand(command, rawArgs, globals) {
287
292
  }
288
293
  return;
289
294
  }
290
- if (command === "templates") {
291
- const templates = await client.templates();
292
- if (globals.json)
293
- printJSON(templates);
294
- else {
295
- for (const template of templates) {
296
- process.stdout.write(`${template.id.padEnd(22)} ${template.name}\n` +
297
- `${"".padEnd(23)}${template.description}\n` +
298
- `${"".padEnd(23)}${template.integrations.join(", ")}\n`);
299
- }
300
- }
301
- return;
302
- }
303
295
  if (command === "init") {
304
- const templateId = args.shift();
305
- if (!templateId) {
306
- throw new Error("Usage: opencomputer init <template> [directory]");
296
+ const directory = args.shift();
297
+ if (!directory) {
298
+ throw new Error("Usage: opencomputer init <directory|.>");
307
299
  }
308
- const directory = args.shift() ?? templateId;
309
300
  if (args.length)
310
301
  throw new Error(`Unexpected argument: ${args[0]}`);
311
- const template = (await client.templates()).find((candidate) => candidate.id === templateId);
312
- if (!template)
313
- throw new Error(`Unknown agent template: ${templateId}`);
314
- const initialized = await initializeAgentProject(template, directory);
302
+ await assertStarterTarget(directory);
303
+ const initialized = await initializeAgentProject(directory);
315
304
  if (globals.json)
316
305
  printJSON(initialized);
317
306
  else {
318
307
  const enterDirectory = directory === "." ? "" : ` cd ${directory}\n`;
319
- process.stdout.write(`Created ${initialized.manifest.name} from ${template.name}\n` +
308
+ process.stdout.write(`Created the ${initialized.manifest.name} OpenComputer app\n` +
320
309
  `Directory: ${initialized.root}\n` +
321
- `Name: ${initialized.manifest.name}\n` +
322
- `Agent ID: ${initialized.manifest.id}\n` +
323
- `Identity: opencomputer.toml\n\n` +
310
+ `Project: choose or create one on the first npm run dev\n` +
311
+ `Agents: opencomputer/\n` +
312
+ `React: src/\n\n` +
324
313
  `Next:\n` +
325
314
  enterDirectory +
326
315
  ` npm install\n` +
327
- ` opencomputer dev\n`);
316
+ ` npm run dev # terminal 1: cloud agent sync\n` +
317
+ ` npm run dev:web # terminal 2: React app\n`);
328
318
  }
329
319
  return;
330
320
  }
@@ -333,7 +323,7 @@ export async function runCommand(command, rawArgs, globals) {
333
323
  if (globals.json)
334
324
  printJSON(agents);
335
325
  else if (!agents.length) {
336
- process.stdout.write("No agents deployed. Run `opencomputer templates` to get started.\n");
326
+ process.stdout.write("No agents deployed. Run `opencomputer init <directory>` to get started.\n");
337
327
  }
338
328
  else {
339
329
  for (const agent of agents) {
@@ -387,9 +377,15 @@ export async function runCommand(command, rawArgs, globals) {
387
377
  return;
388
378
  }
389
379
  if (command === "dev") {
380
+ const project = option(args, "--project");
381
+ const createProjectName = option(args, "--create-project");
390
382
  if (args.length)
391
383
  throw new Error(`Unexpected argument: ${args[0]}`);
392
- await runLocalAgent(["dev"], config);
384
+ await runCloudDevelopment(client, config, await requireAgentRoot(), {
385
+ project,
386
+ createProjectName,
387
+ interactive: !globals.json,
388
+ });
393
389
  return;
394
390
  }
395
391
  if (command === "session") {
@@ -532,7 +528,9 @@ export async function runCommand(command, rawArgs, globals) {
532
528
  const provider = args.shift();
533
529
  const alias = option(args, "--alias") ?? "default";
534
530
  const service = provider === "google" ? "gmail" : provider;
535
- if ((service !== "gmail" && service !== "calendar" && service !== "github") ||
531
+ if ((service !== "gmail" &&
532
+ service !== "calendar" &&
533
+ service !== "github") ||
536
534
  args.length) {
537
535
  throw new Error("Usage: opencomputer connection add <gmail|calendar|github> [--alias <name>]");
538
536
  }