diff --git a/package.json b/package.json index b24b52535..5ee88583f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "browse": "./browse/dist/browse" }, "scripts": { - "build": "bun run gen:skill-docs && bun run gen:skill-docs --host codex && bun build --compile browse/src/cli.ts --outfile browse/dist/browse && bun build --compile browse/src/find-browse.ts --outfile browse/dist/find-browse && bun build --compile bin/gstack-global-discover.ts --outfile bin/gstack-global-discover && bash browse/scripts/build-node-server.sh && git rev-parse HEAD > browse/dist/.version && rm -f .*.bun-build || true", + "build": "bash scripts/build-artifacts.sh", "gen:skill-docs": "bun run scripts/gen-skill-docs.ts", "dev": "bun run browse/src/cli.ts", "server": "bun run browse/src/server.ts", diff --git a/scripts/build-artifacts.sh b/scripts/build-artifacts.sh new file mode 100755 index 000000000..01eaeb55e --- /dev/null +++ b/scripts/build-artifacts.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +build_or_wrap() { + local entry="$1" + local outfile="$2" + local rel_script="$3" + + mkdir -p "$(dirname "$outfile")" + if bun build --compile "$entry" --outfile "$outfile"; then + return 0 + fi + + echo "warning: bun build --compile failed for $entry; falling back to bun run wrapper at $outfile" >&2 + cat > "$outfile" < browse/dist/.version +rm -f .*.bun-build diff --git a/test/gen-skill-docs.test.ts b/test/gen-skill-docs.test.ts index 32e77a368..24cbc0f41 100644 --- a/test/gen-skill-docs.test.ts +++ b/test/gen-skill-docs.test.ts @@ -1378,6 +1378,33 @@ describe('setup script validation', () => { }); }); +describe('build script validation', () => { + const pkg = JSON.parse(fs.readFileSync(path.join(ROOT, 'package.json'), 'utf-8')); + const buildScript = fs.readFileSync(path.join(ROOT, 'scripts', 'build-artifacts.sh'), 'utf-8'); + + test('package.json build delegates to the build-artifacts helper', () => { + expect(pkg.scripts.build).toBe('bash scripts/build-artifacts.sh'); + }); + + test('build helper falls back to bun run wrappers when bun compile fails', () => { + expect(buildScript).toContain('build_or_wrap()'); + expect(buildScript).toContain('bun build --compile'); + expect(buildScript).toContain('falling back to bun run wrapper'); + expect(buildScript).toContain('exec bun run'); + }); + + test('build helper covers all compiled entrypoints that setup depends on', () => { + expect(buildScript).toContain('build_or_wrap "browse/src/cli.ts" "browse/dist/browse" "../src/cli.ts"'); + expect(buildScript).toContain('build_or_wrap "browse/src/find-browse.ts" "browse/dist/find-browse" "../src/find-browse.ts"'); + expect(buildScript).toContain('build_or_wrap "bin/gstack-global-discover.ts" "bin/gstack-global-discover" "gstack-global-discover.ts"'); + }); + + test('build path no longer hides compile failures behind a blanket || true', () => { + expect(pkg.scripts.build).not.toContain('|| true'); + expect(buildScript).not.toContain('|| true'); + }); +}); + describe('telemetry', () => { test('generated SKILL.md contains telemetry start block', () => { const content = fs.readFileSync(path.join(ROOT, 'SKILL.md'), 'utf-8');