0pflow 0.1.0-dev.bdfaa95 → 0.1.0-dev.bfe08b3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAa/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BzD"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAa/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzD"}
package/dist/cli/app.js CHANGED
@@ -25,6 +25,10 @@ export function getAppName() {
25
25
  * @param projectRoot Directory containing the .env file (defaults to cwd)
26
26
  */
27
27
  export function getAppSchema(projectRoot) {
28
+ // Check process.env first (e.g. Fly secrets in cloud-dev)
29
+ if (process.env.DATABASE_SCHEMA) {
30
+ return process.env.DATABASE_SCHEMA;
31
+ }
28
32
  const envPath = path.join(projectRoot ?? process.cwd(), ".env");
29
33
  if (!fs.existsSync(envPath)) {
30
34
  throw new Error("DATABASE_SCHEMA not found in .env file. " +
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAEhE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C;YAC1C,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,0CAA0C;gBAC1C,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,eAAe,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAAE,MAAM,GAAG,CAAC;QAC/E,MAAM,IAAI,KAAK,CACb,0CAA0C;YAC1C,iDAAiD,CAClD,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC/C,0DAA0D;IAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAEhE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C;YAC1C,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,0CAA0C;gBAC1C,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,eAAe,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAAE,MAAM,GAAG,CAAC;QAC/E,MAAM,IAAI,KAAK,CACb,0CAA0C;YAC1C,iDAAiD,CAClD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function runCloudRun(): Promise<void>;
2
+ export declare function handleStatus(): Promise<void>;
3
+ export declare function handleStop(): Promise<void>;
4
+ export declare function handleDestroy(): Promise<void>;
5
+ export declare function handleClaude(extraArgs?: string[]): Promise<void>;
6
+ export declare function handleSSH(): Promise<void>;
7
+ //# sourceMappingURL=cloud-dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-dev.d.ts","sourceRoot":"","sources":["../../src/cli/cloud-dev.ts"],"names":[],"mappings":"AA2IA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAwRjD;AAsED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAmClD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBhD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBnD;AA8ED,wBAAsB,YAAY,CAAC,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB/C"}
@@ -0,0 +1,569 @@
1
+ import { execSync, spawnSync } from "node:child_process";
2
+ import { existsSync, readFileSync, mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir, tmpdir, userInfo } from "node:os";
5
+ import * as p from "@clack/prompts";
6
+ import pc from "picocolors";
7
+ import * as dotenv from "dotenv";
8
+ import { apiCall } from "../connections/cloud-client.js";
9
+ import { isAuthenticated, authenticate } from "../connections/cloud-auth.js";
10
+ import { createDatabase, setupAppSchema } from "./mcp/lib/scaffolding.js";
11
+ // ── Browser helper ───────────────────────────────────────────────
12
+ function openInBrowser(url) {
13
+ const cmd = process.platform === "darwin" ? "open"
14
+ : process.platform === "win32" ? "start"
15
+ : "xdg-open";
16
+ try {
17
+ execSync(`${cmd} "${url}"`, { stdio: "ignore" });
18
+ }
19
+ catch {
20
+ // best-effort — ignore if browser can't be opened
21
+ }
22
+ }
23
+ // ── Claude Code credential collection ───────────────────────────
24
+ function collectClaudeCredentials() {
25
+ const home = homedir();
26
+ const username = userInfo().username;
27
+ // 1. OS keyring — OAuth (macOS)
28
+ if (process.platform === "darwin") {
29
+ try {
30
+ const oauthJson = execSync(`security find-generic-password -s "Claude Code-credentials" -a "${username}" -w`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
31
+ if (oauthJson)
32
+ return { CLAUDE_OAUTH_CREDENTIALS: oauthJson };
33
+ }
34
+ catch {
35
+ /* not in keyring */
36
+ }
37
+ // 2. OS keyring — API key (macOS)
38
+ try {
39
+ const apiKey = execSync(`security find-generic-password -s "Claude Code" -a "${username}" -w`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
40
+ if (apiKey)
41
+ return { CLAUDE_API_KEY: apiKey };
42
+ }
43
+ catch {
44
+ /* not in keyring */
45
+ }
46
+ }
47
+ // 3. File — OAuth
48
+ const oauthPath = join(home, ".claude", ".credentials.json");
49
+ if (existsSync(oauthPath)) {
50
+ return { CLAUDE_OAUTH_CREDENTIALS: readFileSync(oauthPath, "utf-8") };
51
+ }
52
+ // 4. File — API key
53
+ const configPath = join(home, ".claude.json");
54
+ if (existsSync(configPath)) {
55
+ try {
56
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
57
+ if (config.primaryApiKey)
58
+ return { CLAUDE_API_KEY: config.primaryApiKey };
59
+ }
60
+ catch {
61
+ /* invalid JSON */
62
+ }
63
+ }
64
+ // 5. Environment variable
65
+ if (process.env.ANTHROPIC_API_KEY) {
66
+ return { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY };
67
+ }
68
+ return {};
69
+ }
70
+ // ── Tiger CLI helpers (reused from run.ts) ──────────────────────
71
+ function ensureTigerAuth() {
72
+ try {
73
+ execSync("tiger version", { stdio: "ignore" });
74
+ }
75
+ catch {
76
+ p.log.error("Tiger CLI not found. Install it: curl -fsSL https://cli.tigerdata.com | sh");
77
+ process.exit(1);
78
+ }
79
+ try {
80
+ const stdout = execSync("tiger auth status -o json", {
81
+ encoding: "utf-8",
82
+ stdio: ["pipe", "pipe", "pipe"],
83
+ });
84
+ JSON.parse(stdout);
85
+ }
86
+ catch {
87
+ p.log.info("Tiger Cloud authentication required. Opening browser...");
88
+ try {
89
+ execSync("tiger auth login", { stdio: "inherit" });
90
+ }
91
+ catch {
92
+ p.log.error("Tiger Cloud login failed. Try running 'tiger auth login' manually.");
93
+ process.exit(1);
94
+ }
95
+ }
96
+ }
97
+ async function waitForDatabase(serviceId, timeoutMs = 5 * 60 * 1000, intervalMs = 5000) {
98
+ const start = Date.now();
99
+ while (Date.now() - start < timeoutMs) {
100
+ try {
101
+ const stdout = execSync(`tiger service get ${serviceId} -o json`, {
102
+ encoding: "utf-8",
103
+ stdio: ["pipe", "pipe", "pipe"],
104
+ });
105
+ const info = JSON.parse(stdout);
106
+ if (info.status?.toLowerCase() === "ready") {
107
+ return true;
108
+ }
109
+ }
110
+ catch {
111
+ // Continue retrying
112
+ }
113
+ await new Promise((r) => setTimeout(r, intervalMs));
114
+ }
115
+ return false;
116
+ }
117
+ // ── Main command ────────────────────────────────────────────────
118
+ export async function runCloudRun() {
119
+ p.intro(pc.bold("0pflow cloud run"));
120
+ // ── Step 1: Authenticate with 0pflow cloud ────────────────────
121
+ if (!isAuthenticated()) {
122
+ p.log.info("Authenticating with 0pflow cloud...");
123
+ await authenticate();
124
+ if (!isAuthenticated()) {
125
+ p.log.error("Not authenticated. Run `0pflow login` first.");
126
+ process.exit(1);
127
+ }
128
+ }
129
+ // ── Step 2: Choose existing workspace or create new ───────────
130
+ let existingSandboxes = [];
131
+ try {
132
+ existingSandboxes = (await apiCall("GET", "/api/cloud-dev/list"));
133
+ }
134
+ catch {
135
+ // ignore — treat as no existing sandboxes
136
+ }
137
+ let appName;
138
+ if (existingSandboxes.length > 0) {
139
+ const choice = await p.select({
140
+ message: "Workspace",
141
+ options: [
142
+ ...existingSandboxes.map((m) => ({
143
+ value: m.app_name,
144
+ label: `${m.app_name} — ${m.fly_state}`,
145
+ })),
146
+ { value: "__new__", label: "Create a new workspace" },
147
+ ],
148
+ });
149
+ if (p.isCancel(choice)) {
150
+ p.cancel("Cancelled.");
151
+ process.exit(0);
152
+ }
153
+ if (choice !== "__new__") {
154
+ const existing = existingSandboxes.find((m) => m.app_name === choice);
155
+ if (existing?.app_url) {
156
+ p.log.info(`URL: ${pc.cyan(existing.app_url)}`);
157
+ openInBrowser(existing.app_url);
158
+ }
159
+ p.log.info(`Status: ${pc.bold(existing?.fly_state ?? "unknown")}`);
160
+ p.outro(pc.green("Sandbox ready."));
161
+ return;
162
+ }
163
+ const nameInput = await p.text({
164
+ message: "Workspace name",
165
+ placeholder: "my-app",
166
+ validate: (value) => {
167
+ if (!value)
168
+ return "Name is required";
169
+ if (!/^[a-z][a-z0-9-]*$/.test(value))
170
+ return "Must start with a letter, only lowercase letters, numbers, and hyphens";
171
+ return undefined;
172
+ },
173
+ });
174
+ if (p.isCancel(nameInput)) {
175
+ p.cancel("Cancelled.");
176
+ process.exit(0);
177
+ }
178
+ appName = nameInput;
179
+ }
180
+ else {
181
+ const nameInput = await p.text({
182
+ message: "Workspace name",
183
+ placeholder: "my-app",
184
+ validate: (value) => {
185
+ if (!value)
186
+ return "Name is required";
187
+ if (!/^[a-z][a-z0-9-]*$/.test(value))
188
+ return "Must start with a letter, only lowercase letters, numbers, and hyphens";
189
+ return undefined;
190
+ },
191
+ });
192
+ if (p.isCancel(nameInput)) {
193
+ p.cancel("Cancelled.");
194
+ process.exit(0);
195
+ }
196
+ appName = nameInput;
197
+ }
198
+ // ── Step 3: Collect Claude Code credentials ───────────────────
199
+ const claudeCreds = collectClaudeCredentials();
200
+ if (Object.keys(claudeCreds).length === 0) {
201
+ p.log.warn("No Claude Code credentials found. The embedded terminal won't be able to use Claude.\n" +
202
+ "Set ANTHROPIC_API_KEY or sign in to Claude Code first.");
203
+ }
204
+ else {
205
+ const credType = Object.keys(claudeCreds)[0];
206
+ p.log.info(`Found Claude Code credentials (${credType})`);
207
+ }
208
+ const s = p.spinner();
209
+ // ── Step 4: Tiger auth + choose or create database ─────────────
210
+ ensureTigerAuth();
211
+ let serviceId;
212
+ let existingServices = [];
213
+ try {
214
+ const listOutput = execSync("tiger service list -o json", {
215
+ encoding: "utf-8",
216
+ stdio: ["pipe", "pipe", "pipe"],
217
+ });
218
+ existingServices = JSON.parse(listOutput);
219
+ }
220
+ catch {
221
+ // tiger CLI failed — fall through to create new
222
+ }
223
+ if (existingServices.length > 0) {
224
+ const dbChoice = await p.select({
225
+ message: "Database",
226
+ options: [
227
+ { value: "__new__", label: "Create a new database" },
228
+ ...existingServices.map((svc) => ({
229
+ value: svc.service_id,
230
+ label: `${svc.name} (${svc.service_id}) — ${svc.status}`,
231
+ })),
232
+ ],
233
+ });
234
+ if (p.isCancel(dbChoice)) {
235
+ p.cancel("Cancelled.");
236
+ process.exit(0);
237
+ }
238
+ if (dbChoice === "__new__") {
239
+ s.start("Creating database...");
240
+ const dbResult = await createDatabase({ name: `${appName}-db` });
241
+ if (!dbResult.success || !dbResult.service_id) {
242
+ s.stop(pc.red("Failed to create database"));
243
+ p.log.error(dbResult.error ?? "Unknown error");
244
+ process.exit(1);
245
+ }
246
+ serviceId = dbResult.service_id;
247
+ s.stop(pc.green(`Database created (${serviceId})`));
248
+ }
249
+ else {
250
+ serviceId = dbChoice;
251
+ p.log.info(`Using existing database: ${serviceId}`);
252
+ }
253
+ }
254
+ else {
255
+ s.start("Creating database...");
256
+ const dbResult = await createDatabase({ name: `${appName}-db` });
257
+ if (!dbResult.success || !dbResult.service_id) {
258
+ s.stop(pc.red("Failed to create database"));
259
+ p.log.error(dbResult.error ?? "Unknown error");
260
+ process.exit(1);
261
+ }
262
+ serviceId = dbResult.service_id;
263
+ s.stop(pc.green(`Database created (${serviceId})`));
264
+ }
265
+ // ── Step 5: Wait for database to be ready ──────────────────────
266
+ s.start("Waiting for database to be ready...");
267
+ const ready = await waitForDatabase(serviceId);
268
+ if (!ready) {
269
+ s.stop(pc.red("Database timeout"));
270
+ p.log.error("Database took too long to become ready.");
271
+ process.exit(1);
272
+ }
273
+ s.stop(pc.green("Database is ready"));
274
+ // ── Step 6: Setup app schema (to temp dir for env vars) ────────
275
+ s.start("Setting up database schema...");
276
+ const tmpDir = mkdtempSync(join(tmpdir(), "opflow-cloud-dev-"));
277
+ try {
278
+ const schemaResult = await setupAppSchema({
279
+ directory: tmpDir,
280
+ serviceId,
281
+ appName: appName,
282
+ });
283
+ if (!schemaResult.success) {
284
+ s.stop(pc.red("Schema setup failed"));
285
+ p.log.error(schemaResult.message);
286
+ process.exit(1);
287
+ }
288
+ s.stop(pc.green("Database schema configured"));
289
+ // Read env vars from the generated .env
290
+ const envPath = join(tmpDir, ".env");
291
+ const envContent = readFileSync(envPath, "utf-8");
292
+ const envVars = dotenv.parse(envContent);
293
+ // ── Step 7: Collect all env vars for the machine ─────────────
294
+ const { getToken } = await import("../connections/cloud-auth.js");
295
+ const opflowToken = getToken();
296
+ const machineEnvVars = {
297
+ ...claudeCreds,
298
+ DATABASE_URL: envVars.DATABASE_URL ?? "",
299
+ DATABASE_SCHEMA: envVars.DATABASE_SCHEMA ?? "",
300
+ };
301
+ if (envVars.DBOS_ADMIN_URL) {
302
+ machineEnvVars.DBOS_ADMIN_URL = envVars.DBOS_ADMIN_URL;
303
+ }
304
+ if (opflowToken) {
305
+ machineEnvVars.OPFLOW_TOKEN = opflowToken;
306
+ }
307
+ // ── Step 8: Create cloud dev machine via auth-server ─────────
308
+ s.start("Creating cloud dev sandbox...");
309
+ let createResult;
310
+ try {
311
+ createResult = (await apiCall("POST", "/api/cloud-dev/create", {
312
+ appName: appName,
313
+ envVars: machineEnvVars,
314
+ }));
315
+ }
316
+ catch (err) {
317
+ s.stop(pc.red("Failed to create cloud dev sandbox"));
318
+ p.log.error(err instanceof Error ? err.message : String(err));
319
+ process.exit(1);
320
+ }
321
+ s.stop(pc.green("Sandbox created"));
322
+ // ── Step 9: Poll for sandbox to be running ───────────────────
323
+ s.start("Waiting for sandbox to start...");
324
+ const pollTimeout = 5 * 60 * 1000;
325
+ const pollInterval = 5000;
326
+ const pollStart = Date.now();
327
+ while (Date.now() - pollStart < pollTimeout) {
328
+ await new Promise((r) => setTimeout(r, pollInterval));
329
+ try {
330
+ const statusResult = (await apiCall("GET", `/api/cloud-dev/status?appName=${encodeURIComponent(appName)}`));
331
+ if (statusResult.status === "running") {
332
+ const url = statusResult.url ?? createResult.appUrl;
333
+ s.stop(pc.green("Sandbox is running!"));
334
+ p.log.info(`URL: ${pc.cyan(url)}`);
335
+ openInBrowser(url);
336
+ p.outro(pc.green("Cloud dev environment is ready!"));
337
+ return;
338
+ }
339
+ if (statusResult.status === "error") {
340
+ s.stop(pc.red("Sandbox failed to start"));
341
+ p.log.error("Check logs with: 0pflow cloud status");
342
+ process.exit(1);
343
+ }
344
+ s.message(`Sandbox state: ${statusResult.status}...`);
345
+ }
346
+ catch {
347
+ // Continue polling on transient errors
348
+ }
349
+ }
350
+ s.stop(pc.yellow("Sandbox is still starting"));
351
+ p.log.info(`URL: ${pc.cyan(createResult.appUrl)}`);
352
+ p.log.info("Sandbox is taking longer than expected. Check status with:");
353
+ p.log.info(" 0pflow cloud status");
354
+ p.outro(pc.yellow("Cloud dev environment is starting..."));
355
+ }
356
+ finally {
357
+ // Clean up temp dir
358
+ try {
359
+ rmSync(tmpDir, { recursive: true });
360
+ }
361
+ catch {
362
+ /* ignore */
363
+ }
364
+ }
365
+ }
366
+ const STOPPED_STATES = new Set(["stopped", "suspended", "destroyed"]);
367
+ async function selectMachine(opts) {
368
+ let all = [];
369
+ try {
370
+ all = (await apiCall("GET", "/api/cloud-dev/list"));
371
+ }
372
+ catch (err) {
373
+ p.log.error(`Failed to list workspaces: ${err instanceof Error ? err.message : String(err)}`);
374
+ process.exit(1);
375
+ }
376
+ const machines = opts?.excludeStopped
377
+ ? all.filter((m) => !STOPPED_STATES.has(m.fly_state ?? ""))
378
+ : all;
379
+ if (all.length === 0) {
380
+ p.log.info("No cloud dev workspaces found.");
381
+ process.exit(0);
382
+ }
383
+ if (machines.length === 0) {
384
+ p.log.info("No running workspaces found.");
385
+ process.exit(0);
386
+ }
387
+ if (machines.length === 1) {
388
+ p.log.info(`Using: ${machines[0].app_name}`);
389
+ return machines[0].app_name;
390
+ }
391
+ const choice = await p.select({
392
+ message: "Select workspace",
393
+ options: machines.map((m) => ({
394
+ value: m.app_name,
395
+ label: `${m.app_name} — ${m.fly_state}`,
396
+ })),
397
+ });
398
+ if (p.isCancel(choice)) {
399
+ p.cancel("Cancelled.");
400
+ process.exit(0);
401
+ }
402
+ return choice;
403
+ }
404
+ async function ensureAuth() {
405
+ if (!isAuthenticated()) {
406
+ await authenticate();
407
+ if (!isAuthenticated()) {
408
+ p.log.error("Not authenticated. Run `0pflow login` first.");
409
+ process.exit(1);
410
+ }
411
+ }
412
+ }
413
+ export async function handleStatus() {
414
+ await ensureAuth();
415
+ process.stdout.write("Fetching workspaces...");
416
+ let machines = [];
417
+ try {
418
+ machines = (await apiCall("GET", "/api/cloud-dev/list"));
419
+ process.stdout.write("\r\x1b[K");
420
+ }
421
+ catch (err) {
422
+ process.stdout.write("\r\x1b[K");
423
+ console.error(pc.red(err instanceof Error ? err.message : String(err)));
424
+ return;
425
+ }
426
+ if (machines.length === 0) {
427
+ console.log("No cloud dev workspaces found.");
428
+ return;
429
+ }
430
+ const nameW = Math.max(9, ...machines.map((m) => m.app_name.length));
431
+ const stateW = Math.max(5, ...machines.map((m) => (m.fly_state ?? "unknown").length));
432
+ const header = ` ${"WORKSPACE".padEnd(nameW)} ${"STATE".padEnd(stateW)} URL`;
433
+ const divider = ` ${"-".repeat(nameW)} ${"-".repeat(stateW)} ${"-".repeat(40)}`;
434
+ console.log(pc.bold(header));
435
+ console.log(pc.dim(divider));
436
+ for (const m of machines) {
437
+ const state = m.fly_state ?? "unknown";
438
+ const stateColored = state === "started" ? pc.green(state.padEnd(stateW))
439
+ : state === "stopped" || state === "suspended" ? pc.yellow(state.padEnd(stateW))
440
+ : pc.dim(state.padEnd(stateW));
441
+ console.log(` ${m.app_name.padEnd(nameW)} ${stateColored} ${pc.cyan(m.app_url ?? "")}`);
442
+ }
443
+ }
444
+ export async function handleStop() {
445
+ await ensureAuth();
446
+ const appName = await selectMachine({ excludeStopped: true });
447
+ const s = p.spinner();
448
+ s.start("Stopping sandbox...");
449
+ try {
450
+ await apiCall("POST", "/api/cloud-dev/stop", { appName });
451
+ s.stop(pc.green("Sandbox stopped"));
452
+ }
453
+ catch (err) {
454
+ s.stop(pc.red("Failed"));
455
+ p.log.error(err instanceof Error ? err.message : String(err));
456
+ }
457
+ p.outro("");
458
+ }
459
+ export async function handleDestroy() {
460
+ await ensureAuth();
461
+ const appName = await selectMachine();
462
+ const confirm = await p.confirm({
463
+ message: `Destroy workspace "${appName}"? This permanently deletes all workflows, code, and data in the workspace and cannot be undone.`,
464
+ });
465
+ if (p.isCancel(confirm) || !confirm) {
466
+ p.cancel("Cancelled.");
467
+ return;
468
+ }
469
+ const s = p.spinner();
470
+ s.start("Destroying workspace...");
471
+ try {
472
+ await apiCall("POST", "/api/cloud-dev/destroy", { appName });
473
+ s.stop(pc.green("Workspace destroyed"));
474
+ }
475
+ catch (err) {
476
+ s.stop(pc.red("Failed"));
477
+ p.log.error(err instanceof Error ? err.message : String(err));
478
+ }
479
+ p.outro("");
480
+ }
481
+ const SSH_KEYS_DIR = join(homedir(), ".0pflow", "keys");
482
+ function getCachedKeyPath(appName) {
483
+ return join(SSH_KEYS_DIR, appName);
484
+ }
485
+ async function getSSHKey(appName) {
486
+ // Try cached key first
487
+ const keyPath = getCachedKeyPath(appName);
488
+ if (existsSync(keyPath)) {
489
+ // Still need connection info from the API — read from cached metadata
490
+ const metaPath = `${keyPath}.json`;
491
+ if (existsSync(metaPath)) {
492
+ const meta = JSON.parse(readFileSync(metaPath, "utf-8"));
493
+ meta.privateKey = readFileSync(keyPath, "utf-8");
494
+ return meta;
495
+ }
496
+ }
497
+ // Fetch from API
498
+ const result = (await apiCall("GET", `/api/cloud-dev/ssh-key?appName=${encodeURIComponent(appName)}`));
499
+ // Cache locally
500
+ mkdirSync(SSH_KEYS_DIR, { recursive: true, mode: 0o700 });
501
+ writeFileSync(keyPath, result.privateKey, { mode: 0o600 });
502
+ writeFileSync(`${keyPath}.json`, JSON.stringify({
503
+ linuxUser: result.linuxUser,
504
+ host: result.host,
505
+ port: result.port,
506
+ }));
507
+ return result;
508
+ }
509
+ function connectSSH(info, command) {
510
+ // Use cached key file, or write a temp one
511
+ let keyFile = getCachedKeyPath(info.host.replace(/\.fly\.dev$/, ""));
512
+ if (!existsSync(keyFile)) {
513
+ mkdirSync(SSH_KEYS_DIR, { recursive: true, mode: 0o700 });
514
+ keyFile = join(SSH_KEYS_DIR, `tmp-${Date.now()}`);
515
+ writeFileSync(keyFile, info.privateKey, { mode: 0o600 });
516
+ }
517
+ const args = [
518
+ "-i", keyFile,
519
+ "-t",
520
+ "-p", String(info.port),
521
+ "-o", "StrictHostKeyChecking=no",
522
+ "-o", "UserKnownHostsFile=/dev/null",
523
+ "-o", "LogLevel=ERROR",
524
+ `${info.linuxUser}@${info.host}`,
525
+ ];
526
+ if (command) {
527
+ args.push(command);
528
+ }
529
+ const result = spawnSync("ssh", args, { stdio: "inherit" });
530
+ return result.status ?? 1;
531
+ }
532
+ export async function handleClaude(extraArgs = []) {
533
+ await ensureAuth();
534
+ const appName = await selectMachine({ excludeStopped: true });
535
+ const s = p.spinner();
536
+ s.start("Fetching SSH credentials...");
537
+ let sshInfo;
538
+ try {
539
+ sshInfo = await getSSHKey(appName);
540
+ s.stop(pc.green(`Connecting to ${appName}`));
541
+ }
542
+ catch (err) {
543
+ s.stop(pc.red("Failed to get SSH key"));
544
+ p.log.error(err instanceof Error ? err.message : String(err));
545
+ process.exit(1);
546
+ }
547
+ const allArgs = ["--dangerously-skip-permissions", ...extraArgs];
548
+ const exitCode = connectSSH(sshInfo, `cd /data/app && exec claude ${allArgs.join(" ")}`);
549
+ process.exit(exitCode);
550
+ }
551
+ export async function handleSSH() {
552
+ await ensureAuth();
553
+ const appName = await selectMachine({ excludeStopped: true });
554
+ const s = p.spinner();
555
+ s.start("Fetching SSH credentials...");
556
+ let sshInfo;
557
+ try {
558
+ sshInfo = await getSSHKey(appName);
559
+ s.stop(pc.green(`Connecting to ${appName}`));
560
+ }
561
+ catch (err) {
562
+ s.stop(pc.red("Failed to get SSH key"));
563
+ p.log.error(err instanceof Error ? err.message : String(err));
564
+ process.exit(1);
565
+ }
566
+ const exitCode = connectSSH(sshInfo);
567
+ process.exit(exitCode);
568
+ }
569
+ //# sourceMappingURL=cloud-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-dev.js","sourceRoot":"","sources":["../../src/cli/cloud-dev.ts"],"names":[],"mappings":"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"}
package/dist/cli/env.d.ts CHANGED
@@ -9,7 +9,9 @@ export declare function findEnvFile(startDir: string): string | null;
9
9
  */
10
10
  export declare function loadEnv(envPath: string): void;
11
11
  /**
12
- * Find .env starting from cwd and load it into process.env
12
+ * Find .env starting from cwd and load it into process.env.
13
+ * If DATABASE_URL is already set (e.g. from cloud env vars), .env is optional —
14
+ * load it if it exists (local overrides) but don't throw if it's missing.
13
15
  */
14
16
  export declare function resolveEnv(): void;
15
17
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB3D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAe7C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAUjC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB3D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAe7C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAajC"}