@mdulghier/devtree 0.1.5

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 ADDED
@@ -0,0 +1,152 @@
1
+ # Devtree
2
+
3
+ Run the same Vite+ app in multiple git worktrees without local-dev collisions.
4
+
5
+ Devtree gives each worktree its own public URL, managed env block, scoped dependency names, setup hooks, and garbage collection for orphaned local resources.
6
+
7
+ ## Use
8
+
9
+ ### 1. Install
10
+
11
+ Devtree assumes your app already uses `vite-plus`. It is a required peer dependency, but this README does not install it for you.
12
+
13
+ Install Devtree itself:
14
+
15
+ ```bash
16
+ vp add -D devtree
17
+ ```
18
+
19
+ Dependencies you may also need:
20
+
21
+ - `vite-plus` - required. Your app should already have it installed and be using it.
22
+ - `portless` - required unless you disable it with `portless.enabled: false` or `PORTLESS=0`. The `portless` command must be available on `PATH`.
23
+ - `tailscale` - optional, only needed when `tailscale.enabled` is `true`.
24
+ - `varlock` and `@varlock/vite-integration` - required only when `env.provider` is set to `"varlock"`.
25
+
26
+ Install `portless` in the repo so `vp devtree ...` can find it:
27
+
28
+ ```bash
29
+ vp add -D portless
30
+ ```
31
+
32
+ If you want `portless` available outside pnpm-managed scripts too, install it globally:
33
+
34
+ ```bash
35
+ vp add -g portless
36
+ ```
37
+
38
+ If you use `varlock`, install both pieces together:
39
+
40
+ ```bash
41
+ vp add -D varlock @varlock/vite-integration
42
+ ```
43
+
44
+ That gives you the `varlock` CLI plus the Vite integration Devtree expects.
45
+
46
+ ### What These Tools Do
47
+
48
+ - [`portless`](https://github.com/vercel-labs/portless) gives each local app a stable named URL instead of a random port. Devtree uses it to give every worktree its own predictable public URL and to run the dev server behind that URL.
49
+ - [`varlock`](https://github.com/dmno-dev/varlock) is an env/schema tool for loading, validating, and injecting environment variables. Devtree uses it when `env.provider` is set to `"varlock"` so hooks and dev commands run with resolved, validated env values.
50
+
51
+ ### 2. Add `devtree.config.ts`
52
+
53
+ ```ts
54
+ import { define_devtree_config } from "devtree";
55
+
56
+ export default define_devtree_config({
57
+ app_name: "my-app",
58
+ tailscale: {
59
+ enabled: true,
60
+ },
61
+ env: {
62
+ provider: "dotenv",
63
+ entries: ({ instance }) => [
64
+ {
65
+ kind: "value",
66
+ key: "APP_URL",
67
+ value: instance.public_url,
68
+ },
69
+ {
70
+ kind: "value",
71
+ key: "DATABASE_PORT",
72
+ value: String(instance.allocate_port("postgres", 5400)),
73
+ },
74
+ ],
75
+ },
76
+ });
77
+ ```
78
+
79
+ By default Devtree manages a block inside `.env.local`. Set `env.file_path` if you want a different file.
80
+
81
+ If you enable `tailscale`, Devtree checks for the `tailscale` CLI, reads the machine's MagicDNS hostname, starts Vite on `0.0.0.0`, and adds that hostname to Vite's allowed hosts so the dev server can be reached over Tailscale.
82
+
83
+ ### 3. Register the Vite plugin
84
+
85
+ ```ts
86
+ import { defineConfig } from "vite-plus";
87
+ import { devtree_vite_plugins } from "devtree/vite";
88
+
89
+ import devtree_config from "./devtree.config.ts";
90
+
91
+ export default defineConfig({
92
+ plugins: [...(await devtree_vite_plugins(devtree_config))],
93
+ });
94
+ ```
95
+
96
+ ### 4. Add a script
97
+
98
+ ```json
99
+ {
100
+ "scripts": {
101
+ "devtree": "devtree"
102
+ }
103
+ }
104
+ ```
105
+
106
+ ### 5. Run it
107
+
108
+ Run these from the repo root, or any subdirectory inside a repo that has `devtree.config.ts`.
109
+
110
+ ```bash
111
+ pnpm devtree doctor --fix
112
+ pnpm devtree setup
113
+ pnpm devtree dev
114
+ pnpm devtree info
115
+ pnpm devtree gc --dry-run
116
+ ```
117
+
118
+ - `doctor --fix` checks prerequisites, bootstraps `portless`, and validates Tailscale when `tailscale.enabled` is on
119
+ - `setup` writes env overrides, starts dependencies, runs hooks, and reports the detected Tailscale host
120
+ - `dev` starts the app through Devtree
121
+ - `info` prints the current instance URL and names
122
+ - `gc` removes orphaned dependency resources from deleted worktrees
123
+
124
+ Other commands:
125
+
126
+ - `devtree deps start|stop|logs`
127
+ - `devtree config tailscale.enabled true`
128
+ - `devtree env write|show`
129
+
130
+ `devtree config <key.path>` prints the current value from `devtree.config.ts`.
131
+
132
+ `devtree config <key.path> <value>` writes the new value back into `devtree.config.ts`.
133
+
134
+ Examples:
135
+
136
+ ```bash
137
+ pnpm devtree config tailscale.enabled true
138
+ pnpm devtree config portless.https "inherit"
139
+ pnpm devtree config namespace personal-dev
140
+ pnpm devtree config tailscale.enabled
141
+ ```
142
+
143
+ Add `dependencies` and `hooks` in `devtree.config.ts` when you want Compose services, custom setup steps, migrations, or pre-dev commands.
144
+
145
+ ### Tailscale Notes
146
+
147
+ - Turn it on with `tailscale: { enabled: true }` in `devtree.config.ts`.
148
+ - Install the `tailscale` CLI and make sure you're logged in on the machine running `devtree dev`.
149
+ - `devtree doctor` fails when Tailscale is enabled but the CLI or MagicDNS hostname is unavailable.
150
+ - `devtree setup`, `devtree dev`, and `devtree info` surface the detected Tailscale host so you can verify the integration quickly.
151
+
152
+ If you use an AI agent, run `npx @tanstack/intent@latest install`.
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { existsSync } from "node:fs";
5
+ import { dirname, resolve } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+
8
+ const bin_dir = dirname(fileURLToPath(import.meta.url));
9
+ const package_dir = dirname(bin_dir);
10
+ const dist_cli_path = resolve(package_dir, "dist", "cli.js");
11
+ const src_cli_path = resolve(package_dir, "src", "cli.ts");
12
+ const args = existsSync(dist_cli_path)
13
+ ? [dist_cli_path, ...process.argv.slice(2)]
14
+ : ["--import", "tsx", src_cli_path, ...process.argv.slice(2)];
15
+ const result = spawnSync(process.execPath, args, { env: process.env, stdio: "inherit" });
16
+
17
+ if (result.error) {
18
+ throw result.error;
19
+ }
20
+
21
+ process.exit(result.status ?? 1);
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,425 @@
1
+ import { existsSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { resolve } from "node:path";
4
+ import { load_devtree_config } from "./config.js";
5
+ import { format_config_value, get_config_value, set_config_value } from "./config-command.js";
6
+ import { build_development_command } from "./command-builder.js";
7
+ import { ensure_env_file, get_env_file_status_message } from "./env-file.js";
8
+ import { run_gc } from "./gc.js";
9
+ import { create_devtree_instance } from "./instance.js";
10
+ import { command_exists, run_command_capture, run_command_inherit, } from "./process.js";
11
+ import { register_compose_project } from "./registry.js";
12
+ import { resolve_tailscale } from "./tailscale.js";
13
+ function print_help() {
14
+ console.log("Usage: devtree <command>");
15
+ console.log("");
16
+ console.log("Commands:");
17
+ console.log(" doctor [--fix] Check local prerequisites, portless, and tailscale");
18
+ console.log(" config <key> [value] Read or write a config value in devtree.config.ts");
19
+ console.log(" info Print the current instance URLs and resource names");
20
+ console.log(" setup Write env overrides, start dependencies, run hooks");
21
+ console.log(" dev [-- <vite args>] Start the app through devtree and portless");
22
+ console.log(" deps start|stop|logs Manage configured dependencies");
23
+ console.log(" gc [--dry-run] [-v] Remove orphaned dependency resources");
24
+ console.log(" env write|show Compatibility aliases for env sync and info");
25
+ }
26
+ function get_command_name(argv) {
27
+ return argv[0] ?? "help";
28
+ }
29
+ function get_portless_start_args(loaded_config) {
30
+ const args = ["proxy", "start"];
31
+ const https_preference = loaded_config.config.portless?.https ?? "inherit";
32
+ if (https_preference === true ||
33
+ (https_preference === "inherit" && process.env.PORTLESS_HTTPS === "1")) {
34
+ args.push("--https");
35
+ }
36
+ return args;
37
+ }
38
+ function create_runtime_env(instance, effective_env_values, tailscale, env_overrides) {
39
+ return {
40
+ ...effective_env_values,
41
+ ...env_overrides,
42
+ DEVTREE_ACTIVE: "1",
43
+ DEVTREE_APP_NAME: instance.app_name,
44
+ DEVTREE_INSTANCE_ID: instance.instance_id,
45
+ DEVTREE_NAMESPACE: instance.registry_namespace,
46
+ DEVTREE_PUBLIC_URL: instance.public_url,
47
+ DEVTREE_TAILSCALE_ENABLED: tailscale.enabled ? "1" : "0",
48
+ DEVTREE_TAILSCALE_HOST: tailscale.host ?? undefined,
49
+ DEVTREE_WORKTREE_PATH: instance.worktree_path,
50
+ DEVTREE_LABEL_PREFIX: instance.label_prefix,
51
+ };
52
+ }
53
+ function resolve_command_env(command_spec, context, env_overrides) {
54
+ const command_env = typeof command_spec.env === "function" ? command_spec.env(context) : command_spec.env;
55
+ return {
56
+ ...context.effective_env_values,
57
+ ...command_env,
58
+ ...env_overrides,
59
+ };
60
+ }
61
+ function with_varlock(command_parts) {
62
+ return ["varlock", "run", "--", ...command_parts];
63
+ }
64
+ function run_process(command_parts, runtime_state, options) {
65
+ const should_use_varlock = options?.use_varlock !== false && runtime_state.loaded_config.config.env.provider === "varlock";
66
+ const wrapped_command = should_use_varlock ? with_varlock(command_parts) : command_parts;
67
+ const [command, ...args] = wrapped_command;
68
+ return run_command_inherit(command, args, {
69
+ cwd: options?.cwd,
70
+ allow_failure: options?.allow_failure,
71
+ env: create_runtime_env(runtime_state.instance, runtime_state.effective_env_values, runtime_state.tailscale, options?.env),
72
+ });
73
+ }
74
+ function get_runtime_state(loaded_config) {
75
+ const instance = create_devtree_instance(loaded_config);
76
+ const env_result = ensure_env_file(loaded_config, instance);
77
+ const tailscale = resolve_tailscale(loaded_config.config);
78
+ return {
79
+ loaded_config,
80
+ instance,
81
+ env_status_message: get_env_file_status_message(env_result),
82
+ managed_env_values: env_result.managed_env_values,
83
+ effective_env_values: env_result.effective_env_values,
84
+ tailscale,
85
+ };
86
+ }
87
+ function print_tailscale_status(tailscale) {
88
+ if (!tailscale.enabled) {
89
+ return;
90
+ }
91
+ if (tailscale.host) {
92
+ console.log(`[devtree] Tailscale host ${tailscale.host}`);
93
+ return;
94
+ }
95
+ console.warn(`[devtree] ${tailscale.error ?? "Tailscale is enabled, but no host was detected"}. Vite will stay localhost-only.`);
96
+ }
97
+ function get_command_context(runtime_state) {
98
+ return {
99
+ config: runtime_state.loaded_config.config,
100
+ instance: runtime_state.instance,
101
+ repo_root: runtime_state.loaded_config.repo_root,
102
+ managed_env_values: runtime_state.managed_env_values,
103
+ effective_env_values: runtime_state.effective_env_values,
104
+ };
105
+ }
106
+ function get_compose_dependencies(loaded_config) {
107
+ return (loaded_config.config.dependencies ?? []).filter((dependency) => dependency.kind === "compose");
108
+ }
109
+ function resolve_compose_project_name(dependency, context) {
110
+ if (!dependency.project_name) {
111
+ return context.instance.get_scoped_name(dependency.name);
112
+ }
113
+ return typeof dependency.project_name === "function"
114
+ ? dependency.project_name(context)
115
+ : dependency.project_name;
116
+ }
117
+ function resolve_compose_env(dependency, context) {
118
+ const compose_env = typeof dependency.env === "function" ? dependency.env(context) : dependency.env;
119
+ const compose_project = resolve_compose_project_name(dependency, context);
120
+ return {
121
+ ...context.effective_env_values,
122
+ ...compose_env,
123
+ DOCKER_COMPOSE_PROJECT: compose_project,
124
+ WORKTREE_PATH: context.instance.worktree_path,
125
+ DEVTREE_NAMESPACE: context.instance.registry_namespace,
126
+ DEVTREE_LABEL_PREFIX: context.instance.label_prefix,
127
+ };
128
+ }
129
+ function run_compose_dependency(runtime_state, dependency, subcommand) {
130
+ const context = get_command_context(runtime_state);
131
+ const compose_file_path = resolve(runtime_state.loaded_config.repo_root, dependency.file_path || "docker-compose.yml");
132
+ const compose_project = resolve_compose_project_name(dependency, context);
133
+ const compose_env = resolve_compose_env(dependency, context);
134
+ const compose_args = ["compose", "-f", compose_file_path, "--project-name", compose_project];
135
+ register_compose_project({
136
+ registry_namespace: runtime_state.instance.registry_namespace,
137
+ compose_project,
138
+ worktree_path: runtime_state.instance.worktree_path,
139
+ dependency_name: dependency.name,
140
+ });
141
+ if (subcommand === "start") {
142
+ run_process([
143
+ "docker",
144
+ ...compose_args,
145
+ "up",
146
+ "-d",
147
+ "--wait",
148
+ ...(dependency.services?.length ? dependency.services : []),
149
+ ], runtime_state, {
150
+ use_varlock: false,
151
+ env: compose_env,
152
+ });
153
+ return;
154
+ }
155
+ if (subcommand === "stop") {
156
+ run_process(["docker", ...compose_args, "down"], runtime_state, {
157
+ use_varlock: false,
158
+ env: compose_env,
159
+ });
160
+ return;
161
+ }
162
+ run_process([
163
+ "docker",
164
+ ...compose_args,
165
+ "logs",
166
+ "-f",
167
+ ...(dependency.services?.length ? dependency.services : []),
168
+ ], runtime_state, {
169
+ use_varlock: false,
170
+ env: compose_env,
171
+ });
172
+ }
173
+ function run_command_spec(runtime_state, command_spec) {
174
+ const context = get_command_context(runtime_state);
175
+ const command_env = resolve_command_env(command_spec, context);
176
+ run_process(command_spec.command, runtime_state, {
177
+ cwd: command_spec.cwd
178
+ ? resolve(runtime_state.loaded_config.repo_root, command_spec.cwd)
179
+ : undefined,
180
+ env: command_env,
181
+ });
182
+ }
183
+ function run_hook(runtime_state, hook_name) {
184
+ for (const command_spec of runtime_state.loaded_config.config.hooks?.[hook_name] ?? []) {
185
+ run_command_spec(runtime_state, command_spec);
186
+ }
187
+ }
188
+ function ensure_portless_ready(loaded_config, should_fix = true) {
189
+ if (loaded_config.config.portless?.enabled === false || process.env.PORTLESS === "0") {
190
+ return;
191
+ }
192
+ if (!command_exists("portless")) {
193
+ throw new Error("Devtree requires `portless`, but it was not found on PATH. Install it or run with PORTLESS=0.");
194
+ }
195
+ if (loaded_config.config.portless?.bootstrap === "manual") {
196
+ return;
197
+ }
198
+ if (!should_fix) {
199
+ const list_result = run_command_capture("portless", ["list"], { allow_failure: true });
200
+ if (list_result.status !== 0) {
201
+ throw new Error("Portless is installed, but the proxy is not reachable. Run `vp run devtree doctor --fix`.");
202
+ }
203
+ return;
204
+ }
205
+ run_command_capture("portless", get_portless_start_args(loaded_config), { allow_failure: true });
206
+ }
207
+ function resolve_require_from_root(repo_root) {
208
+ return createRequire(resolve(repo_root, "package.json"));
209
+ }
210
+ function run_doctor(loaded_config, fix = false) {
211
+ const issues = [];
212
+ const compose_dependencies = get_compose_dependencies(loaded_config);
213
+ const tailscale = resolve_tailscale(loaded_config.config);
214
+ console.log(`[pass] config ${loaded_config.config_path}`);
215
+ if (command_exists("git")) {
216
+ console.log("[pass] git available");
217
+ }
218
+ else {
219
+ issues.push("git is not available on PATH");
220
+ }
221
+ if (loaded_config.config.portless?.enabled === false || process.env.PORTLESS === "0") {
222
+ console.log("[skip] portless disabled");
223
+ }
224
+ else if (!command_exists("portless")) {
225
+ issues.push("portless is not available on PATH");
226
+ }
227
+ else {
228
+ try {
229
+ ensure_portless_ready(loaded_config, fix);
230
+ console.log(fix ? "[pass] portless ready (bootstrapped)" : "[pass] portless reachable");
231
+ }
232
+ catch (error) {
233
+ issues.push(error instanceof Error ? error.message : String(error));
234
+ }
235
+ }
236
+ if (!tailscale.enabled) {
237
+ console.log("[skip] tailscale disabled");
238
+ }
239
+ else if (tailscale.host) {
240
+ console.log(`[pass] tailscale host ${tailscale.host}`);
241
+ }
242
+ else {
243
+ issues.push(tailscale.error ?? "tailscale is enabled, but no host was detected");
244
+ }
245
+ if (compose_dependencies.length > 0) {
246
+ const docker_result = run_command_capture("docker", ["info"], { allow_failure: true });
247
+ if (docker_result.status === 0) {
248
+ console.log("[pass] docker available");
249
+ }
250
+ else {
251
+ issues.push("docker is not available or Docker Desktop is not running");
252
+ }
253
+ }
254
+ if (loaded_config.config.env.provider === "varlock") {
255
+ if (command_exists("varlock")) {
256
+ console.log("[pass] varlock CLI available");
257
+ }
258
+ else {
259
+ issues.push("varlock is enabled, but the `varlock` command is not available");
260
+ }
261
+ const require_from_root = resolve_require_from_root(loaded_config.repo_root);
262
+ try {
263
+ require_from_root.resolve("@varlock/vite-integration");
264
+ console.log("[pass] @varlock/vite-integration installed");
265
+ }
266
+ catch {
267
+ issues.push("varlock is enabled, but @varlock/vite-integration is not installed");
268
+ }
269
+ const schema_path = resolve(loaded_config.repo_root, loaded_config.config.env.schema_path || ".env.schema");
270
+ if (existsSync(schema_path)) {
271
+ console.log(`[pass] varlock schema ${schema_path}`);
272
+ }
273
+ else {
274
+ issues.push(`varlock schema file is missing: ${schema_path}`);
275
+ }
276
+ }
277
+ if (issues.length === 0) {
278
+ console.log("");
279
+ console.log("Doctor looks clean.");
280
+ return;
281
+ }
282
+ console.log("");
283
+ for (const issue of issues) {
284
+ console.log(`[fail] ${issue}`);
285
+ }
286
+ process.exit(1);
287
+ }
288
+ function print_info(runtime_state) {
289
+ console.log(`Public URL: ${runtime_state.instance.public_url}`);
290
+ console.log(`App name: ${runtime_state.instance.app_name}`);
291
+ console.log(`Instance ID: ${runtime_state.instance.instance_id}`);
292
+ console.log(`Scoped name: ${runtime_state.instance.scoped_name}`);
293
+ console.log(`Worktree path: ${runtime_state.instance.worktree_path}`);
294
+ console.log(`Env provider: ${runtime_state.loaded_config.config.env.provider}`);
295
+ console.log(`Env file: ${runtime_state.instance.env_file_path}`);
296
+ if (runtime_state.tailscale.enabled) {
297
+ console.log(`Tailscale host: ${runtime_state.tailscale.host ?? "unavailable"}`);
298
+ }
299
+ for (const dependency of get_compose_dependencies(runtime_state.loaded_config)) {
300
+ const compose_project = resolve_compose_project_name(dependency, get_command_context(runtime_state));
301
+ console.log(`Compose project (${dependency.name}): ${compose_project}`);
302
+ }
303
+ }
304
+ async function main() {
305
+ const argv = process.argv.slice(2);
306
+ const command_name = get_command_name(argv);
307
+ if (command_name === "help") {
308
+ print_help();
309
+ return;
310
+ }
311
+ const loaded_config = await load_devtree_config();
312
+ if (command_name === "doctor") {
313
+ run_doctor(loaded_config, argv.includes("--fix"));
314
+ return;
315
+ }
316
+ if (command_name === "config") {
317
+ const config_key = argv[1];
318
+ if (!config_key) {
319
+ throw new Error("Usage: devtree config <key.path> [value]");
320
+ }
321
+ if (argv.length === 2) {
322
+ console.log(format_config_value(get_config_value(loaded_config.config, config_key)));
323
+ return;
324
+ }
325
+ set_config_value(loaded_config.config_path, config_key, argv.slice(2).join(" "));
326
+ const updated_config = await load_devtree_config();
327
+ console.log(`${config_key} = ${format_config_value(get_config_value(updated_config.config, config_key))}`);
328
+ return;
329
+ }
330
+ const runtime_state = get_runtime_state(loaded_config);
331
+ if (command_name === "info") {
332
+ console.log(runtime_state.env_status_message);
333
+ print_info(runtime_state);
334
+ return;
335
+ }
336
+ if (command_name === "env") {
337
+ const env_subcommand = argv[1];
338
+ if (env_subcommand === "write") {
339
+ console.log(runtime_state.env_status_message);
340
+ return;
341
+ }
342
+ if (env_subcommand === "show") {
343
+ print_info(runtime_state);
344
+ return;
345
+ }
346
+ throw new Error("Usage: vp run devtree env <write|show>");
347
+ }
348
+ if (command_name === "gc") {
349
+ run_gc(loaded_config, runtime_state.instance, {
350
+ dry_run: argv.includes("--dry-run"),
351
+ verbose: argv.includes("--verbose") || argv.includes("-v"),
352
+ });
353
+ return;
354
+ }
355
+ console.log(runtime_state.env_status_message);
356
+ if (command_name === "setup") {
357
+ ensure_portless_ready(loaded_config);
358
+ print_tailscale_status(runtime_state.tailscale);
359
+ for (const dependency of loaded_config.config.dependencies ?? []) {
360
+ if (dependency.kind === "compose") {
361
+ run_compose_dependency(runtime_state, dependency, "start");
362
+ }
363
+ else {
364
+ run_command_spec(runtime_state, dependency.start);
365
+ }
366
+ }
367
+ run_hook(runtime_state, "setup");
368
+ run_hook(runtime_state, "migrate");
369
+ run_hook(runtime_state, "post_setup");
370
+ console.log(`Open ${runtime_state.instance.public_url} after starting the app.`);
371
+ if (runtime_state.tailscale.host) {
372
+ console.log(`Tailscale hostname available to Vite: ${runtime_state.tailscale.host}`);
373
+ }
374
+ console.log("Run `vp run devtree dev` to launch the worktree-scoped dev server.");
375
+ return;
376
+ }
377
+ if (command_name === "deps") {
378
+ const deps_subcommand = argv[1];
379
+ if (deps_subcommand !== "start" && deps_subcommand !== "stop" && deps_subcommand !== "logs") {
380
+ throw new Error("Usage: vp run devtree deps <start|stop|logs>");
381
+ }
382
+ for (const dependency of loaded_config.config.dependencies ?? []) {
383
+ if (dependency.kind === "compose") {
384
+ run_compose_dependency(runtime_state, dependency, deps_subcommand);
385
+ continue;
386
+ }
387
+ const command_spec = deps_subcommand === "start"
388
+ ? dependency.start
389
+ : deps_subcommand === "stop"
390
+ ? dependency.stop
391
+ : dependency.logs;
392
+ if (command_spec) {
393
+ run_command_spec(runtime_state, command_spec);
394
+ }
395
+ }
396
+ return;
397
+ }
398
+ if (command_name === "dev") {
399
+ const extra_args = argv.slice(1);
400
+ if (!runtime_state.instance.portless_enabled && !process.env.BETTER_AUTH_URL) {
401
+ console.warn("PORTLESS=0 disables the injected public URL. Set BETTER_AUTH_URL before signing in.");
402
+ }
403
+ ensure_portless_ready(loaded_config);
404
+ print_tailscale_status(runtime_state.tailscale);
405
+ run_hook(runtime_state, "pre_dev");
406
+ const development_command = build_development_command({
407
+ app_name: runtime_state.instance.app_name,
408
+ extra_args,
409
+ portless_enabled: runtime_state.instance.portless_enabled,
410
+ vite_host: runtime_state.tailscale.host ? "0.0.0.0" : undefined,
411
+ use_varlock: loaded_config.config.env.provider === "varlock",
412
+ });
413
+ const [command, ...args] = development_command;
414
+ run_command_inherit(command, args, {
415
+ env: create_runtime_env(runtime_state.instance, runtime_state.effective_env_values, runtime_state.tailscale),
416
+ });
417
+ return;
418
+ }
419
+ throw new Error("Unknown command.");
420
+ }
421
+ main().catch((error) => {
422
+ console.error(error instanceof Error ? error.message : String(error));
423
+ process.exit(1);
424
+ });
425
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function strip_passthrough_delimiter(args: string[]): string[];
2
+ export declare function build_vite_dev_command(extra_args: string[], host?: string): string[];
3
+ export declare function build_portless_command(app_name: string, command_parts: string[]): string[];
4
+ export declare function build_varlock_command(command_parts: string[]): string[];
5
+ export declare function build_development_command(options: {
6
+ app_name: string;
7
+ extra_args: string[];
8
+ portless_enabled: boolean;
9
+ vite_host?: string;
10
+ use_varlock: boolean;
11
+ }): string[];
@@ -0,0 +1,23 @@
1
+ export function strip_passthrough_delimiter(args) {
2
+ return args[0] === "--" ? args.slice(1) : args;
3
+ }
4
+ export function build_vite_dev_command(extra_args, host = "127.0.0.1") {
5
+ return ["vp", "dev", "--host", host, "--clearScreen", "false", ...extra_args];
6
+ }
7
+ export function build_portless_command(app_name, command_parts) {
8
+ return ["portless", "run", "--force", "--name", app_name, "--", ...command_parts];
9
+ }
10
+ export function build_varlock_command(command_parts) {
11
+ return ["varlock", "run", "--", ...command_parts];
12
+ }
13
+ export function build_development_command(options) {
14
+ let command_parts = build_vite_dev_command(strip_passthrough_delimiter(options.extra_args), options.vite_host);
15
+ if (options.portless_enabled) {
16
+ command_parts = build_portless_command(options.app_name, command_parts);
17
+ }
18
+ if (options.use_varlock) {
19
+ command_parts = build_varlock_command(command_parts);
20
+ }
21
+ return command_parts;
22
+ }
23
+ //# sourceMappingURL=command-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-builder.js","sourceRoot":"","sources":["../src/command-builder.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B,CAAC,IAAc;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAoB,EAAE,IAAI,GAAG,WAAW;IAC7E,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,aAAuB;IAC9E,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAuB;IAC3D,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAMzC;IACC,IAAI,aAAa,GAAG,sBAAsB,CACxC,2BAA2B,CAAC,OAAO,CAAC,UAAU,CAAC,EAC/C,OAAO,CAAC,SAAS,CAClB,CAAC;IAEF,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,aAAa,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}