@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 +25 -97
- package/dist/api.d.ts +18 -0
- package/dist/api.js +10 -0
- package/dist/api.js.map +1 -1
- package/dist/auth.js +5 -2
- package/dist/auth.js.map +1 -1
- package/dist/binding.d.ts +16 -0
- package/dist/binding.js +125 -0
- package/dist/binding.js.map +1 -0
- package/dist/binding.test.d.ts +1 -0
- package/dist/binding.test.js +68 -0
- package/dist/binding.test.js.map +1 -0
- package/dist/commands.js +30 -32
- package/dist/commands.js.map +1 -1
- package/dist/config.js +10 -5
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +19 -1
- package/dist/config.test.js.map +1 -1
- package/dist/dev.d.ts +8 -0
- package/dist/dev.js +112 -0
- package/dist/dev.js.map +1 -0
- package/dist/dev.test.d.ts +1 -0
- package/dist/dev.test.js +38 -0
- package/dist/dev.test.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/local.js +26 -47
- package/dist/local.js.map +1 -1
- package/dist/local.test.js +29 -0
- package/dist/local.test.js.map +1 -1
- package/dist/project.d.ts +12 -1
- package/dist/project.js +574 -17
- package/dist/project.js.map +1 -1
- package/dist/project.test.js +44 -8
- package/dist/project.test.js.map +1 -1
- package/dist/slack.js +2 -6
- package/dist/slack.js.map +1 -1
- package/dist/slack.test.js +4 -2
- package/dist/slack.test.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,118 +1,46 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @opencomputer/cli
|
|
2
2
|
|
|
3
|
-
The OpenComputer CLI
|
|
4
|
-
|
|
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
|
|
13
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
-
|
|
23
|
+
# terminal 2 — Vite React app
|
|
24
|
+
npm run dev:web
|
|
77
25
|
```
|
|
78
26
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
opencomputer
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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
|
-
|
|
93
|
-
invocations:
|
|
38
|
+
Deploy the same agent source when it is ready:
|
|
94
39
|
|
|
95
40
|
```bash
|
|
96
|
-
opencomputer
|
|
97
|
-
|
|
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
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAyGA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGtB;IAFX,YACE,OAAe,EACN,MAAc;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,WAAM,GAAN,MAAM,CAAQ;IAGzB,CAAC;CACF;AAED,SAAS,YAAY,CAAC,IAAa,EAAE,MAAc;IACjD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAA+B,CAAC;QAC/C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAC1D,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,OAAO,GAAI,MAAM,CAAC,KAAiC,CAAC,OAAO,CAAC;YAClE,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAChE,CAAC;IACD,OAAO,gCAAgC,MAAM,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,OAAoB,EAAE,EACtB,aAAa,GAAG,IAAI;QAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YAC3D,GAAG,IAAI;YACP,OAAO;YACP,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QACnD,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAOhB,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,aAAa,CAAC,UAAkB,EAAE,cAAsB;QACtD,OAAO,IAAI,CAAC,OAAO,CAUjB,2BAA2B,EAC3B;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,WAAW,EAAE,UAAU;gBACvB,eAAe,EAAE,cAAc;aAChC,CAAC;SACH,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAuB,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,OAAO,CAAO,sBAAsB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,+BAA+B,CAChC,CAAC;QACF,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,4BAA4B,CAC7B,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,8BAA8B,CAC/B,CAAC;QACF,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,IAAY;QACtC,OAAO,IAAI,CAAC,OAAO,CAAiB,8BAA8B,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,KAYlB;QACC,OAAO,IAAI,CAAC,OAAO,CACjB,iCAAiC,EACjC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,iCAAiC,CAClC,CAAC;QACF,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,oBAAoB,CAAC,YAAoB;QACvC,OAAO,IAAI,CAAC,OAAO,CACjB,mCAAmC,kBAAkB,CAAC,YAAY,CAAC,EAAE,EACrE,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,qBAAqB,CAAC,OAAe,EAAE,KAAa;QAClD,OAAO,IAAI,CAAC,OAAO,CAShB,sCAAsC,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,YAAoB,EAAE,OAAe;QACrD,MAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAUjB,mCAAmC,QAAQ,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,iBAAiB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAC7I,CAAC;IACJ,CAAC;IAED,2BAA2B,CAAC,YAAoB,EAAE,OAAe;QAC/D,MAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAQjB,mCAAmC,QAAQ,YAAY,kBAAkB,CAAC,OAAO,CAAC,iBAAiB,kBAAkB,CAAC,YAAY,CAAC,EAAE,EACrI,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,qBAAqB,CAAC,OAAe;QACnC,OAAO,IAAI,CAAC,OAAO,CAGhB,gDAAgD,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAG9B,8BAA8B,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,uBAAuB,CAAC,YAAoB,EAAE,QAAgB;QAC5D,OAAO,IAAI,CAAC,OAAO,CACjB,kDAAkD,kBAAkB,CAAC,YAAY,CAAC,EAAE,EACpF;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;SACnC,CACF,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,YAAoB;QAClC,OAAO,IAAI,CAAC,OAAO,CACjB,kDAAkD,kBAAkB,CAAC,YAAY,CAAC,EAAE,EACpF,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAsB,8BAA8B,EAAE;YACvE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAE9B,8BAA8B,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,OAAO,CACjB,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAChE,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,KAAa;QACzC,OAAO,IAAI,CAAC,OAAO,CACjB,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EACrE;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE;aACpC,CAAC;SACH,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,KAAa;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,KAAK,EAAE,CACtF,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,OAAO,CACjB,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,UAAU,EACvE,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,OAAO,CACjB,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,SAAS,EACtE,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,OAAO,CACjB,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,MAAM,EACnE,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CACjB,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,YAAY,EACzE,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;IACJ,CAAC;CACF"}
|
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
|
-
|
|
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:
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAA6B,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AAErB,SAAS,cAAc;IACrB,MAAM,SAAS,GAAG,QAAQ,EAAE;SACzB,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;SACrC,IAAI,EAAE,CAAC;IACV,OAAO,mBAAmB,SAAS,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,OAAO,GACX,QAAQ,EAAE,KAAK,QAAQ;QACrB,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC;QACf,CAAC,CAAC,QAAQ,EAAE,KAAK,OAAO;YACtB,CAAC,CAAC,CAAC,UAAU,EAAE,6BAA6B,EAAE,GAAG,CAAC;YAClD,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACjD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,MAAsB,EACtB,OAA+C;IAE/C,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,
|
|
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>;
|
package/dist/binding.js
ADDED
|
@@ -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 <
|
|
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"
|
|
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
|
|
305
|
-
if (!
|
|
306
|
-
throw new Error("Usage: opencomputer init <
|
|
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
|
-
|
|
312
|
-
|
|
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}
|
|
308
|
+
process.stdout.write(`Created the ${initialized.manifest.name} OpenComputer app\n` +
|
|
320
309
|
`Directory: ${initialized.root}\n` +
|
|
321
|
-
`
|
|
322
|
-
`
|
|
323
|
-
`
|
|
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
|
-
`
|
|
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
|
|
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
|
|
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" &&
|
|
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
|
}
|