feat: add generic Agent Skill export target #44
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Non-Windows | |
| on: | |
| push: | |
| branches: | |
| - master | |
| pull_request: | |
| permissions: | |
| contents: read | |
| jobs: | |
| build: | |
| name: ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 20 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: | |
| - macos-latest | |
| - ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 24.19.0 | |
| cache: npm | |
| - name: Validate lockfile portability | |
| run: npm run check:lockfile | |
| - name: Validate source installer guardrails | |
| run: | | |
| bash -n install.sh | |
| set +e | |
| output="$(SKILL_RECORDER_COMMIT=master bash install.sh 2>&1)" | |
| status=$? | |
| set -e | |
| if [ "$status" -eq 0 ]; then | |
| echo "install.sh accepted a mutable source reference" >&2 | |
| exit 1 | |
| fi | |
| printf '%s\n' "$output" | grep -q "full 40-character" | |
| - name: Test commit-pinned source installation | |
| env: | |
| SKILL_RECORDER_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} | |
| SKILL_RECORDER_INSTALL_ROOT: ${{ runner.temp }}/skill-recorder-source | |
| SKILL_RECORDER_NO_LAUNCH: "1" | |
| run: bash install.sh | |
| - name: Verify macOS relaunch app bundle | |
| if: runner.os == 'macOS' | |
| run: | | |
| app="$HOME/Applications/Skill Recorder (Source).app" | |
| stub="$app/Contents/MacOS/skill-recorder-source" | |
| plist="$app/Contents/Info.plist" | |
| test -d "$app" | |
| test -x "$stub" | |
| plutil -lint "$plist" | |
| - run: npm ci --ignore-scripts=false --dangerously-allow-all-scripts=false --strict-allow-scripts | |
| - run: npm run compliance:licenses | |
| - name: Verify platform license coverage | |
| run: | | |
| node --input-type=module -e " | |
| import { existsSync, readFileSync } from 'node:fs'; | |
| const inventory = JSON.parse(readFileSync('.compliance/LICENSE-INVENTORY.json')); | |
| const libvips = inventory.packages.find(({ name }) => | |
| name.startsWith('@img/sharp-libvips-')); | |
| if (!libvips || libvips.licenseSource !== 'licenses/LGPL-3.0.txt') | |
| throw new Error('Platform Sharp/libvips LGPL coverage is missing'); | |
| if (!existsSync('.compliance/licenses/LGPL-3.0.txt')) | |
| throw new Error('Canonical LGPL-3.0 text is missing'); | |
| " | |
| - name: Verify optional window provider | |
| run: >- | |
| node --input-type=module -e | |
| "const m = await import('get-windows'); | |
| if (typeof m.activeWindow !== 'function') | |
| throw new Error('get-windows activeWindow export is unavailable')" | |
| - run: npm test | |
| - run: npm run build |