11#!/usr/bin/env bun
2- import { mkdirSync , rmSync , cpSync , readFileSync , writeFileSync } from 'node:fs' ;
2+ import { mkdirSync , rmSync , cpSync , readFileSync , writeFileSync , readdirSync } from 'node:fs' ;
33import { join , dirname , resolve } from 'node:path' ;
44import { fileURLToPath } from 'node:url' ;
55import { platform , arch } from 'node:os' ;
6- import { generateEmbeddedResources } from './generate-embedded-resources.mjs' ;
76import { $ } from 'bun' ;
87
98// Simple ANSI colors
@@ -43,8 +42,50 @@ console.log(`\n${bold}${cyan}╭────────────────
4342console . log ( `${ bold } ${ cyan } │${ reset } Building ${ bold } CodeMachine${ reset } v${ mainVersion } ${ bold } ${ cyan } │${ reset } ` ) ;
4443console . log ( `${ bold } ${ cyan } ╰────────────────────────────────────────╯${ reset } \n` ) ;
4544
46- await generateEmbeddedResources ( { quiet : true , writeJson : true , writeCache : true } ) ;
47- console . log ( `${ green } ✓${ reset } ${ dim } Embedded resources refreshed${ reset } ` ) ;
45+ // Collect resource files for embedding and generate a manifest that imports them.
46+ function collectFiles ( dir ) {
47+ const results = [ ] ;
48+ const stack = [ dir ] ;
49+
50+ while ( stack . length > 0 ) {
51+ const current = stack . pop ( ) ;
52+ const absPath = join ( repoRoot , current ) ;
53+ const entries = readdirSync ( absPath , { withFileTypes : true } ) ;
54+
55+ for ( const entry of entries ) {
56+ const relPath = join ( current , entry . name ) ;
57+ const absEntry = join ( repoRoot , relPath ) ;
58+
59+ if ( entry . isDirectory ( ) ) {
60+ stack . push ( relPath ) ;
61+ } else if ( entry . isFile ( ) ) {
62+ results . push ( absEntry ) ;
63+ }
64+ }
65+ }
66+
67+ return results ;
68+ }
69+
70+ const resourceFiles = [
71+ ...collectFiles ( 'config' ) ,
72+ ...collectFiles ( 'prompts' ) ,
73+ ...collectFiles ( 'templates' ) ,
74+ join ( repoRoot , 'package.json' ) ,
75+ ] ;
76+
77+ // Generate simple imports file (no exports/mapping needed with --asset-naming)
78+ const imports = resourceFiles . map ( ( abs ) => {
79+ // Manifest is at src/shared/runtime/, so need ../../../ to reach repo root
80+ const rel = '../../../' + abs . replace ( repoRoot + '/' , '' ) ;
81+ return `import "${ rel } " with { type: "file" };` ;
82+ } ) ;
83+
84+ const manifestContent = `// Auto-generated: tells Bun which files to embed\n${ imports . join ( '\n' ) } \n` ;
85+ const manifestPath = join ( repoRoot , 'src' , 'shared' , 'runtime' , 'resource-manifest.ts' ) ;
86+ writeFileSync ( manifestPath , manifestContent ) ;
87+
88+ console . log ( `${ green } ✓${ reset } ${ dim } Collected ${ resourceFiles . length } resource files for embedding${ reset } ` ) ;
4889
4990// Auto-sync platform package versions before building
5091if ( mainPackage . optionalDependencies ) {
@@ -170,18 +211,25 @@ try {
170211 define : {
171212 __CODEMACHINE_VERSION__ : JSON . stringify ( mainVersion ) ,
172213 } ,
214+ naming : {
215+ asset : '[dir]/[name].[ext]' , // Preserve original filenames (no hashing)
216+ } ,
173217 compile : {
174218 target : target ,
175219 outfile : binaryPath ,
176220 } ,
177- entrypoints : [ './src/runtime/index.ts' ] ,
221+ entrypoints : [ './src/runtime/index.ts' , manifestPath ] ,
178222 } ) ;
179223
180224 if ( ! result . success ) {
181225 console . error ( ` ${ red } ✗${ reset } Main TUI build failed:` ) ;
226+ console . error ( ` Logs count: ${ result . logs . length } ` ) ;
182227 for ( const log of result . logs ) {
183228 console . error ( ` ${ dim } ${ log } ${ reset } ` ) ;
184229 }
230+ if ( result . logs . length === 0 ) {
231+ console . error ( ` ${ dim } No build logs available. Result:${ reset } ` , result ) ;
232+ }
185233 process . exit ( 1 ) ;
186234 }
187235
@@ -198,11 +246,14 @@ try {
198246 define : {
199247 __CODEMACHINE_VERSION__ : JSON . stringify ( mainVersion ) ,
200248 } ,
249+ naming : {
250+ asset : '[dir]/[name].[ext]' , // Preserve original filenames (no hashing)
251+ } ,
201252 compile : {
202253 target : target ,
203254 outfile : workflowBinaryPath ,
204255 } ,
205- entrypoints : [ './src/workflows/runner-process.ts' ] ,
256+ entrypoints : [ './src/workflows/runner-process.ts' , manifestPath ] ,
206257 } ) ;
207258
208259 if ( ! workflowResult . success ) {
@@ -252,9 +303,12 @@ try {
252303 console . log ( `\n${ green } ✓${ reset } ${ bold } Build complete for ${ targets . length } target(s)${ reset } \n` ) ;
253304} catch ( error ) {
254305 console . error ( `\n${ red } ✗${ reset } ${ bold } Build failed${ reset } ` ) ;
255- console . error ( `${ dim } ${ error . message } ${ reset } ` ) ;
306+ console . error ( `${ dim } Error type: ${ error ?. constructor ?. name } ${ reset } ` ) ;
307+ console . error ( `${ dim } Error message: ${ error ?. message || 'No message' } ${ reset } ` ) ;
308+ console . error ( `${ dim } Full error:${ reset } ` , error ) ;
256309 if ( error . stack ) {
257- console . error ( `\n${ dim } ${ error . stack } ${ reset } ` ) ;
310+ console . error ( `\n${ dim } Stack:${ reset } ` ) ;
311+ console . error ( `${ dim } ${ error . stack } ${ reset } ` ) ;
258312 }
259313 process . exit ( 1 ) ;
260314}
0 commit comments