codebay 0.16.0 → 0.16.1

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.
@@ -23,14 +23,14 @@
23
23
  "src/components/DropZone.svelte": "/_mochi/css/DropZone-1zeitd761uwyd.css",
24
24
  "node_modules/svelte-french-toast/dist/components/CheckmarkIcon.svelte": "/_mochi/css/CheckmarkIcon-3qlazj2oc50jc.css",
25
25
  "node_modules/svelte-french-toast/dist/components/Toaster.svelte": "/_mochi/css/Toaster-kk60j193854n.css",
26
- "node_modules/svelte-french-toast/dist/components/ToastIcon.svelte": "/_mochi/css/ToastIcon-2z5wrkc95khg0.css",
27
26
  "node_modules/svelte-french-toast/dist/components/LoaderIcon.svelte": "/_mochi/css/LoaderIcon-soq5wt3p05ye.css",
27
+ "node_modules/svelte-french-toast/dist/components/ToastIcon.svelte": "/_mochi/css/ToastIcon-2z5wrkc95khg0.css",
28
28
  "node_modules/svelte-french-toast/dist/components/ErrorIcon.svelte": "/_mochi/css/ErrorIcon-2x0tzsqxskw28.css",
29
29
  "node_modules/svelte-french-toast/dist/components/ToastBar.svelte": "/_mochi/css/ToastBar-3havgkmtofntq.css",
30
30
  "src/components/Skeleton.svelte": "/_mochi/css/Skeleton-8k69usiju43h.css",
31
+ "src/components/HealthBox.svelte": "/_mochi/css/HealthBox-r0giuhjn2wj4.css",
31
32
  "src/components/AgentLogBox.svelte": "/_mochi/css/AgentLogBox-38adby5iygny7.css",
32
33
  "src/components/StatusBadge.svelte": "/_mochi/css/StatusBadge-2eisdtnrsnfdc.css",
33
- "src/components/HealthBox.svelte": "/_mochi/css/HealthBox-r0giuhjn2wj4.css",
34
34
  "src/components/AvatarEditor.svelte": "/_mochi/css/AvatarEditor-1mjvec6bwdkv8.css",
35
35
  "src/components/AppBar.svelte": "/_mochi/css/AppBar-1gtu2me3fni8e.css",
36
36
  "src/components/Avatar.svelte": "/_mochi/css/Avatar-3pi30db6ozvf0.css",
@@ -40,14 +40,14 @@
40
40
  "src/components/TerminalPane.svelte": "/_mochi/css/TerminalPane-2ywc86rhtmr9l.css",
41
41
  "src/components/TopBar.svelte": "/_mochi/css/TopBar-2y76zxwehrfos.css",
42
42
  "src/components/InstanceCard.svelte": "/_mochi/css/InstanceCard-3vxozrp9uoads.css",
43
- "node_modules/svelte-french-toast/dist/components/ToastMessage.svelte": "/_mochi/css/ToastMessage-2jfwb2og2lfa8.css",
44
43
  "src/components/FolderBrowser.svelte": "/_mochi/css/FolderBrowser-i0uj58dph27f.css",
45
44
  "node_modules/svelte-french-toast/dist/components/ToastWrapper.svelte": "/_mochi/css/ToastWrapper-1fbnym10rm2nv.css",
46
- "src/components/Brand.svelte": "/_mochi/css/Brand-1bh2b800g5vrn.css",
47
- "src/components/InstanceFilter.svelte": "/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css",
48
- "src/components/SettingsCog.svelte": "/_mochi/css/SettingsCog-1jdeprd3ilczz.css",
45
+ "node_modules/svelte-french-toast/dist/components/ToastMessage.svelte": "/_mochi/css/ToastMessage-2jfwb2og2lfa8.css",
49
46
  "src/components/CredMenu.svelte": "/_mochi/css/CredMenu-7qowd1oxujet.css",
47
+ "src/components/SettingsCog.svelte": "/_mochi/css/SettingsCog-1jdeprd3ilczz.css",
48
+ "src/components/InstanceFilter.svelte": "/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css",
50
49
  "src/components/PortsBox.svelte": "/_mochi/css/PortsBox-1t25b5yg7jva3.css",
50
+ "src/components/Brand.svelte": "/_mochi/css/Brand-1bh2b800g5vrn.css",
51
51
  "src/components/BranchBox.svelte": "/_mochi/css/BranchBox-1yqu1q2mgnjwz.css"
52
52
  },
53
53
  "clientFiles": {
@@ -65,14 +65,14 @@
65
65
  "/_mochi/css/DropZone-1zeitd761uwyd.css": "svelte-css/DropZone-1zeitd761uwyd.css",
66
66
  "/_mochi/css/CheckmarkIcon-3qlazj2oc50jc.css": "svelte-css/CheckmarkIcon-3qlazj2oc50jc.css",
67
67
  "/_mochi/css/Toaster-kk60j193854n.css": "svelte-css/Toaster-kk60j193854n.css",
68
- "/_mochi/css/ToastIcon-2z5wrkc95khg0.css": "svelte-css/ToastIcon-2z5wrkc95khg0.css",
69
68
  "/_mochi/css/LoaderIcon-soq5wt3p05ye.css": "svelte-css/LoaderIcon-soq5wt3p05ye.css",
69
+ "/_mochi/css/ToastIcon-2z5wrkc95khg0.css": "svelte-css/ToastIcon-2z5wrkc95khg0.css",
70
70
  "/_mochi/css/ErrorIcon-2x0tzsqxskw28.css": "svelte-css/ErrorIcon-2x0tzsqxskw28.css",
71
71
  "/_mochi/css/ToastBar-3havgkmtofntq.css": "svelte-css/ToastBar-3havgkmtofntq.css",
72
72
  "/_mochi/css/Skeleton-8k69usiju43h.css": "svelte-css/Skeleton-8k69usiju43h.css",
73
+ "/_mochi/css/HealthBox-r0giuhjn2wj4.css": "svelte-css/HealthBox-r0giuhjn2wj4.css",
73
74
  "/_mochi/css/AgentLogBox-38adby5iygny7.css": "svelte-css/AgentLogBox-38adby5iygny7.css",
74
75
  "/_mochi/css/StatusBadge-2eisdtnrsnfdc.css": "svelte-css/StatusBadge-2eisdtnrsnfdc.css",
75
- "/_mochi/css/HealthBox-r0giuhjn2wj4.css": "svelte-css/HealthBox-r0giuhjn2wj4.css",
76
76
  "/_mochi/css/AvatarEditor-1mjvec6bwdkv8.css": "svelte-css/AvatarEditor-1mjvec6bwdkv8.css",
77
77
  "/_mochi/css/AppBar-1gtu2me3fni8e.css": "svelte-css/AppBar-1gtu2me3fni8e.css",
78
78
  "/_mochi/css/Avatar-3pi30db6ozvf0.css": "svelte-css/Avatar-3pi30db6ozvf0.css",
@@ -82,14 +82,14 @@
82
82
  "/_mochi/css/TerminalPane-2ywc86rhtmr9l.css": "svelte-css/TerminalPane-2ywc86rhtmr9l.css",
83
83
  "/_mochi/css/TopBar-2y76zxwehrfos.css": "svelte-css/TopBar-2y76zxwehrfos.css",
84
84
  "/_mochi/css/InstanceCard-3vxozrp9uoads.css": "svelte-css/InstanceCard-3vxozrp9uoads.css",
85
- "/_mochi/css/ToastMessage-2jfwb2og2lfa8.css": "svelte-css/ToastMessage-2jfwb2og2lfa8.css",
86
85
  "/_mochi/css/FolderBrowser-i0uj58dph27f.css": "svelte-css/FolderBrowser-i0uj58dph27f.css",
87
86
  "/_mochi/css/ToastWrapper-1fbnym10rm2nv.css": "svelte-css/ToastWrapper-1fbnym10rm2nv.css",
88
- "/_mochi/css/Brand-1bh2b800g5vrn.css": "svelte-css/Brand-1bh2b800g5vrn.css",
89
- "/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css": "svelte-css/InstanceFilter-2vglmyy0yrbbc.css",
90
- "/_mochi/css/SettingsCog-1jdeprd3ilczz.css": "svelte-css/SettingsCog-1jdeprd3ilczz.css",
87
+ "/_mochi/css/ToastMessage-2jfwb2og2lfa8.css": "svelte-css/ToastMessage-2jfwb2og2lfa8.css",
91
88
  "/_mochi/css/CredMenu-7qowd1oxujet.css": "svelte-css/CredMenu-7qowd1oxujet.css",
89
+ "/_mochi/css/SettingsCog-1jdeprd3ilczz.css": "svelte-css/SettingsCog-1jdeprd3ilczz.css",
90
+ "/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css": "svelte-css/InstanceFilter-2vglmyy0yrbbc.css",
92
91
  "/_mochi/css/PortsBox-1t25b5yg7jva3.css": "svelte-css/PortsBox-1t25b5yg7jva3.css",
92
+ "/_mochi/css/Brand-1bh2b800g5vrn.css": "svelte-css/Brand-1bh2b800g5vrn.css",
93
93
  "/_mochi/css/BranchBox-1yqu1q2mgnjwz.css": "svelte-css/BranchBox-1yqu1q2mgnjwz.css",
94
94
  "/_mochi/import-css/index-0nwv3654.css": "import-css/index-0nwv3654.css",
95
95
  "/_mochi/import-css/index-xndx4980.css": "import-css/index-xndx4980.css",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebay",
3
- "version": "0.16.0",
3
+ "version": "0.16.1",
4
4
  "description": "Web UI for spinning up isolated devcontainer instances from any local folder, each with a browser-based VS Code (code-server) — built for parallel Claude Code workflows.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -150,6 +150,15 @@ export function binShim(binDir: string, name: string): string | null {
150
150
  return null;
151
151
  }
152
152
 
153
+ /**
154
+ * The CLI's `node` shebang resolves to Bun under Bun, and Bun loads `bunfig.toml` from cwd — so a
155
+ * workspace cwd would run the repo's `preload` on the host; not tmpdir, since that's world-writable.
156
+ */
157
+ export function devcontainerCwd(): string {
158
+ mkdirSync(DATA_DIR, { recursive: true });
159
+ return DATA_DIR;
160
+ }
161
+
153
162
  /**
154
163
  * An argv rather than a path, because the `devcontainer.js` fallback leads with a
155
164
  * `#!/usr/bin/env node` shebang that Windows doesn't honour — there it only runs when handed to
@@ -15,6 +15,7 @@ import {
15
15
  PUBLISH_HOST,
16
16
  TTYD_PORT,
17
17
  devcontainerBin,
18
+ devcontainerCwd,
18
19
  dockerEnv
19
20
  } from './config.server.ts';
20
21
  import { spawnCapture } from './spawn.server.ts';
@@ -381,7 +382,8 @@ let cliProbeWarned = false;
381
382
 
382
383
  export async function devcontainerCliAvailable(): Promise<boolean> {
383
384
  const argv = devcontainerBin();
384
- const available = (await spawnCapture([...argv, '--version'])) !== null;
385
+ const available =
386
+ (await spawnCapture([...argv, '--version'], { cwd: devcontainerCwd() })) !== null;
385
387
  if (!available && !cliProbeWarned) {
386
388
  console.warn(`⚠ devcontainer CLI probe failed — could not run: ${argv.join(' ')}`);
387
389
  }
@@ -1032,7 +1034,7 @@ export async function devcontainerUp(
1032
1034
  opts: UpOptions = {}
1033
1035
  ): Promise<UpResult> {
1034
1036
  const proc = Bun.spawn(devcontainerUpArgs(workspaceDir, opts), {
1035
- cwd: workspaceDir,
1037
+ cwd: devcontainerCwd(),
1036
1038
  stdout: 'pipe',
1037
1039
  stderr: 'pipe',
1038
1040
  env: devcontainerUpEnv()
@@ -1,10 +1,15 @@
1
1
  /** Null on anything short of a clean run with output, so callers need no error branch. */
2
2
  export async function spawnCapture(
3
3
  cmd: string[],
4
- opts?: { env?: Record<string, string | undefined> }
4
+ opts?: { env?: Record<string, string | undefined>; cwd?: string }
5
5
  ): Promise<string | null> {
6
6
  try {
7
- const proc = Bun.spawn(cmd, { stdout: 'pipe', stderr: 'ignore', env: opts?.env });
7
+ const proc = Bun.spawn(cmd, {
8
+ stdout: 'pipe',
9
+ stderr: 'ignore',
10
+ env: opts?.env,
11
+ cwd: opts?.cwd
12
+ });
8
13
  const [out, code] = await Promise.all([new Response(proc.stdout).text(), proc.exited]);
9
14
  const value = out.trim();
10
15
  return code === 0 && value ? value : null;