@@ -17,10 +17,15 @@ type ComposeFragments = {
1717 readonly maybeDependsOn : string
1818 readonly maybePlaywrightEnv : string
1919 readonly maybeBrowserService : string
20+ readonly maybeBrowserVolume : string
21+ readonly maybeBootstrapMounts : string
2022 readonly forkRepoUrl : string
2123}
2224
23- type PlaywrightFragments = Pick < ComposeFragments , "maybeDependsOn" | "maybePlaywrightEnv" | "maybeBrowserService" >
25+ type PlaywrightFragments = Pick <
26+ ComposeFragments ,
27+ "maybeDependsOn" | "maybePlaywrightEnv" | "maybeBrowserService" | "maybeBrowserVolume"
28+ >
2429
2530const sharedCodexVolumeKey = "docker_git_shared_codex"
2631const sharedCacheVolumeKey = "docker_git_shared_cache"
@@ -54,6 +59,50 @@ const renderResourceLimits = (resourceLimits: ResolvedComposeResourceLimits | un
5459 resourceLimits === undefined
5560 ? ""
5661 : ` cpus: ${ resourceLimits . cpuLimit } \n mem_limit: "${ resourceLimits . ramLimit } "\n memswap_limit: "${ resourceLimits . ramLimit } "\n`
62+
63+ const renderProjectHostPath = ( value : string ) : string => {
64+ if ( value . startsWith ( "/" ) ) {
65+ return value
66+ }
67+
68+ const normalized = value . startsWith ( "./" ) ? value . slice ( 2 ) : value
69+ return `\${DOCKER_GIT_PROJECT_DIR_HOST:-.}/${ normalized } `
70+ }
71+
72+ const splitPath = ( value : string ) : { readonly dir : string ; readonly base : string } => {
73+ const normalized = value . replaceAll ( "\\" , "/" )
74+ const separatorIndex = normalized . lastIndexOf ( "/" )
75+ if ( separatorIndex === - 1 ) {
76+ return { dir : "." , base : normalized }
77+ }
78+ return {
79+ dir : separatorIndex === 0 ? "/" : normalized . slice ( 0 , separatorIndex ) ,
80+ base : normalized . slice ( separatorIndex + 1 )
81+ }
82+ }
83+
84+ const renderClaudeBootstrapSourceDir = ( codexAuthPath : string ) : string => {
85+ const normalized = codexAuthPath . replaceAll ( "\\" , "/" )
86+ const separatorIndex = normalized . lastIndexOf ( "/" )
87+ const authRoot = separatorIndex === - 1 ? ".orch/auth" : normalized . slice ( 0 , separatorIndex )
88+ return `${ authRoot } /claude`
89+ }
90+
91+ const renderBootstrapMounts = ( config : TemplateConfig ) : string => {
92+ const authorizedKeys = splitPath ( config . authorizedKeysPath )
93+ const envGlobal = splitPath ( config . envGlobalPath )
94+ const envProject = splitPath ( config . envProjectPath )
95+
96+ return [
97+ ` - ${ renderProjectHostPath ( authorizedKeys . dir ) } :/opt/docker-git/bootstrap/source/authorized-keys:ro` ,
98+ ` - ${ renderProjectHostPath ( envGlobal . dir ) } :/opt/docker-git/bootstrap/source/env-global:ro` ,
99+ ` - ${ renderProjectHostPath ( envProject . dir ) } :/opt/docker-git/bootstrap/source/env-project:ro` ,
100+ ` - ${ renderProjectHostPath ( config . codexAuthPath ) } :/opt/docker-git/bootstrap/source/project-auth/codex:ro` ,
101+ ` - ${ renderProjectHostPath ( renderClaudeBootstrapSourceDir ( config . codexAuthPath ) ) } :/opt/docker-git/bootstrap/source/project-auth/claude:ro` ,
102+ ` - ${ renderProjectHostPath ( config . codexSharedAuthPath ) } :/opt/docker-git/bootstrap/source/shared-auth/codex:ro`
103+ ] . join ( "\n" )
104+ }
105+
57106const buildPlaywrightFragments = (
58107 config : TemplateConfig ,
59108 networkName : string ,
@@ -63,7 +112,8 @@ const buildPlaywrightFragments = (
63112 return {
64113 maybeDependsOn : "" ,
65114 maybePlaywrightEnv : "" ,
66- maybeBrowserService : ""
115+ maybeBrowserService : "" ,
116+ maybeBrowserVolume : ""
67117 }
68118 }
69119
@@ -80,7 +130,8 @@ const buildPlaywrightFragments = (
80130 maybeBrowserService :
81131 `\n ${ browserServiceName } :\n build:\n context: .\n dockerfile: ${ browserDockerfile } \n container_name: ${ browserContainerName } \n restart: unless-stopped\n${
82132 renderResourceLimits ( resourceLimits )
83- } environment:\n VNC_NOPW: "1"\n shm_size: "2gb"\n expose:\n - "9223"\n volumes:\n - ${ browserVolumeName } :/data\n networks:\n - ${ networkName } \n`
133+ } environment:\n VNC_NOPW: "1"\n shm_size: "2gb"\n expose:\n - "9223"\n volumes:\n - ${ browserVolumeName } :/data\n networks:\n - ${ networkName } \n`,
134+ maybeBrowserVolume : ` ${ browserVolumeName } :`
84135 }
85136}
86137
@@ -112,6 +163,8 @@ const buildComposeFragments = (
112163 maybeDependsOn : playwright . maybeDependsOn ,
113164 maybePlaywrightEnv : playwright . maybePlaywrightEnv ,
114165 maybeBrowserService : playwright . maybeBrowserService ,
166+ maybeBrowserVolume : playwright . maybeBrowserVolume ,
167+ maybeBootstrapMounts : renderBootstrapMounts ( config ) ,
115168 forkRepoUrl
116169 }
117170}
@@ -144,6 +197,7 @@ ${renderResourceLimits(resourceLimits)} volumes:
144197 - ${ config . volumeName } :/home/${ config . sshUser }
145198 - ${ sharedCacheVolumeKey } :/home/${ config . sshUser } /.docker-git/.cache
146199 - ${ sharedCodexVolumeKey } :${ config . codexHome } -shared
200+ ${ fragments . maybeBootstrapMounts }
147201 - /var/run/docker.sock:/var/run/docker.sock
148202 networks:
149203 - ${ fragments . networkName }
@@ -161,7 +215,7 @@ const renderComposeNetworks = (
161215 ${ networkName } :
162216 driver: bridge`
163217
164- const renderComposeVolumes = ( config : TemplateConfig , enableMcpPlaywright : boolean ) : string =>
218+ const renderComposeVolumes = ( config : TemplateConfig , maybeBrowserVolume : string ) : string =>
165219 [
166220 "volumes:" ,
167221 ` ${ config . volumeName } :` ,
@@ -171,8 +225,8 @@ const renderComposeVolumes = (config: TemplateConfig, enableMcpPlaywright: boole
171225 ` ${ sharedCodexVolumeKey } :` ,
172226 " external: true" ,
173227 ` name: ${ dockerGitSharedCodexVolumeName } ` ,
174- ... ( enableMcpPlaywright ? [ ` ${ config . volumeName } -browser:` ] : [ ] )
175- ] . join ( "\n" )
228+ maybeBrowserVolume
229+ ] . filter ( ( entry ) => entry . length > 0 ) . join ( "\n" )
176230
177231export const renderDockerCompose = (
178232 config : TemplateConfig ,
@@ -182,6 +236,6 @@ export const renderDockerCompose = (
182236 return [
183237 renderComposeServices ( config , fragments , resourceLimits ) ,
184238 renderComposeNetworks ( fragments . networkMode , fragments . networkName ) ,
185- renderComposeVolumes ( config , config . enableMcpPlaywright )
239+ renderComposeVolumes ( config , fragments . maybeBrowserVolume )
186240 ] . join ( "\n\n" )
187241}
0 commit comments