@@ -47,20 +47,109 @@ if (!arch) {
4747const base = "opencode-" + platform + "-" + arch
4848const binary = platform === "windows" ? "opencode.exe" : "opencode"
4949
50+ function supportsAvx2 ( ) {
51+ if ( arch !== "x64" ) return false
52+
53+ if ( platform === "linux" ) {
54+ try {
55+ return / ( ^ | \s ) a v x 2 ( \s | $ ) / i. test ( fs . readFileSync ( "/proc/cpuinfo" , "utf8" ) )
56+ } catch {
57+ return false
58+ }
59+ }
60+
61+ if ( platform === "darwin" ) {
62+ try {
63+ const result = childProcess . spawnSync ( "sysctl" , [ "-n" , "hw.optional.avx2_0" ] , {
64+ encoding : "utf8" ,
65+ timeout : 1500 ,
66+ } )
67+ if ( result . status !== 0 ) return false
68+ return ( result . stdout || "" ) . trim ( ) === "1"
69+ } catch {
70+ return false
71+ }
72+ }
73+
74+ if ( platform === "windows" ) {
75+ const cmd =
76+ '(Add-Type -MemberDefinition "[DllImport(""kernel32.dll"")] public static extern bool IsProcessorFeaturePresent(int ProcessorFeature);" -Name Kernel32 -Namespace Win32 -PassThru)::IsProcessorFeaturePresent(40)'
77+
78+ for ( const exe of [ "powershell.exe" , "pwsh.exe" , "pwsh" , "powershell" ] ) {
79+ try {
80+ const result = childProcess . spawnSync ( exe , [ "-NoProfile" , "-NonInteractive" , "-Command" , cmd ] , {
81+ encoding : "utf8" ,
82+ timeout : 3000 ,
83+ windowsHide : true ,
84+ } )
85+ if ( result . status !== 0 ) continue
86+ const out = ( result . stdout || "" ) . trim ( ) . toLowerCase ( )
87+ if ( out === "true" || out === "1" ) return true
88+ if ( out === "false" || out === "0" ) return false
89+ } catch {
90+ continue
91+ }
92+ }
93+
94+ return false
95+ }
96+
97+ return false
98+ }
99+
100+ const names = ( ( ) => {
101+ const avx2 = supportsAvx2 ( )
102+ const baseline = arch === "x64" && ! avx2
103+
104+ if ( platform === "linux" ) {
105+ const musl = ( ( ) => {
106+ try {
107+ if ( fs . existsSync ( "/etc/alpine-release" ) ) return true
108+ } catch {
109+ // ignore
110+ }
111+
112+ try {
113+ const result = childProcess . spawnSync ( "ldd" , [ "--version" ] , { encoding : "utf8" } )
114+ const text = ( ( result . stdout || "" ) + ( result . stderr || "" ) ) . toLowerCase ( )
115+ if ( text . includes ( "musl" ) ) return true
116+ } catch {
117+ // ignore
118+ }
119+
120+ return false
121+ } ) ( )
122+
123+ if ( musl ) {
124+ if ( arch === "x64" ) {
125+ if ( baseline ) return [ `${ base } -baseline-musl` , `${ base } -musl` , `${ base } -baseline` , base ]
126+ return [ `${ base } -musl` , `${ base } -baseline-musl` , base , `${ base } -baseline` ]
127+ }
128+ return [ `${ base } -musl` , base ]
129+ }
130+
131+ if ( arch === "x64" ) {
132+ if ( baseline ) return [ `${ base } -baseline` , base , `${ base } -baseline-musl` , `${ base } -musl` ]
133+ return [ base , `${ base } -baseline` , `${ base } -musl` , `${ base } -baseline-musl` ]
134+ }
135+ return [ base , `${ base } -musl` ]
136+ }
137+
138+ if ( arch === "x64" ) {
139+ if ( baseline ) return [ `${ base } -baseline` , base ]
140+ return [ base , `${ base } -baseline` ]
141+ }
142+ return [ base ]
143+ } ) ( )
144+
50145function findBinary ( startDir ) {
51146 let current = startDir
52147 for ( ; ; ) {
53148 const modules = path . join ( current , "node_modules" )
54149 if ( fs . existsSync ( modules ) ) {
55- const entries = fs . readdirSync ( modules )
56- for ( const entry of entries ) {
57- if ( ! entry . startsWith ( base ) ) {
58- continue
59- }
60- const candidate = path . join ( modules , entry , "bin" , binary )
61- if ( fs . existsSync ( candidate ) ) {
62- return candidate
63- }
150+ for ( const name of names ) {
151+ const candidate = path . join ( modules , name , "bin" , binary )
152+ if ( fs . existsSync ( candidate ) ) return candidate
64153 }
65154 }
66155 const parent = path . dirname ( current )
@@ -74,9 +163,9 @@ function findBinary(startDir) {
74163const resolved = findBinary ( scriptDir )
75164if ( ! resolved ) {
76165 console . error (
77- ' It seems that your package manager failed to install the right version of the opencode CLI for your platform. You can try manually installing the "' +
78- base +
79- ' " package' ,
166+ " It seems that your package manager failed to install the right version of the opencode CLI for your platform. You can try manually installing " +
167+ names . map ( ( n ) => `\" ${ n } \"` ) . join ( " or " ) +
168+ " package" ,
80169 )
81170 process . exit ( 1 )
82171}
0 commit comments