feat(kanban): v1.3.0 — tmux split pane rendering, smart terminal widt… #94
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: Test Plugins | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - 'tools/claudeup-core/**' | |
| - 'tools/pnpm-lock.yaml' | |
| - 'tools/pnpm-workspace.yaml' | |
| - 'plugins/**' | |
| - 'shared/**' | |
| - 'tools/table/**' | |
| - '.claude-plugin/**' | |
| - 'scripts/sync-shared-deps.sh' | |
| - '.github/workflows/test-plugins.yml' | |
| pull_request: | |
| branches: [main] | |
| paths: | |
| - 'tools/claudeup-core/**' | |
| - 'tools/pnpm-lock.yaml' | |
| - 'tools/pnpm-workspace.yaml' | |
| - 'plugins/**' | |
| - 'shared/**' | |
| - 'tools/table/**' | |
| - '.claude-plugin/**' | |
| - 'scripts/sync-shared-deps.sh' | |
| - '.github/workflows/test-plugins.yml' | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| node-version: [20, 22] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js ${{ matrix.node-version }} | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node-version }} | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10 | |
| - name: Get pnpm store directory | |
| shell: bash | |
| run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV | |
| - name: Setup pnpm cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.STORE_PATH }} | |
| key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store- | |
| - name: Install dependencies | |
| working-directory: tools/claudeup-core | |
| run: pnpm install | |
| - name: Run type check | |
| working-directory: tools/claudeup-core | |
| run: pnpm typecheck | |
| - name: Run unit tests | |
| working-directory: tools/claudeup-core | |
| run: pnpm test:unit | |
| - name: Run integration tests | |
| working-directory: tools/claudeup-core | |
| run: pnpm test:integration | |
| - name: Run all tests with coverage | |
| working-directory: tools/claudeup-core | |
| run: pnpm test:coverage | |
| if: matrix.node-version == 22 | |
| - name: Upload coverage report | |
| uses: actions/upload-artifact@v4 | |
| if: matrix.node-version == 22 | |
| with: | |
| name: coverage-report | |
| path: tools/claudeup-core/coverage/ | |
| retention-days: 7 | |
| - name: Upload test results | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: test-results-node-${{ matrix.node-version }} | |
| path: tools/claudeup-core/test-results/ | |
| retention-days: 7 | |
| marketplace-sync: | |
| runs-on: ubuntu-latest | |
| needs: test | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10 | |
| - name: Install dependencies | |
| working-directory: tools/claudeup-core | |
| run: pnpm install | |
| - name: Verify marketplace sync | |
| working-directory: tools/claudeup-core | |
| run: | | |
| echo "Running marketplace sync verification..." | |
| pnpm vitest run src/__tests__/integration/marketplace-sync.test.ts | |
| validate-shared-deps: | |
| name: Validate shared dependencies | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Sync shared deps | |
| run: scripts/sync-shared-deps.sh | |
| - name: Check shared deps are in sync | |
| run: | | |
| if ! git diff --exit-code plugins/*/lib/; then | |
| echo "" | |
| echo "ERROR: Shared dependencies are out of sync." | |
| echo "Run 'scripts/sync-shared-deps.sh' and commit the results." | |
| exit 1 | |
| fi | |
| echo "Shared dependencies are in sync." | |
| validate-marketplace: | |
| name: Validate marketplace.json format | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Validate sources are git-subdir objects | |
| run: | | |
| python3 << 'EOF' | |
| import json | |
| import sys | |
| with open(".claude-plugin/marketplace.json", "r") as f: | |
| data = json.load(f) | |
| errors = [] | |
| for plugin in data.get("plugins", []): | |
| name = plugin.get("name", "unknown") | |
| source = plugin.get("source") | |
| if isinstance(source, str): | |
| errors.append(f" {name}: source is a string ('{source}'), expected git-subdir object") | |
| elif isinstance(source, dict): | |
| if source.get("source") != "git-subdir": | |
| errors.append(f" {name}: source.source is '{source.get('source')}', expected 'git-subdir'") | |
| for field in ["url", "path", "ref", "sha"]: | |
| if not source.get(field): | |
| errors.append(f" {name}: missing required field 'source.{field}'") | |
| else: | |
| errors.append(f" {name}: source is neither string nor object") | |
| if errors: | |
| print("ERROR: marketplace.json has invalid plugin sources:") | |
| print("\n".join(errors)) | |
| print("\nRun 'scripts/release.sh' to fix marketplace sources.") | |
| sys.exit(1) | |
| print(f"All {len(data.get('plugins', []))} plugin sources are valid git-subdir objects.") | |
| EOF |