chore(release): 0.7.1-next.0 #320
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: CI | |
| # `schedule` and `workflow_dispatch` exist for the model-data-drift job only. | |
| # Triggers are workflow-wide in Actions, so every job below carries an `if:` | |
| # that scopes it to the events it is actually for. | |
| on: | |
| push: | |
| branches: ["**"] | |
| pull_request: | |
| schedule: | |
| - cron: "0 9 * * 1" | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| build: | |
| name: typecheck · test · build (node ${{ matrix.node-version }}) | |
| # Code CI only. The weekly cron and manual dispatch exist for | |
| # model-data-drift; re-running the matrix on them buys nothing. | |
| if: github.event_name == 'push' || github.event_name == 'pull_request' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| node-version: ["22.x", "24.x"] | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Set up Node ${{ matrix.node-version }} | |
| uses: actions/setup-node@v7 | |
| with: | |
| node-version: ${{ matrix.node-version }} | |
| cache: npm | |
| - name: Verify lockfile uses only the public npm registry | |
| run: | | |
| if grep -E '"resolved":[[:space:]]*"https?://' package-lock.json | grep -vq 'https://registry.npmjs.org/'; then | |
| echo "::error::package-lock.json contains non-npmjs resolved URLs:" | |
| grep -nE '"resolved":[[:space:]]*"https?://' package-lock.json | grep -v 'https://registry.npmjs.org/' || true | |
| exit 1 | |
| fi | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Typecheck | |
| run: npm run typecheck | |
| - name: Test | |
| run: npm test | |
| - name: Build | |
| run: npm run build | |
| model-data-drift: | |
| name: model limits · drift vs Cursor docs | |
| # Deliberately not on pull_request: this job reaches cursor.com, and PR CI | |
| # stays hermetic. | |
| if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Set up Node | |
| uses: actions/setup-node@v7 | |
| with: | |
| node-version: "24.x" | |
| cache: npm | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Check committed model limits against Cursor docs | |
| run: | | |
| log="$RUNNER_TEMP/drift.log" | |
| set +e | |
| npm run sync:model-limits -- --check 2>&1 | tee "$log" | |
| code=${PIPESTATUS[0]} | |
| set -e | |
| if [ "$code" = "1" ]; then | |
| echo "::error::src/model-limits.ts is stale. Run 'npm run sync:model-limits' and commit." | |
| exit 1 | |
| fi | |
| if [ "$code" = "2" ]; then | |
| echo "::error::Could not verify model data (docs unreachable, unparseable, or a model id matched nothing). The drift check did not run — treat this as unverified, not as passing." | |
| exit 1 | |
| fi | |
| if [ "$code" != "0" ]; then | |
| echo "::error::Unexpected exit code $code from the drift check." | |
| exit "$code" | |
| fi | |
| # Exit 0 is only trustworthy if the run also reported its summary. A | |
| # bare 0 is what "did nothing at all" looks like, and that has | |
| # happened: an entry-point guard once skipped main() entirely and the | |
| # job passed for free. Demand the evidence, not just the code. | |
| if ! grep -qE 'sync-model-limits: src/model-limits\.ts is up to date \(context: [0-9]+ from docs, [0-9]+ overridden \| cost: [0-9]+ from docs, [0-9]+ overridden \| [0-9]+ model ids\)' "$log"; then | |
| echo "::error::Drift check exited 0 without printing a run summary — it did not actually verify anything." | |
| exit 1 | |
| fi | |
| integration: | |
| name: e2e · opencode loads plugin & lists models | |
| # Code CI only, same reason as `build`. | |
| if: github.event_name == 'push' || github.event_name == 'pull_request' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Set up Node | |
| uses: actions/setup-node@v7 | |
| with: | |
| node-version: "24.x" | |
| cache: npm | |
| - name: Verify lockfile uses only the public npm registry | |
| run: | | |
| if grep -E '"resolved":[[:space:]]*"https?://' package-lock.json | grep -vq 'https://registry.npmjs.org/'; then | |
| echo "::error::package-lock.json contains non-npmjs resolved URLs:" | |
| grep -nE '"resolved":[[:space:]]*"https?://' package-lock.json | grep -v 'https://registry.npmjs.org/' || true | |
| exit 1 | |
| fi | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Install opencode, load the plugin, and list Cursor models | |
| run: bash scripts/integration-test.sh | |
| env: | |
| # Optional: when set, the script additionally verifies live auth and | |
| # Cursor.models.list(). Without it, the fallback model path is tested. | |
| CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }} |