flingit 0.0.4 → 0.0.6
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 +18 -21
- package/dist/cli/commands/cron.d.ts.map +1 -1
- package/dist/cli/commands/cron.js +16 -12
- package/dist/cli/commands/cron.js.map +1 -1
- package/dist/cli/commands/dev-worker.d.ts +12 -0
- package/dist/cli/commands/dev-worker.d.ts.map +1 -0
- package/dist/cli/commands/dev-worker.js +66 -0
- package/dist/cli/commands/dev-worker.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +8 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +137 -82
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/onboard.d.ts +11 -3
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/onboard.js +148 -51
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +39 -33
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/utils/onboarding-io-impl.d.ts +12 -0
- package/dist/cli/utils/onboarding-io-impl.d.ts.map +1 -0
- package/dist/cli/utils/onboarding-io-impl.js +85 -0
- package/dist/cli/utils/onboarding-io-impl.js.map +1 -0
- package/dist/cli/utils/onboarding-io.d.ts +60 -0
- package/dist/cli/utils/onboarding-io.d.ts.map +1 -0
- package/dist/cli/utils/onboarding-io.js +9 -0
- package/dist/cli/utils/onboarding-io.js.map +1 -0
- package/dist/cli/utils/retry.d.ts +25 -0
- package/dist/cli/utils/retry.d.ts.map +1 -0
- package/dist/cli/utils/retry.js +34 -0
- package/dist/cli/utils/retry.js.map +1 -0
- package/dist/runtime/migrate.d.ts.map +1 -1
- package/dist/runtime/migrate.js +3 -2
- package/dist/runtime/migrate.js.map +1 -1
- package/dist/worker-runtime/index.d.ts.map +1 -1
- package/dist/worker-runtime/index.js +3 -2
- package/dist/worker-runtime/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## What is Fling?
|
|
8
8
|
|
|
9
|
-
Fling
|
|
9
|
+
Fling is the fastest way from Claude Code to deployed software.
|
|
10
10
|
|
|
11
11
|
> "I want a podcast feed that picks randomly between Hard Fork and The Daily each day, and gives me one episode per day."
|
|
12
12
|
|
|
@@ -24,26 +24,9 @@ That's it. This creates a project at `~/fling`, sets up the environment, and ope
|
|
|
24
24
|
|
|
25
25
|
Requires Node.js 22 or later.
|
|
26
26
|
|
|
27
|
-
### Global Install (Optional)
|
|
28
|
-
|
|
29
|
-
If you prefer a global command:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
npm install -g flingit
|
|
33
|
-
fling
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Returning to Your Project
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npx flingit
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Opens Claude Code in your existing project. Continue where you left off.
|
|
43
|
-
|
|
44
27
|
## How It Works
|
|
45
28
|
|
|
46
|
-
Fling provides four primitives that Claude uses to build your tools:
|
|
29
|
+
Fling provides four primitives (more to come) that Claude uses to build your tools:
|
|
47
30
|
|
|
48
31
|
| Primitive | What it does |
|
|
49
32
|
|-----------|--------------|
|
|
@@ -52,7 +35,7 @@ Fling provides four primitives that Claude uses to build your tools:
|
|
|
52
35
|
| **Database** | Store and query data (SQLite) |
|
|
53
36
|
| **Secrets** | Manage API keys and credentials |
|
|
54
37
|
|
|
55
|
-
Everything works locally during development. When you're ready,
|
|
38
|
+
Everything works locally during development. When you're ready, just tell Claude Code to deploys to production.
|
|
56
39
|
|
|
57
40
|
## Design Philosophy
|
|
58
41
|
|
|
@@ -60,10 +43,20 @@ Everything works locally during development. When you're ready, `fling push` dep
|
|
|
60
43
|
|
|
61
44
|
2. **Standard tools over custom abstractions** — Hono for HTTP, SQLite for data, standard cron syntax. Claude already knows these.
|
|
62
45
|
|
|
63
|
-
3. **Local-first development** — Everything works
|
|
46
|
+
3. **Local-first development** — Everything works and can be tested locally.
|
|
64
47
|
|
|
65
48
|
4. **Fail fast** — Missing secrets throw. Invalid syntax throws. Obvious errors help Claude debug.
|
|
66
49
|
|
|
50
|
+
## Running Fling From Source
|
|
51
|
+
|
|
52
|
+
To run fling from this repo, just do
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npm run cli
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
That's the equivalent of running `npx flingit`. It will also do the onboarding flow and create a Fling project, but the `flingit` dependency there will point to your local package instead of the public package on NPM.
|
|
59
|
+
|
|
67
60
|
## Publishing
|
|
68
61
|
|
|
69
62
|
The package is published to npm as `flingit`. The `prepublishOnly` script runs lint, typecheck, build, and tests automatically.
|
|
@@ -82,4 +75,8 @@ npm pack --dry-run
|
|
|
82
75
|
|
|
83
76
|
- [ARCHITECTURE.md](./ARCHITECTURE.md) — How Fling works internally (CLI commands, runtime API, platform)
|
|
84
77
|
- [API.md](./API.md) — Platform HTTP API reference
|
|
78
|
+
- [DEPLOYMENT.md](./DEPLOYMENT.md) — How the Fling platform deploys
|
|
79
|
+
- [SCRIPTS.md](./SCRIPTS.md) — All the scripts in this repo
|
|
80
|
+
- [CLI.md](./CLI.md) — All the commands provided by the CLI
|
|
81
|
+
- [SMOKE-TEST.md](./SMOKE-TEST.md) — What the smoke-test tests
|
|
85
82
|
- [SPEC.md](./SPEC.md) — Original product specification
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cron.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cron.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4LpC,eAAO,MAAM,WAAW,SAoCpB,CAAC"}
|
|
@@ -40,21 +40,23 @@ async function listCronJobs() {
|
|
|
40
40
|
}
|
|
41
41
|
// Print table header
|
|
42
42
|
console.log("");
|
|
43
|
-
console.log("Name".padEnd(
|
|
43
|
+
console.log("Name".padEnd(25) +
|
|
44
44
|
"Schedule".padEnd(15) +
|
|
45
|
-
"
|
|
46
|
-
"
|
|
45
|
+
"Scheduled For".padEnd(22) +
|
|
46
|
+
"Started At".padEnd(22) +
|
|
47
47
|
"Status");
|
|
48
|
-
console.log("-".repeat(
|
|
48
|
+
console.log("-".repeat(95));
|
|
49
49
|
for (const job of data.crons) {
|
|
50
|
-
const name = truncate(job.name,
|
|
50
|
+
const name = truncate(job.name, 23).padEnd(25);
|
|
51
51
|
const schedule = truncate(job.schedule, 13).padEnd(15);
|
|
52
|
-
const
|
|
53
|
-
const lastRun = job.lastRun
|
|
52
|
+
const scheduledFor = job.lastRun
|
|
54
53
|
? formatDate(job.lastRun.scheduledFor).padEnd(22)
|
|
55
54
|
: "never".padEnd(22);
|
|
55
|
+
const startedAt = job.lastRun
|
|
56
|
+
? formatDate(job.lastRun.startedAt).padEnd(22)
|
|
57
|
+
: "-".padEnd(22);
|
|
56
58
|
const status = job.lastRun?.status ?? "-";
|
|
57
|
-
console.log(name + schedule +
|
|
59
|
+
console.log(name + schedule + scheduledFor + startedAt + status);
|
|
58
60
|
}
|
|
59
61
|
console.log("");
|
|
60
62
|
}
|
|
@@ -77,22 +79,24 @@ async function showCronHistory(name, limit) {
|
|
|
77
79
|
console.log(`Invocation history for "${name}":`);
|
|
78
80
|
console.log("");
|
|
79
81
|
console.log("Scheduled For".padEnd(22) +
|
|
82
|
+
"Started At".padEnd(22) +
|
|
80
83
|
"Finished At".padEnd(22) +
|
|
81
84
|
"Status".padEnd(10) +
|
|
82
85
|
"Result / Error");
|
|
83
|
-
console.log("-".repeat(
|
|
86
|
+
console.log("-".repeat(110));
|
|
84
87
|
for (const inv of data.invocations) {
|
|
85
88
|
const scheduledFor = formatDate(inv.scheduledFor).padEnd(22);
|
|
89
|
+
const startedAt = formatDate(inv.startedAt).padEnd(22);
|
|
86
90
|
const finishedAt = inv.finishedAt
|
|
87
91
|
? formatDate(inv.finishedAt).padEnd(22)
|
|
88
92
|
: "running...".padEnd(22);
|
|
89
93
|
const status = inv.status.padEnd(10);
|
|
90
94
|
const result = inv.status === "error"
|
|
91
|
-
? truncate(inv.error ?? "Unknown error",
|
|
95
|
+
? truncate(inv.error ?? "Unknown error", 30)
|
|
92
96
|
: inv.result
|
|
93
|
-
? truncate(JSON.stringify(inv.result),
|
|
97
|
+
? truncate(JSON.stringify(inv.result), 30)
|
|
94
98
|
: "-";
|
|
95
|
-
console.log(scheduledFor + finishedAt + status + result);
|
|
99
|
+
console.log(scheduledFor + startedAt + finishedAt + status + result);
|
|
96
100
|
}
|
|
97
101
|
console.log("");
|
|
98
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../src/cli/commands/cron.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../src/cli/commands/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fling dev worker - The actual development server process
|
|
3
|
+
*
|
|
4
|
+
* This script is spawned by `fling dev` using `tsx watch`.
|
|
5
|
+
* tsx watch monitors all imported files and restarts this process on changes.
|
|
6
|
+
*
|
|
7
|
+
* Environment variables:
|
|
8
|
+
* PORT - Port to run the HTTP server on (default: 3210)
|
|
9
|
+
* PROJECT_DIR - Project directory (default: cwd)
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=dev-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-worker.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fling dev worker - The actual development server process
|
|
3
|
+
*
|
|
4
|
+
* This script is spawned by `fling dev` using `tsx watch`.
|
|
5
|
+
* tsx watch monitors all imported files and restarts this process on changes.
|
|
6
|
+
*
|
|
7
|
+
* Environment variables:
|
|
8
|
+
* PORT - Port to run the HTTP server on (default: 3210)
|
|
9
|
+
* PROJECT_DIR - Project directory (default: cwd)
|
|
10
|
+
*/
|
|
11
|
+
import { serve } from "@hono/node-server";
|
|
12
|
+
import { pathToFileURL } from "node:url";
|
|
13
|
+
import { getWorkerEntryPath } from "../utils/project.js";
|
|
14
|
+
const port = parseInt(process.env["PORT"] ?? "3210", 10);
|
|
15
|
+
const projectDir = process.env["PROJECT_DIR"] ?? process.cwd();
|
|
16
|
+
const workerEntry = getWorkerEntryPath(projectDir);
|
|
17
|
+
console.log(`[worker] Starting backend server (pid ${process.pid})...`);
|
|
18
|
+
let server = null;
|
|
19
|
+
async function main() {
|
|
20
|
+
try {
|
|
21
|
+
// Import the user's app - this registers routes, cron jobs, and migrations
|
|
22
|
+
// tsx handles TypeScript imports automatically
|
|
23
|
+
const appUrl = pathToFileURL(workerEntry).href;
|
|
24
|
+
await import(appUrl);
|
|
25
|
+
// Import runtime modules
|
|
26
|
+
const { app } = await import("../../runtime/http.js");
|
|
27
|
+
const { runMigrations } = await import("../../runtime/migrate.js");
|
|
28
|
+
const { startCronJobs, getCronJobs, stopCronJobs } = await import("../../runtime/cron.js");
|
|
29
|
+
const { closeLogDatabase } = await import("../../runtime/log.js");
|
|
30
|
+
// Run migrations (before starting crons or HTTP server)
|
|
31
|
+
await runMigrations();
|
|
32
|
+
// Start cron jobs
|
|
33
|
+
startCronJobs();
|
|
34
|
+
const cronJobs = getCronJobs();
|
|
35
|
+
if (cronJobs.size > 0) {
|
|
36
|
+
console.log(`[worker] Cron jobs: ${cronJobs.size} registered`);
|
|
37
|
+
}
|
|
38
|
+
// Graceful shutdown handler
|
|
39
|
+
const shutdown = () => {
|
|
40
|
+
console.log("[worker] Shutting down...");
|
|
41
|
+
stopCronJobs();
|
|
42
|
+
closeLogDatabase();
|
|
43
|
+
if (server) {
|
|
44
|
+
server.close();
|
|
45
|
+
}
|
|
46
|
+
process.exit(0);
|
|
47
|
+
};
|
|
48
|
+
process.on("SIGINT", shutdown);
|
|
49
|
+
process.on("SIGTERM", shutdown);
|
|
50
|
+
// Start HTTP server
|
|
51
|
+
console.log(`[worker] API server: http://localhost:${port}`);
|
|
52
|
+
server = serve({
|
|
53
|
+
fetch: app.fetch,
|
|
54
|
+
port,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error("[worker] Failed to start:", error);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
main().catch((error) => {
|
|
63
|
+
console.error("[worker] Unhandled error:", error);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=dev-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-worker.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAc,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACzD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAE/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAEnD,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AAExE,IAAI,MAAM,GAAsB,IAAI,CAAC;AAErC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,2EAA2E;QAC3E,+CAA+C;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAErB,yBAAyB;QACzB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACnE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAC/D,uBAAuB,CACxB,CAAC;QACF,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAElE,wDAAwD;QACxD,MAAM,aAAa,EAAE,CAAC;QAEtB,kBAAkB;QAClB,aAAa,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC;QACjE,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,oBAAoB;QACpB,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;QAE7D,MAAM,GAAG,KAAK,CAAC;YACb,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* fling dev - Run the local development server
|
|
2
|
+
* fling dev - Run the local development server with HMR
|
|
3
|
+
*
|
|
4
|
+
* This is a thin supervisor that spawns:
|
|
5
|
+
* 1. tsx watch dev-worker.ts - Backend server with automatic restart on changes
|
|
6
|
+
* 2. Vite dev server - Frontend with HMR
|
|
7
|
+
*
|
|
8
|
+
* tsx watch automatically monitors all imported files (follows the import graph)
|
|
9
|
+
* and restarts the worker process when any dependency changes.
|
|
3
10
|
*/
|
|
4
11
|
import { Command } from "commander";
|
|
5
12
|
export declare const devCommand: Command;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,eAAO,MAAM,UAAU,SAyNnB,CAAC"}
|
package/dist/cli/commands/dev.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* fling dev - Run the local development server
|
|
2
|
+
* fling dev - Run the local development server with HMR
|
|
3
|
+
*
|
|
4
|
+
* This is a thin supervisor that spawns:
|
|
5
|
+
* 1. tsx watch dev-worker.ts - Backend server with automatic restart on changes
|
|
6
|
+
* 2. Vite dev server - Frontend with HMR
|
|
7
|
+
*
|
|
8
|
+
* tsx watch automatically monitors all imported files (follows the import graph)
|
|
9
|
+
* and restarts the worker process when any dependency changes.
|
|
3
10
|
*/
|
|
4
11
|
import { Command } from "commander";
|
|
5
|
-
import { serve } from "@hono/node-server";
|
|
6
12
|
import { existsSync } from "node:fs";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { pathToFileURL } from "node:url";
|
|
13
|
+
import { join, dirname } from "node:path";
|
|
9
14
|
import { spawn } from "node:child_process";
|
|
10
|
-
import {
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
import { createRequire } from "node:module";
|
|
17
|
+
import { hasWorkerEntry } from "../utils/project.js";
|
|
18
|
+
// Find tsx CLI from flingit's node_modules, not the user's project
|
|
19
|
+
const require = createRequire(import.meta.url);
|
|
20
|
+
const tsxCliPath = require.resolve("tsx/cli");
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
const __dirname = dirname(__filename);
|
|
11
23
|
export const devCommand = new Command("dev")
|
|
12
24
|
.description("Start the local development server")
|
|
13
25
|
.option("-p, --port <port>", "Port to run on", "3210")
|
|
@@ -24,8 +36,10 @@ What it does:
|
|
|
24
36
|
- Starts Vite dev server at http://localhost:5173
|
|
25
37
|
- Proxies /api/* requests from Vite to the API server
|
|
26
38
|
- React HMR enabled for frontend development
|
|
39
|
+
- Backend HMR: changes to src/worker/**/*.ts trigger automatic restart
|
|
27
40
|
|
|
28
41
|
The servers run until you press Ctrl+C.
|
|
42
|
+
Press Enter to manually restart the backend.
|
|
29
43
|
|
|
30
44
|
Examples:
|
|
31
45
|
fling dev Start on default port 3210
|
|
@@ -46,78 +60,88 @@ Examples:
|
|
|
46
60
|
console.error("Run 'fling init' to create a new project with the correct structure.");
|
|
47
61
|
process.exit(1);
|
|
48
62
|
}
|
|
49
|
-
const workerEntry = getWorkerEntryPath(cwd);
|
|
50
|
-
let viteProcess = null;
|
|
51
63
|
console.log("Starting Fling development server...\n");
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
64
|
+
console.log("Backend HMR enabled - changes to src/worker/**/*.ts will");
|
|
65
|
+
console.log("trigger automatic restart.\n");
|
|
66
|
+
let workerProcess = null;
|
|
67
|
+
let viteProcess = null;
|
|
68
|
+
let isShuttingDown = false;
|
|
69
|
+
// Path to the dev-worker.ts script
|
|
70
|
+
// When running from source (via tsx), use .ts extension
|
|
71
|
+
// When running from dist (published package), use .js extension
|
|
72
|
+
const workerScriptTs = join(__dirname, "dev-worker.ts");
|
|
73
|
+
const workerScriptJs = join(__dirname, "dev-worker.js");
|
|
74
|
+
const workerScript = existsSync(workerScriptTs)
|
|
75
|
+
? workerScriptTs
|
|
76
|
+
: workerScriptJs;
|
|
77
|
+
// Function to spawn the backend worker with tsx watch
|
|
78
|
+
function spawnWorker() {
|
|
79
|
+
// Use tsx watch to run the worker script
|
|
80
|
+
// tsx watch automatically monitors all imported files
|
|
81
|
+
// We use the tsx CLI from flingit's node_modules (resolved at module load)
|
|
82
|
+
const worker = spawn(process.execPath, [tsxCliPath, "watch", "--clear-screen=false", workerScript], {
|
|
83
|
+
cwd,
|
|
84
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
85
|
+
env: {
|
|
86
|
+
...process.env,
|
|
87
|
+
PORT: String(port),
|
|
88
|
+
PROJECT_DIR: cwd,
|
|
89
|
+
FORCE_COLOR: "1",
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
// Pipe worker output
|
|
93
|
+
// stdout/stderr are always defined when using stdio: ["inherit", "pipe", "pipe"]
|
|
94
|
+
worker.stdout.on("data", (data) => {
|
|
95
|
+
const lines = data.toString().split("\n").filter(Boolean);
|
|
96
|
+
for (const line of lines) {
|
|
97
|
+
console.log(line);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
worker.stderr.on("data", (data) => {
|
|
101
|
+
const lines = data.toString().split("\n").filter(Boolean);
|
|
102
|
+
for (const line of lines) {
|
|
103
|
+
console.error(line);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
worker.on("error", (error) => {
|
|
107
|
+
console.error("\nError: Could not start backend worker:", error.message);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
});
|
|
110
|
+
worker.on("close", (code) => {
|
|
111
|
+
workerProcess = null;
|
|
112
|
+
if (!isShuttingDown) {
|
|
113
|
+
if (code !== 0 && code !== null) {
|
|
114
|
+
console.error(`\n[worker] Backend server failed with code ${code}`);
|
|
95
115
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// Graceful shutdown handler
|
|
100
|
-
const shutdown = () => {
|
|
101
|
-
console.log("\nShutting down...");
|
|
102
|
-
if (viteProcess && !viteProcess.killed) {
|
|
103
|
-
viteProcess.kill("SIGTERM");
|
|
116
|
+
// Worker died unexpectedly - shut down everything
|
|
117
|
+
console.error("[worker] Backend server stopped. Shutting down...");
|
|
118
|
+
shutdown();
|
|
104
119
|
}
|
|
105
|
-
stopCronJobs();
|
|
106
|
-
closeLogDatabase();
|
|
107
|
-
process.exit(0);
|
|
108
|
-
};
|
|
109
|
-
process.on("SIGINT", shutdown);
|
|
110
|
-
process.on("SIGTERM", shutdown);
|
|
111
|
-
// Start HTTP server
|
|
112
|
-
console.log(`\nAPI server: http://localhost:${port}`);
|
|
113
|
-
serve({
|
|
114
|
-
fetch: app.fetch,
|
|
115
|
-
port,
|
|
116
120
|
});
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
+
return worker;
|
|
122
|
+
}
|
|
123
|
+
// Function to spawn Vite dev server
|
|
124
|
+
function spawnViteDevServer() {
|
|
125
|
+
const vite = spawn("npm", ["exec", "vite"], {
|
|
126
|
+
cwd,
|
|
127
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
128
|
+
env: { ...process.env, FORCE_COLOR: "1" },
|
|
129
|
+
});
|
|
130
|
+
// Prefix Vite output for clarity
|
|
131
|
+
// stdout/stderr are always defined when using stdio: ["ignore", "pipe", "pipe"]
|
|
132
|
+
vite.stdout.on("data", (data) => {
|
|
133
|
+
const lines = data.toString().split("\n").filter(Boolean);
|
|
134
|
+
for (const line of lines) {
|
|
135
|
+
console.log(`[vite] ${line}`);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
vite.stderr.on("data", (data) => {
|
|
139
|
+
const lines = data.toString().split("\n").filter(Boolean);
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
console.error(`[vite] ${line}`);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
vite.on("error", (error) => {
|
|
121
145
|
if (error.code === "ENOENT") {
|
|
122
146
|
console.error("\nError: Could not start Vite dev server.\n");
|
|
123
147
|
console.error("npm is not found in PATH. Ensure Node.js is properly installed.");
|
|
@@ -128,20 +152,51 @@ Examples:
|
|
|
128
152
|
console.error(`\nThe API server is still running at http://localhost:${port}`);
|
|
129
153
|
console.error("To fix Vite, ensure dependencies are installed: npm install");
|
|
130
154
|
});
|
|
131
|
-
|
|
132
|
-
if (code !== 0 && code !== null) {
|
|
155
|
+
vite.on("close", (code) => {
|
|
156
|
+
if (!isShuttingDown && code !== 0 && code !== null) {
|
|
133
157
|
console.error(`\n[vite] Process exited with code ${code}`);
|
|
134
158
|
console.error("[vite] Check if vite is installed: npm install");
|
|
135
159
|
}
|
|
136
160
|
viteProcess = null;
|
|
137
161
|
});
|
|
138
|
-
|
|
139
|
-
console.log(`API proxy: /api/* -> http://localhost:${port}`);
|
|
140
|
-
console.log("\nPress Ctrl+C to stop\n");
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
console.error("Failed to start development server:", error);
|
|
144
|
-
process.exit(1);
|
|
162
|
+
return vite;
|
|
145
163
|
}
|
|
164
|
+
// Reset terminal to normal state (tsx watch may leave it in raw mode)
|
|
165
|
+
const resetTerminal = () => {
|
|
166
|
+
if (process.stdin.isTTY) {
|
|
167
|
+
process.stdin.setRawMode(false);
|
|
168
|
+
}
|
|
169
|
+
// Write terminal reset sequences to restore normal behavior
|
|
170
|
+
process.stdout.write("\x1b[?1000l"); // Disable mouse tracking
|
|
171
|
+
process.stdout.write("\x1b[?25h"); // Show cursor
|
|
172
|
+
};
|
|
173
|
+
// Graceful shutdown handler
|
|
174
|
+
const shutdown = () => {
|
|
175
|
+
if (isShuttingDown)
|
|
176
|
+
return;
|
|
177
|
+
isShuttingDown = true;
|
|
178
|
+
// Reset terminal immediately
|
|
179
|
+
resetTerminal();
|
|
180
|
+
console.log("\nShutting down...");
|
|
181
|
+
if (workerProcess && !workerProcess.killed) {
|
|
182
|
+
workerProcess.kill("SIGTERM");
|
|
183
|
+
}
|
|
184
|
+
if (viteProcess && !viteProcess.killed) {
|
|
185
|
+
viteProcess.kill("SIGTERM");
|
|
186
|
+
}
|
|
187
|
+
// Give processes time to clean up, then force exit
|
|
188
|
+
setTimeout(() => {
|
|
189
|
+
resetTerminal(); // Reset again in case child processes changed it
|
|
190
|
+
process.exit(0);
|
|
191
|
+
}, 2000);
|
|
192
|
+
};
|
|
193
|
+
process.on("SIGINT", shutdown);
|
|
194
|
+
process.on("SIGTERM", shutdown);
|
|
195
|
+
// Start both processes
|
|
196
|
+
workerProcess = spawnWorker();
|
|
197
|
+
viteProcess = spawnViteDevServer();
|
|
198
|
+
console.log(`\nFrontend: http://localhost:5173`);
|
|
199
|
+
console.log(`API proxy: /api/* -> http://localhost:${port}`);
|
|
200
|
+
console.log("\nPress Ctrl+C to stop\n");
|
|
146
201
|
});
|
|
147
202
|
//# sourceMappingURL=dev.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* fling onboard - Interactive onboarding for first-time users
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
+
import type { OnboardingIO } from "../utils/onboarding-io.js";
|
|
5
6
|
/**
|
|
6
7
|
* Result from the onboarding flow.
|
|
7
8
|
*/
|
|
@@ -9,9 +10,18 @@ export interface OnboardingResult {
|
|
|
9
10
|
authenticated: boolean;
|
|
10
11
|
setupProject: boolean;
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Options for running onboarding (mostly for testing).
|
|
15
|
+
*/
|
|
16
|
+
export interface OnboardingOptions {
|
|
17
|
+
apiUrl?: string;
|
|
18
|
+
configDir?: string;
|
|
19
|
+
flingHome?: string;
|
|
20
|
+
}
|
|
12
21
|
export type CredentialResult = "authenticated" | "skipped" | "failed" | "cancelled";
|
|
13
22
|
/**
|
|
14
23
|
* Prompt the user to authenticate.
|
|
24
|
+
* This is the public API that creates its own context using defaults.
|
|
15
25
|
*/
|
|
16
26
|
export declare function promptCredentials(options?: {
|
|
17
27
|
message?: string;
|
|
@@ -22,8 +32,6 @@ export declare function promptCredentials(options?: {
|
|
|
22
32
|
* This can be called programmatically (from launch.ts) or via the command.
|
|
23
33
|
* Returns whether the user authenticated and whether to set up the default project.
|
|
24
34
|
*/
|
|
25
|
-
export declare function runOnboarding(options?:
|
|
26
|
-
apiUrl?: string;
|
|
27
|
-
}): Promise<OnboardingResult>;
|
|
35
|
+
export declare function runOnboarding(io?: OnboardingIO, options?: OnboardingOptions): Promise<OnboardingResult>;
|
|
28
36
|
export declare const onboardCommand: Command;
|
|
29
37
|
//# sourceMappingURL=onboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK9D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgOD,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,SAAS,GACT,QAAQ,GACR,WAAW,CAAC;AAuEhB;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAG5B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,EAAE,GAAE,YAAkC,EACtC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAiF3B;AAED,eAAO,MAAM,cAAc,SA0BvB,CAAC"}
|