diff --git a/npm/codewhale/scripts/artifacts.js b/npm/codewhale/scripts/artifacts.js index c0a74f4f..77dd081a 100644 --- a/npm/codewhale/scripts/artifacts.js +++ b/npm/codewhale/scripts/artifacts.js @@ -14,7 +14,7 @@ const ASSET_MATRIX = { arm64: ["codewhale-macos-arm64", "codewhale-tui-macos-arm64"], }, win32: { - x64: ["codewhale-windows-x64.exe", "codewhale-tui-windows-x64.exe"], + x64: ["codewhale-windows-x64.exe", "codewhale-tui-windows-x64.exe", "codewhale.bat"], }, }; @@ -112,8 +112,8 @@ function releaseBinaryDirectory() { function allAssetNames() { const names = []; for (const platformAssets of Object.values(ASSET_MATRIX)) { - for (const pair of Object.values(platformAssets)) { - names.push(pair[0], pair[1]); + for (const assets of Object.values(platformAssets)) { + names.push(...assets); } } return Array.from(new Set(names)); diff --git a/npm/codewhale/test/artifacts.test.js b/npm/codewhale/test/artifacts.test.js index e16e88fd..a5483170 100644 --- a/npm/codewhale/test/artifacts.test.js +++ b/npm/codewhale/test/artifacts.test.js @@ -65,3 +65,12 @@ test("known platforms are unaffected by alias map", () => { }); } }); + +test("allAssetNames includes every matrix entry", () => { + const { allAssetNames, allReleaseAssetNames } = require(ARTIFACTS_PATH); + const assetNames = allAssetNames(); + assert.ok(assetNames.includes("codewhale-windows-x64.exe")); + assert.ok(assetNames.includes("codewhale-tui-windows-x64.exe")); + assert.ok(assetNames.includes("codewhale.bat")); + assert.ok(allReleaseAssetNames().includes("codewhale.bat")); +}); diff --git a/scripts/release/prepare-local-release-assets.js b/scripts/release/prepare-local-release-assets.js index 8cb2c779..db258421 100755 --- a/scripts/release/prepare-local-release-assets.js +++ b/scripts/release/prepare-local-release-assets.js @@ -10,6 +10,9 @@ const { detectBinaryNames, } = require("../../npm/codewhale/scripts/artifacts"); +const WINDOWS_LAUNCHER = "codewhale.bat"; +const WINDOWS_CLI_ASSET = "codewhale-windows-x64.exe"; + async function sha256(filePath) { const content = await fs.readFile(filePath); return crypto.createHash("sha256").update(content).digest("hex"); @@ -41,6 +44,9 @@ async function main() { if (prepareAllAssets) { for (const assetName of allAssetNames()) { + if (assetName === WINDOWS_LAUNCHER) { + continue; + } if (assets.some((asset) => asset.target === assetName)) { continue; } @@ -62,6 +68,25 @@ async function main() { manifestLines.push(`${await sha256(outputPath)} ${asset.target}`); } + if (assets.some((asset) => asset.target === WINDOWS_CLI_ASSET)) { + const batContent = [ + "@echo off", + "where wt >nul 2>nul", + "set NO_ANIMATIONS=1", + 'if "%ERRORLEVEL%"=="0" (', + ' wt --title CodeWhale cmd /k "%~dp0codewhale-windows-x64.exe"', + ") else (", + ' "%~dp0codewhale-windows-x64.exe"', + ")", + "", + ].join("\r\n"); + const batPath = path.join(outputDir, WINDOWS_LAUNCHER); + await fs.writeFile(batPath, batContent, "utf8"); + const batHash = await sha256(batPath); + manifestLines.push(`${batHash} ${WINDOWS_LAUNCHER}`); + console.log(`Generated ${batPath}`); + } + manifestLines.sort(); const manifestPath = path.join(outputDir, CHECKSUM_MANIFEST); await fs.writeFile(manifestPath, `${manifestLines.join("\n")}\n`, "utf8");