episoda 0.2.23 → 0.2.24

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.
@@ -2696,7 +2696,7 @@ var require_package = __commonJS({
2696
2696
  "package.json"(exports2, module2) {
2697
2697
  module2.exports = {
2698
2698
  name: "episoda",
2699
- version: "0.2.22",
2699
+ version: "0.2.23",
2700
2700
  description: "CLI tool for Episoda local development workflow orchestration",
2701
2701
  main: "dist/index.js",
2702
2702
  types: "dist/index.d.ts",
@@ -6174,6 +6174,28 @@ async function fetchWithAuth(url, options = {}, retryOnUnauthorized = true) {
6174
6174
  }
6175
6175
  return response;
6176
6176
  }
6177
+ async function fetchEnvVars() {
6178
+ try {
6179
+ const config = await (0, import_core10.loadConfig)();
6180
+ if (!config?.project_id) {
6181
+ console.warn("[Daemon] EP973: No project_id in config, cannot fetch env vars");
6182
+ return {};
6183
+ }
6184
+ const apiUrl = config.api_url || "https://episoda.dev";
6185
+ const response = await fetchWithAuth(`${apiUrl}/api/cli/env-vars`);
6186
+ if (!response.ok) {
6187
+ console.warn(`[Daemon] EP973: Failed to fetch env vars: ${response.status}`);
6188
+ return {};
6189
+ }
6190
+ const data = await response.json();
6191
+ const envVars = data.env_vars || {};
6192
+ console.log(`[Daemon] EP973: Fetched ${Object.keys(envVars).length} env vars from server`);
6193
+ return envVars;
6194
+ } catch (error) {
6195
+ console.warn("[Daemon] EP973: Error fetching env vars:", error instanceof Error ? error.message : error);
6196
+ return {};
6197
+ }
6198
+ }
6177
6199
  var Daemon = class _Daemon {
6178
6200
  // 60 seconds
6179
6201
  constructor() {
@@ -6688,7 +6710,27 @@ var Daemon = class _Daemon {
6688
6710
  const tunnelManager = getTunnelManager();
6689
6711
  let result;
6690
6712
  if (cmd.action === "start") {
6691
- const port = cmd.port || detectDevPort(projectPath);
6713
+ const worktree = await getWorktreeInfoForModule(cmd.moduleUid);
6714
+ if (!worktree) {
6715
+ console.error(`[Daemon] EP973: Cannot resolve worktree path for ${cmd.moduleUid}`);
6716
+ await client.send({
6717
+ type: "tunnel_result",
6718
+ commandId: message.id,
6719
+ result: { success: false, error: "Cannot resolve worktree path - missing config slugs" }
6720
+ });
6721
+ return;
6722
+ }
6723
+ if (!worktree.exists) {
6724
+ console.error(`[Daemon] EP973: Worktree not found at ${worktree.path}`);
6725
+ await client.send({
6726
+ type: "tunnel_result",
6727
+ commandId: message.id,
6728
+ result: { success: false, error: `Worktree not found at ${worktree.path}` }
6729
+ });
6730
+ return;
6731
+ }
6732
+ console.log(`[Daemon] EP973: Using worktree path ${worktree.path} for ${cmd.moduleUid}`);
6733
+ const port = cmd.port || detectDevPort(worktree.path);
6692
6734
  const previewUrl = `https://${cmd.moduleUid.toLowerCase()}-${cmd.projectUid.toLowerCase()}.episoda.site`;
6693
6735
  const reportTunnelStatus = async (data) => {
6694
6736
  const config2 = await (0, import_core10.loadConfig)();
@@ -6723,8 +6765,10 @@ var Daemon = class _Daemon {
6723
6765
  });
6724
6766
  try {
6725
6767
  await tunnelManager.initialize();
6726
- console.log(`[Daemon] Ensuring dev server is running on port ${port}...`);
6727
- const devServerResult = await ensureDevServer(projectPath, port, cmd.moduleUid);
6768
+ const devConfig = await (0, import_core10.loadConfig)();
6769
+ const devServerScript = devConfig?.project_settings?.worktree_dev_server_script;
6770
+ console.log(`[Daemon] EP973: Ensuring dev server is running in ${worktree.path} on port ${port}...`);
6771
+ const devServerResult = await ensureDevServer(worktree.path, port, cmd.moduleUid, devServerScript);
6728
6772
  if (!devServerResult.success) {
6729
6773
  const errorMsg2 = `Dev server failed to start: ${devServerResult.error}`;
6730
6774
  console.error(`[Daemon] ${errorMsg2}`);
@@ -7055,17 +7099,18 @@ var Daemon = class _Daemon {
7055
7099
  }
7056
7100
  const worktreeConfig = await (0, import_core10.loadConfig)();
7057
7101
  const setupConfig = worktreeConfig?.project_settings;
7058
- const hasEnvVars = setupConfig?.worktree_env_vars && Object.keys(setupConfig.worktree_env_vars).length > 0;
7102
+ const envVars = await fetchEnvVars();
7103
+ const hasEnvVars = Object.keys(envVars).length > 0;
7059
7104
  if (setupConfig?.worktree_copy_files?.length || setupConfig?.worktree_setup_script || hasEnvVars) {
7060
7105
  console.log(`[Daemon] EP959: Starting async worktree setup for ${moduleUid}`);
7061
7106
  await worktreeManager.updateWorktreeStatus(moduleUid, "pending");
7062
7107
  this.runWorktreeSetupAsync(
7063
7108
  moduleUid,
7064
7109
  worktreeManager,
7065
- setupConfig.worktree_copy_files || [],
7066
- setupConfig.worktree_setup_script,
7110
+ setupConfig?.worktree_copy_files || [],
7111
+ setupConfig?.worktree_setup_script,
7067
7112
  worktree.path,
7068
- setupConfig.worktree_env_vars || {}
7113
+ envVars
7069
7114
  ).then(() => {
7070
7115
  console.log(`[Daemon] EP959: Setup complete for ${moduleUid}, starting tunnel`);
7071
7116
  this.startTunnelForModule(moduleUid, worktree.path);
@@ -7359,22 +7404,31 @@ var Daemon = class _Daemon {
7359
7404
  const data = await response.json();
7360
7405
  const serverSettings = data.settings;
7361
7406
  if (serverSettings) {
7362
- const envVars = serverSettings.worktree_env_vars || {};
7407
+ const projectSlug = data.project_slug || config.project_slug;
7408
+ const workspaceSlug = data.workspace_slug || config.workspace_slug;
7409
+ if (data.project_slug && !config.project_slug) {
7410
+ console.log(`[Daemon] EP973: Synced project_slug: ${data.project_slug}`);
7411
+ }
7412
+ if (data.workspace_slug && !config.workspace_slug) {
7413
+ console.log(`[Daemon] EP973: Synced workspace_slug: ${data.workspace_slug}`);
7414
+ }
7363
7415
  const updatedConfig = {
7364
7416
  ...config,
7417
+ // EP973: Include synced slugs
7418
+ project_slug: projectSlug,
7419
+ workspace_slug: workspaceSlug,
7365
7420
  project_settings: {
7366
7421
  ...config.project_settings,
7367
7422
  worktree_setup_script: serverSettings.worktree_setup_script,
7368
7423
  worktree_cleanup_script: serverSettings.worktree_cleanup_script,
7369
7424
  worktree_dev_server_script: serverSettings.worktree_dev_server_script,
7370
- worktree_env_vars: envVars,
7371
7425
  // Keep deprecated field for backward compatibility
7372
7426
  worktree_copy_files: serverSettings.worktree_copy_files,
7373
7427
  cached_at: Date.now()
7374
7428
  }
7375
7429
  };
7376
7430
  await (0, import_core10.saveConfig)(updatedConfig);
7377
- console.log(`[Daemon] EP964: Project settings synced (env_vars: ${Object.keys(envVars).length} keys)`);
7431
+ console.log(`[Daemon] EP973: Project settings synced (slugs: ${projectSlug}/${workspaceSlug})`);
7378
7432
  }
7379
7433
  } catch (error) {
7380
7434
  console.warn("[Daemon] EP964: Failed to sync project settings:", error instanceof Error ? error.message : error);
@@ -7951,14 +8005,13 @@ var Daemon = class _Daemon {
7951
8005
  } catch (e) {
7952
8006
  console.warn(`[Daemon] EP833: Failed to fetch module details for project lookup`);
7953
8007
  }
7954
- const trackedProjects = getAllProjects();
7955
- let project = projectId ? trackedProjects.find((p) => p.id === projectId) : trackedProjects[0];
7956
- if (!project && trackedProjects.length > 0) {
7957
- project = trackedProjects[0];
7958
- console.warn(`[Daemon] EP833: Could not find project ${projectId}, using fallback`);
8008
+ const worktree = await getWorktreeInfoForModule(moduleUid);
8009
+ if (!worktree) {
8010
+ console.error(`[Daemon] EP973: Cannot resolve worktree path for ${moduleUid} - missing config slugs`);
8011
+ return;
7959
8012
  }
7960
- if (!project) {
7961
- console.error(`[Daemon] EP833: No project found for tunnel restart`);
8013
+ if (!worktree.exists) {
8014
+ console.error(`[Daemon] EP973: Worktree not found at ${worktree.path}`);
7962
8015
  return;
7963
8016
  }
7964
8017
  const { isPortInUse: isPortInUse2 } = await Promise.resolve().then(() => (init_port_check(), port_check_exports));
@@ -7970,7 +8023,8 @@ var Daemon = class _Daemon {
7970
8023
  await killProcessOnPort(port);
7971
8024
  }
7972
8025
  }
7973
- const startResult2 = await ensureDevServer(project.path, port, moduleUid);
8026
+ const devServerScript = config.project_settings?.worktree_dev_server_script;
8027
+ const startResult2 = await ensureDevServer(worktree.path, port, moduleUid, devServerScript);
7974
8028
  if (!startResult2.success) {
7975
8029
  console.error(`[Daemon] EP932: Failed to start dev server: ${startResult2.error}`);
7976
8030
  return;