diff --git a/.github/workflows/build-tamagotchi.yml b/.github/workflows/build-tamagotchi.yml deleted file mode 100644 index 82d6d125a..000000000 --- a/.github/workflows/build-tamagotchi.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Build Tamagotchi - -permissions: - contents: write - -on: - workflow_dispatch: - inputs: - tag: - description: Attach to a specific tag/commit for the release - required: true - type: string - -jobs: - build-tamagotchi: - name: Build Tamagotchi - strategy: - matrix: - include: - - os: macos-latest - target: x86_64-apple-darwin - - os: macos-latest - target: aarch64-apple-darwin - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu - - os: ubuntu-24.04-arm - target: aarch64-unknown-linux-gnu - - os: windows-latest - target: x86_64-pc-windows-msvc - runs-on: ${{ matrix.os }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - run_install: false - - - name: Install Node.js 24.x - uses: actions/setup-node@v4 - with: - cache: pnpm - node-version: 24.x - # registry-url required. Learn more at - # https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages - registry-url: https://registry.npmjs.org - - name: Get Product Name (Windows Only) - if: matrix.os == 'windows-latest' - run: | - $productName = node -p 'require("./apps/stage-tamagotchi/src-tauri/tauri.conf.json").productName' - echo "PRODUCT_NAME=$productName" >> $env:GITHUB_ENV - - name: Get Product Name - if: matrix.os != 'windows-latest' - run: | - echo "PRODUCT_NAME=$(node -p 'require("./apps/stage-tamagotchi/src-tauri/tauri.conf.json").productName')" >> $GITHUB_ENV - - - name: Install Rust Stable - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.target }} - - - name: Install system dependencies (Ubuntu Only) - if: matrix.os == 'ubuntu-latest' || matrix.os == 'ubuntu-24.04-arm' - run: | - sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build Dependencies - run: pnpm run build:packages - - - name: Build Application - run: cd apps/stage-tamagotchi && pnpm tauri build --target ${{ matrix.target }} - - - name: Debug Environment - run: | - echo "PRODUCT_NAME: '${{ env.PRODUCT_NAME }}'" - - - name: Rename Artifacts - run: node apps/stage-tamagotchi/scripts/rename-artifacts.js ${{ matrix.target }} - - - name: Upload To GitHub Releases - uses: softprops/action-gh-release@v2 - with: - files: bundle/${{ env.PRODUCT_NAME }}_* - append_body: true - tag_name: ${{ github.event.inputs.tag }} diff --git a/.github/workflows/release-tamagotchi.yml b/.github/workflows/release-tamagotchi.yml index 776b1e420..6f6ca3d58 100644 --- a/.github/workflows/release-tamagotchi.yml +++ b/.github/workflows/release-tamagotchi.yml @@ -7,6 +7,14 @@ on: release: types: - prereleased + workflow_dispatch: + inputs: + tag: + description: Attach to a specific tag/commit for the release (leave empty to auto-detect latest tag) + required: false + type: string + schedule: + - cron: '0 0 * * *' jobs: build-tamagotchi: @@ -73,10 +81,35 @@ jobs: - name: Build Application run: cd apps/stage-tamagotchi && pnpm tauri build --target ${{ matrix.target }} - - name: Rename Artifacts - run: node apps/stage-tamagotchi/scripts/rename-artifacts.js ${{ matrix.target }} + - name: Rename Artifacts (Nightly) + if: ${{ github.event_name == 'schedule' }} + run: pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} - - name: Upload To GitHub Releases + - name: Rename Artifacts (Manual) + if: ${{ github.event_name == 'workflow_dispatch' }} + run: pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} --release --tag ${{ github.event.inputs.tag }} --auto-tag + + - name: Rename Artifacts (Automatic) + if: ${{ github.event_name == 'release' }} + run: pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} --release + + - name: Upload Artifacts + if: ${{ github.event_name == 'schedule' }} + uses: actions/upload-artifact@v4 + with: + name: Artifacts + path: bundle/${{ env.PRODUCT_NAME }}_* + + - name: Upload To GitHub Releases (Manual) + if: ${{ github.event_name == 'workflow_dispatch' }} + uses: softprops/action-gh-release@v2 + with: + files: bundle/${{ env.PRODUCT_NAME }}_* + append_body: true + tag_name: ${{ github.event.inputs.tag }} + + - name: Upload To GitHub Releases (Automatic) + if: ${{ github.event_name == 'release' }} uses: softprops/action-gh-release@v2 with: files: bundle/${{ env.PRODUCT_NAME }}_* diff --git a/apps/stage-tamagotchi/package.json b/apps/stage-tamagotchi/package.json index dcec9fef2..ef4257457 100644 --- a/apps/stage-tamagotchi/package.json +++ b/apps/stage-tamagotchi/package.json @@ -13,7 +13,8 @@ "build": "vite build", "preview": "vite preview", "tauri": "tauri", - "build:unpack": "tauri build --no-bundle" + "build:unpack": "tauri build --no-bundle", + "rename-artifacts": "tsx scripts/rename-artifacts.ts" }, "dependencies": { "@formkit/auto-animate": "^0.8.2", @@ -106,6 +107,8 @@ "@vue-macros/volar": "^3.0.0-beta.15", "@vueuse/motion": "^3.0.3", "@xsai-transformers/embed": "^0.0.7", + "cac": "^6.7.14", + "execa": "^9.6.0", "less": "^4.3.0", "unocss-preset-scrollbar": "^3.2.0", "unplugin-vue-macros": "^2.14.5", diff --git a/apps/stage-tamagotchi/scripts/rename-artifacts.js b/apps/stage-tamagotchi/scripts/rename-artifacts.js deleted file mode 100644 index 2a7addb41..000000000 --- a/apps/stage-tamagotchi/scripts/rename-artifacts.js +++ /dev/null @@ -1,63 +0,0 @@ -import fs from 'node:fs' -import path from 'node:path' -import process from 'node:process' - -import { createRequire } from 'node:module' - -const require = createRequire(import.meta.url) -const packageJson = require('../package.json') -const tauriConfigJson = require('../src-tauri/tauri.conf.json') - -const version = packageJson.version -const target = process.argv[2] -const productName = tauriConfigJson.productName -const dirname = import.meta.dirname - -console.log('version: ', version) -console.log('target: ', target) - -if (!target) { - console.error('Target is required') - process.exit(1) -} - -const srcPrefix = path.join(dirname, '..', '..', '..', 'target', target, 'release', 'bundle') -const bundlePrefix = path.join(dirname, '..', '..', '..', 'bundle') - -fs.mkdirSync(bundlePrefix, { recursive: true }) - -switch (target) { - case 'x86_64-pc-windows-msvc': - fs.renameSync( - path.join(srcPrefix, 'nsis', `${productName}_${version}_x64-setup.exe`), - path.join(bundlePrefix, `${productName}_${version}_windows_amd64-setup.exe`), - ) - break - case 'x86_64-unknown-linux-gnu': - fs.renameSync( - path.join(srcPrefix, 'appimage', `${productName}_${version}_amd64.AppImage`), - path.join(bundlePrefix, `${productName}_${version}_linux_amd64.AppImage`), - ) - break - case 'aarch64-unknown-linux-gnu': - fs.renameSync( - path.join(srcPrefix, 'appimage', `${productName}_${version}_aarch64.AppImage`), - path.join(bundlePrefix, `${productName}_${version}_linux_arm64.AppImage`), - ) - break - case 'aarch64-apple-darwin': - fs.renameSync( - path.join(srcPrefix, 'dmg', `${productName}_${version}_aarch64.dmg`), - path.join(bundlePrefix, `${productName}_${version}_macos_arm64.dmg`), - ) - break - case 'x86_64-apple-darwin': - fs.renameSync( - path.join(srcPrefix, 'dmg', `${productName}_${version}_x64.dmg`), - path.join(bundlePrefix, `${productName}_${version}_macos_amd64.dmg`), - ) - break - default: - console.error('Target is not supported') - process.exit(1) -} diff --git a/apps/stage-tamagotchi/scripts/rename-artifacts.ts b/apps/stage-tamagotchi/scripts/rename-artifacts.ts new file mode 100644 index 000000000..6b99e099a --- /dev/null +++ b/apps/stage-tamagotchi/scripts/rename-artifacts.ts @@ -0,0 +1,125 @@ +import process from 'node:process' + +import { mkdirSync, renameSync } from 'node:fs' +import { join } from 'node:path' + +import { cac } from 'cac' +import { execa } from 'execa' + +import packageJSON from '../package.json' assert { type: 'json' } +import tauriConfigJSON from '../src-tauri/tauri.conf.json' assert { type: 'json' } + +const cli = cac('rename-artifact') + .option( + '--release', + 'Rename with version from package.json', + { default: false }, + ) + .option( + '--auto-tag', + 'Automatically tag the release with the latest git ref', + { default: false }, + ) + .option( + '--tag ', + 'Tag to use for the release', + { default: '', type: [String] }, + ) + +const args = cli.parse() + +let version = packageJSON.version +const target = args.args[0] +const productName = tauriConfigJSON.productName +const dirname = import.meta.dirname + +const argOptions = args.options as { + release: boolean + autoTag: boolean + tag: string[] +} + +if (argOptions.release) { + // If --release is specified, use the version from package.json + version = packageJSON.version + + if (argOptions.tag) { + if (argOptions.tag[0] !== 'true') { + // If --tag is specified, use the provided tag + version = String(argOptions.tag[0]).replace(/^v/, '').trim() + } + else { + version = '' + } + + if (!version) { + if (argOptions.autoTag) { + // If --auto-tag is specified, fetch the latest git ref + const res = await execa('git', ['describe', '--tags', '--abbrev=0']) + version = String(res.stdout).replace(/^v/, '').trim() + } + else { + throw new Error('Tag cannot be empty when --release is specified') + } + } + } +} +else { + // Otherwise, fetch from the latest git ref + const res = await execa('git', ['log', '-1', '--pretty=format:"%H"']) + const date = new Date().toISOString().split('T')[0].replace(/-/g, '') + version = `nightly-${date}-${String(res.stdout.replace(/"/g, '')).trim().substring(0, 7)}` +} + +console.log('version:', version) +console.log('target:', target) +console.log('productName:', productName) +console.log('dirname:', dirname) + +if (!target) { + throw new Error(' is required') +} + +const srcPrefix = join(dirname, '..', '..', '..', 'target', target, 'release', 'bundle') +const bundlePrefix = join(dirname, '..', '..', '..', 'bundle') + +console.log('srcPrefix:', srcPrefix) +console.log('bundlePrefix:', bundlePrefix) + +mkdirSync(bundlePrefix, { recursive: true }) + +switch (target) { + case 'x86_64-pc-windows-msvc': + renameSync( + join(srcPrefix, 'nsis', `${productName}_${version}_x64-setup.exe`), + join(bundlePrefix, `${productName}_${version}_windows_amd64-setup.exe`), + ) + break + case 'x86_64-unknown-linux-gnu': + renameSync( + join(srcPrefix, 'appimage', `${productName}_${version}_amd64.AppImage`), + join(bundlePrefix, `${productName}_${version}_linux_amd64.AppImage`), + ) + break + case 'aarch64-unknown-linux-gnu': + renameSync( + join(srcPrefix, 'appimage', `${productName}_${version}_aarch64.AppImage`), + join(bundlePrefix, `${productName}_${version}_linux_arm64.AppImage`), + ) + break + case 'aarch64-apple-darwin': + renameSync( + join(srcPrefix, 'dmg', `${productName}_${version}_aarch64.dmg`), + join(bundlePrefix, `${productName}_${version}_macos_arm64.dmg`), + ) + break + case 'x86_64-apple-darwin': + renameSync( + join(srcPrefix, 'dmg', `${productName}_${version}_x64.dmg`), + join(bundlePrefix, `${productName}_${version}_macos_amd64.dmg`), + ) + break + default: + console.error('Target is not supported') + process.exit(1) +} diff --git a/cspell.config.yaml b/cspell.config.yaml index 3ee462cf5..ad3c00639 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -156,6 +156,7 @@ words: - pixi - pixiv - popmotion + - prereleased - pretrained - prismarine - pthread diff --git a/package.json b/package.json index 98e507cf8..593f6cd35 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "smol-toml": "^1.4.0", "taze": "^19.1.0", "tsdown": "^0.12.9", + "tsx": "^4.20.3", "turbo": "^2.5.4", "typescript": "~5.8.3", "unocss": "^66.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 645f2212c..b708a8a28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -130,6 +130,9 @@ importers: tsdown: specifier: ^0.12.9 version: 0.12.9(@arethetypeswrong/core@0.18.2)(typescript@5.8.3)(unplugin-lightningcss@0.4.1)(unplugin-unused@0.5.1)(vue-tsc@2.2.10(typescript@5.8.3)) + tsx: + specifier: ^4.20.3 + version: 4.20.3 turbo: specifier: ^2.5.4 version: 2.5.4 @@ -529,6 +532,12 @@ importers: '@xsai-transformers/embed': specifier: ^0.0.7 version: 0.0.7(web-worker@1.5.0) + cac: + specifier: ^6.7.14 + version: 6.7.14 + execa: + specifier: ^9.6.0 + version: 9.6.0 less: specifier: ^4.3.0 version: 4.3.0 @@ -5869,6 +5878,9 @@ packages: '@xsai/shared@0.3.0-beta.6': resolution: {integrity: sha512-EeqkD4+ijKKbxr9Jy9kRnJOcPBErWL8TK2wOdxwhVQuh7VbrYQwaheGjOz9g5OWwM6A0vCje/+TyHz+tURhhqw==} + '@xsai/shared@0.3.0-beta.7': + resolution: {integrity: sha512-V2zLH7NKAzp5dT+4fxhed+05svN5vtyxvuLcY/E+K/A+XrAHQW1epRuqXBHwXWcjGoSVGWbhHYe8MzW0PT1t6Q==} + '@xsai/stream-text@0.3.0-beta.5': resolution: {integrity: sha512-o0SxwzCA2F1zKcONZJX7qrk+PnKhzldV0jRqQ+NdBzaFLmg/clfqeENlbuwmfIrV5ck0BfPEMTo4gNBfxhsGSQ==} @@ -17006,7 +17018,7 @@ snapshots: '@xsai-ext/shared-providers@0.2.2': dependencies: - '@xsai/shared': 0.3.0-beta.6 + '@xsai/shared': 0.3.0-beta.7 '@xsai-ext/shared-providers@0.3.0-beta.6': dependencies: @@ -17075,6 +17087,8 @@ snapshots: '@xsai/shared@0.3.0-beta.6': {} + '@xsai/shared@0.3.0-beta.7': {} + '@xsai/stream-text@0.3.0-beta.5': dependencies: '@xsai/shared-chat': 0.3.0-beta.5