File size: 3,905 Bytes
6fc63f8 1bfd51f 642c567 1bfd51f 642c567 1bfd51f 642c567 1bfd51f 642c567 1bfd51f 96f34e3 e18c81d 642c567 e18c81d 1bfd51f 642c567 1bfd51f 642c567 1bfd51f 642c567 1bfd51f 642c567 94f44a2 642c567 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | import { chmodSync, cpSync, existsSync, mkdirSync } from 'fs'
import { dirname, join } from 'path'
const pkg = await Bun.file(new URL('../package.json', import.meta.url)).json() as {
name: string
version: string
}
import { FULL_EXPERIMENTAL_FEATURES } from './features.ts'
const args = process.argv.slice(2)
function runCommand(cmd: string[]): string | null {
const proc = Bun.spawnSync({
cmd,
cwd: process.cwd(),
stdout: 'pipe',
stderr: 'pipe',
})
if (proc.exitCode !== 0) return null
return new TextDecoder().decode(proc.stdout).trim() || null
}
function getDevVersion(baseVersion: string): string {
const timestamp = new Date().toISOString()
const date = timestamp.slice(0, 10).replaceAll('-', '')
const time = timestamp.slice(11, 19).replaceAll(':', '')
const sha = runCommand(['git', 'rev-parse', '--short=8', 'HEAD']) ?? 'unknown'
return `${baseVersion}-dev.${date}.t${time}.sha${sha}`
}
function getVersionChangelog(): string {
return (
runCommand(['git', 'log', '--format=%h %s', '-20']) ??
'Local development build'
)
}
// Collect feature flags (always all + any extras from args)
const featureSet = new Set<string>(FULL_EXPERIMENTAL_FEATURES)
for (let i = 0; i < args.length; i += 1) {
const arg = args[i]
if (arg === '--feature' && args[i + 1]) {
featureSet.add(args[i + 1]!)
i += 1
} else if (arg.startsWith('--feature=')) {
featureSet.add(arg.slice('--feature='.length))
}
}
const features = [...featureSet]
const outfile = join('dist', 'codev')
// ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
const buildTime = new Date().toISOString()
const version = getDevVersion(pkg.version)
mkdirSync(dirname(outfile), { recursive: true })
const externals = [
'@ant/*',
'audio-capture-napi',
'image-processor-napi',
'modifiers-napi',
'url-handler-napi',
]
const defines = {
'process.env.USER_TYPE': JSON.stringify('external'),
'process.env.CLAUDE_CODE_FORCE_FULL_LOGO': JSON.stringify('true'),
'process.env.NODE_ENV': JSON.stringify('development'),
'process.env.CLAUDE_CODE_EXPERIMENTAL_BUILD': JSON.stringify('true'),
'process.env.CLAUDE_CODE_VERIFY_PLAN': JSON.stringify('false'),
'process.env.CCR_FORCE_BUNDLE': JSON.stringify('true'),
'MACRO.VERSION': JSON.stringify(version),
'MACRO.BUILD_TIME': JSON.stringify(buildTime),
'MACRO.PACKAGE_URL': JSON.stringify(pkg.name),
'MACRO.NATIVE_PACKAGE_URL': 'undefined',
'MACRO.FEEDBACK_CHANNEL': JSON.stringify('github'),
'MACRO.ISSUES_EXPLAINER': JSON.stringify(
'This reconstructed source snapshot does not include Anthropic internal issue routing.',
),
'MACRO.VERSION_CHANGELOG': JSON.stringify(getVersionChangelog()),
} as const
const cmd = [
'bun',
'build',
'./src/entrypoints/cli.tsx',
'--compile',
'--target',
'bun',
'--format',
'esm',
'--outfile',
outfile,
'--minify',
'--bytecode',
'--packages',
'bundle',
'--conditions',
'bun',
]
for (const external of externals) {
cmd.push('--external', external)
}
for (const feature of features) {
cmd.push(`--feature=${feature}`)
}
for (const [key, value] of Object.entries(defines)) {
cmd.push('--define', `${key}=${value}`)
}
const proc = Bun.spawnSync({
cmd,
cwd: process.cwd(),
stdout: 'inherit',
stderr: 'inherit',
})
if (proc.exitCode !== 0) {
process.exit(proc.exitCode ?? 1)
}
if (existsSync(outfile)) {
chmodSync(outfile, 0o755)
}
// Copy vendor/ to dist/vendor/ for runtime audio-capture resolution
const distDir = dirname(outfile)
const vendorDir = join(distDir, 'vendor')
if (!existsSync(vendorDir)) {
cpSync('vendor', vendorDir, { recursive: true })
console.log(`Copied vendor/ β ${vendorDir}/`)
}
console.log(`Built ${outfile}`)
|