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.
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +4 -0
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/cloud-dev.d.ts +7 -0
- package/dist/cli/cloud-dev.d.ts.map +1 -0
- package/dist/cli/cloud-dev.js +569 -0
- package/dist/cli/cloud-dev.js.map +1 -0
- package/dist/cli/env.d.ts +3 -1
- package/dist/cli/env.d.ts.map +1 -1
- package/dist/cli/env.js +8 -3
- package/dist/cli/env.js.map +1 -1
- package/dist/cli/index.js +66 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -1
- package/dist/cli/mcp/lib/scaffolding.js +23 -20
- package/dist/cli/mcp/lib/scaffolding.js.map +1 -1
- package/dist/connections/cloud-client.d.ts.map +1 -1
- package/dist/connections/cloud-client.js +10 -3
- package/dist/connections/cloud-client.js.map +1 -1
- package/dist/dev-ui/dev-server.d.ts.map +1 -1
- package/dist/dev-ui/dev-server.js +3 -1
- package/dist/dev-ui/dev-server.js.map +1 -1
- package/dist/dev-ui-client/assets/{index-CFhxfKAk.js → index-CKl0_jfo.js} +1 -1
- package/dist/dev-ui-client/index.html +1 -1
- package/package.json +1 -1
package/dist/cli/app.d.ts.map
CHANGED
|
@@ -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,
|
|
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. " +
|
package/dist/cli/app.js.map
CHANGED
|
@@ -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
|
package/dist/cli/env.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|