Skip to content

feat(kanban): v1.3.0 — tmux split pane rendering, smart terminal widt… #94

feat(kanban): v1.3.0 — tmux split pane rendering, smart terminal widt…

feat(kanban): v1.3.0 — tmux split pane rendering, smart terminal widt… #94

Workflow file for this run

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