feat: consolidate TraceDecay V2 PR8-PR13 delivery #1077
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
| # Schema/lint layer for the shipped agent plugin bundles. Mirrors: | |
| # https://github.com/cursor/plugins/blob/main/.github/workflows/validate-plugins.yml | |
| # | |
| # Rust contract tests already run in ci.yml. Keep this workflow to schema checks | |
| # and the SDK-backed MCP smoke, which needs a built binary plus npx. | |
| name: Plugin Validation | |
| on: | |
| push: | |
| branches: [master] | |
| pull_request: | |
| paths: | |
| - "plugin/**" | |
| - "plugin/cursor-native-extension/**" | |
| - "tests/fixtures/cursor-schemas/**" | |
| - "tests/agent_suite/*plugin*" | |
| - "tests/agent_suite/*skill*" | |
| - "scripts/mcp-conformance-smoke.sh" | |
| - "scripts/check-dashboard-bundle.py" | |
| - "src/serve.rs" | |
| - "src/main.rs" | |
| - "src/lib.rs" | |
| - "src/mcp/**" | |
| - "Cargo.toml" | |
| - "Cargo.lock" | |
| - ".github/workflows/plugin-validation.yml" | |
| permissions: | |
| contents: read | |
| env: | |
| TRACEDECAY_SKIP_DASHBOARD_BUILD: "1" | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| dashboard-assets: | |
| name: Build dashboard artifact | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - uses: actions/setup-node@v5 | |
| with: | |
| node-version: 22 | |
| cache: npm | |
| cache-dependency-path: dashboard/package-lock.json | |
| - name: Install dashboard dependencies | |
| working-directory: dashboard | |
| run: npm ci | |
| - name: Build dashboard | |
| working-directory: dashboard | |
| run: npm run build | |
| - name: Validate dashboard bundle | |
| run: python3 scripts/check-dashboard-bundle.py dashboard/app-dist | |
| - name: Upload dashboard artifact | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: dashboard-app-dist | |
| path: dashboard/app-dist | |
| if-no-files-found: error | |
| include-hidden-files: true | |
| manifest-schema: | |
| name: Manifest schema | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - uses: actions/setup-node@v5 | |
| with: | |
| node-version: 22 | |
| - name: Install ajv-cli | |
| run: npm install --no-save ajv-cli@5.0.0 ajv-formats@2.1.1 | |
| - name: Compile vendored schemas | |
| run: | | |
| set -euo pipefail | |
| npx --no-install ajv compile --spec=draft7 -c ajv-formats \ | |
| -s tests/fixtures/cursor-schemas/plugin.schema.json \ | |
| -s tests/fixtures/cursor-schemas/marketplace.schema.json \ | |
| -s tests/fixtures/cursor-schemas/mcp.schema.json \ | |
| -s tests/fixtures/cursor-schemas/hooks.schema.json | |
| - name: Validate Cursor plugin manifest | |
| run: | | |
| set -euo pipefail | |
| npx --no-install ajv validate --spec=draft7 -c ajv-formats --errors=text \ | |
| -s tests/fixtures/cursor-schemas/plugin.schema.json \ | |
| -d plugin/.cursor-plugin/plugin.json | |
| - name: Check bundle JSON files parse | |
| run: | | |
| set -euo pipefail | |
| find plugin -name '*.json' -print0 | | |
| while IFS= read -r -d '' f; do | |
| python3 -c "import json,sys; json.load(open(sys.argv[1]))" "$f" \ | |
| || { echo "invalid JSON: $f" >&2; exit 1; } | |
| echo "ok: $f" | |
| done | |
| claude-native-validation: | |
| name: Claude native plugin validation | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install Claude Code | |
| run: | | |
| set -euo pipefail | |
| curl -fsSL https://claude.ai/install.sh | bash | |
| echo "$HOME/.local/bin" >> "$GITHUB_PATH" | |
| - name: Validate Claude plugin bundle | |
| run: claude plugin validate plugin --strict | |
| # Uses MCP Inspector's TypeScript SDK client to cover stdio handshake and | |
| # schema compatibility beyond the in-repo Rust MCP tests. | |
| mcp-conformance-smoke: | |
| name: MCP conformance smoke | |
| needs: dashboard-assets | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Download dashboard artifact | |
| uses: actions/download-artifact@v7 | |
| with: | |
| name: dashboard-app-dist | |
| path: dashboard/app-dist | |
| - name: Validate downloaded dashboard bundle | |
| run: python3 scripts/check-dashboard-bundle.py dashboard/app-dist | |
| - uses: actions/setup-node@v5 | |
| with: | |
| node-version: 22 | |
| - uses: dtolnay/rust-toolchain@stable | |
| - uses: Swatinem/rust-cache@v2 | |
| - name: Build tracedecay | |
| run: cargo build --all-features --bin tracedecay --locked | |
| - name: Run MCP conformance smoke | |
| run: scripts/mcp-conformance-smoke.sh | |
| env: | |
| TRACEDECAY_BIN: target/debug/tracedecay |