Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
46ee119
feat: convert to npm workspace; add @wdio/browserstack-service alongs…
AakashHotchandani Jun 13, 2026
8505f85
fix(ci): regenerate package-lock.json to match workspace package.json
AakashHotchandani Jun 15, 2026
52767e8
fix(ci): regenerate package-lock.json via a clean full resolution
AakashHotchandani Jun 15, 2026
67b9cef
fix(ci): include peerDependency closure in lockfile (npm default peer…
AakashHotchandani Jun 15, 2026
254a69d
fix(node18): make telemetry fail-safe + openAsBlob fallback + scope f…
AakashHotchandani Jun 15, 2026
f935a52
chore(review): SHA-pin publish actions, fix core npm metadata, drop i…
AakashHotchandani Jun 15, 2026
47a1c8f
chore(review): SHA-pin publish-workflow actions + correct core npm me…
AakashHotchandani Jun 15, 2026
068e2b5
fix(release): drop setup-node registry-url so it can't shadow OIDC token
AakashHotchandani Jun 15, 2026
7d90b13
wip(v8): extract v8 service into standalone v8 branch (mirror v9)
AakashHotchandani Jun 15, 2026
b234493
wip(v8): partial teardown cleanup (timer restore + observer disconnect)
AakashHotchandani Jun 16, 2026
bda3277
test(v8): fix standalone test suite — reporter mock cycle, util emit …
AakashHotchandani Jun 16, 2026
dddc424
refactor(v8): flatten gRPC core into the service package (inline proto)
AakashHotchandani Jun 17, 2026
43e8030
fix(ci): peer-inclusive lockfile + @types/node override (v8)
AakashHotchandani Jun 18, 2026
29be3ed
feat(v8): port SDK-6277 screenshot-on-failure over gRPC in the CLI fl…
AakashHotchandani Jul 11, 2026
3d0d0ec
chore(v8): release enablement — peer->dep alignment + manual/hybrid r…
AakashHotchandani Jul 11, 2026
4d40118
fix(v8 ci): make per-file test runner CI-proof (strip ANSI/disable co…
AakashHotchandani Jul 11, 2026
6dedffb
fix(v8): resolve semgrep/CodeQL findings — non-literal RegExp → endsW…
AakashHotchandani Jul 11, 2026
f78d091
fix(browserstack-service): declare webdriverio as a dependency, not a…
AakashHotchandani Jul 13, 2026
22817e7
Merge pull request #46 from browserstack/fix/webdriverio-peer-to-dep-v8
AakashHotchandani Jul 15, 2026
cc229fe
feat(v8): port missing monorepo parity commits — test-plan/grpc-size/…
AakashHotchandani Jul 17, 2026
f27144b
test(v8): port unit tests for the ported parity commits (#15231, #15200)
AakashHotchandani Jul 17, 2026
5045503
fix(v8): report skipped, hook-aborted tests and hook results in the C…
kamal-kaur04 Jul 17, 2026
8d21b2f
fix(v8): map skipped test results in loadTestResult
kamal-kaur04 Jul 17, 2026
9475762
fix(v8): backport tracker fixes — hook instance creation, hook keying…
kamal-kaur04 Jul 17, 2026
78406cf
fix(v8): mint hook ids — anchored HOOK_REGEX never matched the qualif…
kamal-kaur04 Jul 17, 2026
2b1f799
fix(v8): treat sync-skip hooks as skipped; harden batch upload diagno…
kamal-kaur04 Jul 17, 2026
6d422d5
Merge pull request #58 from browserstack/port/wdio-v8-missing-commits
AakashHotchandani Jul 18, 2026
879ca82
ci: mirror ready-for-review label + SDK PR review gate workflows onto v8
xxshubhamxx Jul 19, 2026
62595ea
ci: also mirror PULL_REQUEST_TEMPLATE.md onto v8
xxshubhamxx Jul 19, 2026
dccf9e2
Merge pull request #62 from browserstack/ci/port-pr-review-workflows-…
xxshubhamxx Jul 19, 2026
334a55f
Version Packages
github-actions[bot] Jul 19, 2026
9346497
Merge pull request #59 from kamal-kaur04/fix/cli-skipped-tests-report…
kamal-kaur04 Jul 20, 2026
9cf34ac
Merge pull request #43 from browserstack/changeset-release/v8
Dalwin-Barnard Jul 23, 2026
ea9db70
SDK-6983: rescue SDK-log upload on signal termination (v8)
kamal-kaur04 Jul 24, 2026
df152df
Merge pull request #68 from browserstack/fix/cli-skipped-tests-report…
hamza-browserstack Jul 24, 2026
6073bcc
add: changeset
kamal-kaur04 Jul 24, 2026
0120ce0
Merge pull request #91 from browserstack/changeset-update
hamza-browserstack Jul 24, 2026
abc5972
Version Packages
github-actions[bot] Jul 24, 2026
e8b2100
Merge pull request #93 from browserstack/changeset-release/v8
hamza-browserstack Jul 24, 2026
4fc5bfa
chore: strip ticket refs from log-upload rescue comments
kamal-kaur04 Jul 24, 2026
50a06fe
test: cover log-upload rescue paths
kamal-kaur04 Jul 24, 2026
aec8d08
fix: force conventional exit after signal grace window; gate logsUplo…
kamal-kaur04 Jul 27, 2026
007bfac
Merge pull request #87 from browserstack/SDK-6983-flush-on-signal-v8
hamza-browserstack Jul 29, 2026
effdc1e
chore(v8): add missing changeset for #87 (SDK-6983, patch)
AakashHotchandani Jul 29, 2026
77ddc4a
Merge pull request #111 from browserstack/chore/v8-changeset-sdk-6983…
AakashHotchandani Jul 29, 2026
761a926
Version Packages
github-actions[bot] Jul 29, 2026
149644c
ci(v8): port the changeset-from-pr generator to the v8 branch
AakashHotchandani Jul 29, 2026
d97c37f
Merge pull request #113 from browserstack/ci/port-changeset-generator…
AakashHotchandani Jul 29, 2026
c7d505a
Merge pull request #112 from browserstack/changeset-release/v8
hamza-browserstack Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .changeset/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Changesets

This repo uses [Changesets](https://github.com/changesets/changesets) to version and publish
**`@wdio/browserstack-service`** on BrowserStack's own cadence (independent of WebdriverIO's
release schedule).

- Add a changeset for any user-facing change: `npm run changeset` (pick patch/minor/major).
- On merge to `main` (the v9 line) or `v8` (the v8 line), the Release workflow opens a
"Version Packages" PR; merging that PR publishes to npm via OIDC trusted publishing.
- The gRPC/protobuf client is generated inline from the bundled `.proto` files at build time
(`buf generate`) — it is no longer a separate workspace package, so `config.json` `ignore` is
empty and there is nothing extra for this pipeline to skip.
11 changes: 11 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"access": "public",
"baseBranch": "v8",
"updateInternalDependencies": "patch",
"ignore": []
}
33 changes: 33 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
## What is this about?
<!-- Give a small description related to the changes you have made -->

## Related Jira task/s
<!-- Add associated JIRA links -->

## Release (mandatory for every PR — required for the `ready-for-review` label)
<!-- CI gates the `ready-for-review` label on the **version bump** and the **internal release notes** below. Customer-facing notes + type are optional but strongly encouraged for the daily release. -->

**Version bump:** *(required — tick exactly one)*
<!-- minor = ANY new feature/capability (backwards-compatible). patch = bug fix or trivial change only. New features mislabeled as patch is the common mistake — when unsure, choose minor. -->
- [ ] minor (backwards-compatible feature)
- [ ] patch (bug fix or other small change)

**Release notes type:** *(optional)*
- [ ] New Feature
- [ ] Bug Fix
- [ ] Other Improvement

**Release notes (customer-facing):** *(optional but encouraged)*
<!-- 1-3 bullets in customer language, e.g. "Fixed test results not being reported when using the CLI." -->
-

**Release notes (internal):** *(required — engineer-facing; what actually changed / why)*
<!-- REQUIRED: at least one non-empty bullet — the ready-for-review gate checks this. Dev-facing notes for the internal CHANGELOG.md (non-customer-facing). -->
-

## Checklist
- [ ] Ready to review
- [ ] Has it been tested locally?

## PR Validations
Run Tests: Comment RUN_TESTS to trigger sanity tests.
102 changes: 102 additions & 0 deletions .github/workflows/changeset-from-pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
name: Changeset from PR template

# Auto-generates the changeset for a PR from its "## Release" section (the same
# section the ready-for-review gate enforces), so engineers never hand-run
# `npx changeset`. Reads the ticked version bump (minor/patch) + the release notes
# and commits `.changeset/pr-<number>.md` to the PR branch. Idempotent: re-runs on
# every body edit and only commits when the derived changeset actually changes, so
# the bot's own push (which re-fires `synchronize`) settles in one no-op pass.
#
# Scope: skips forks (no write token — they add a changeset manually), the
# changesets "Version Packages" PR (head `changeset-release/*`), and PRs labelled
# `skip-changeset` (CI/docs/chore). The ready-for-review gate still independently
# REQUIRES the bump + internal notes; this workflow only GENERATES when they're valid.

on:
pull_request:
types: [opened, edited, synchronize, reopened, labeled, unlabeled]

concurrency:
group: changeset-from-pr-${{ github.event.pull_request.number }}
cancel-in-progress: true

permissions:
contents: write

jobs:
generate:
if: >-
github.event.pull_request.state == 'open' &&
github.event.pull_request.head.repo.full_name == github.repository &&
!startsWith(github.event.pull_request.head.ref, 'changeset-release/') &&
!contains(github.event.pull_request.labels.*.name, 'skip-changeset')
runs-on: ubuntu-latest
steps:
- name: Derive + commit the changeset from the Release section
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
script: |
const PKG = '@wdio/browserstack-service';
const pr = context.payload.pull_request;
const body = pr.body || '';
const head = pr.head.ref;

// --- isolate the "## Release" block (mirrors ready-for-review-label.yml) ---
const releaseBlock = body.split(/(?=^## )/m)
.find(s => /^##[ \t]*Release[ \t]*(\(|$)/m.test(s)) || '';
if (!releaseBlock) {
core.info('No "## Release" section in the PR body — the ready-for-review gate flags this. Skipping changeset generation.');
return;
}

// Count bump ticks only BEFORE the first "Release notes (" header, so a
// checkbox-looking bullet inside the notes can never be mistaken for a bump.
const bumpRegion = releaseBlock.split(/^\*\*Release notes \(/m)[0];
const bumps = [...bumpRegion.matchAll(/- \[[xX]\]\s*(minor|patch)(?=\s|\(|$)/g)].map(m => m[1].toLowerCase());
if (bumps.length !== 1) {
core.info(`Expected exactly one version-bump tick (minor|patch), found ${bumps.length}. Skipping (ready-for-review gate flags this).`);
return;
}
const bump = bumps[0];

// Extract non-empty bullets under a "**Release notes (<label>):**" header,
// stopping at the next bold header; strip the header-line remainder + HTML comments.
const extractNotes = (label) => {
const parts = releaseBlock.split(new RegExp('^\\*\\*Release notes \\(' + label + '\\):\\*\\*', 'm'));
if (parts.length < 2) return '';
const region = parts[1].replace(/^[^\n]*\n?/, '').split(/^\*\*/m)[0].replace(/<!--[\s\S]*?-->/g, '');
return region.split('\n').map(l => l.trim())
.filter(l => /^[-*]\s+\S/.test(l))
.map(l => l.replace(/^[-*]\s+/, '- '))
.join('\n');
};
// Public CHANGELOG prefers the customer-facing notes; fall back to the
// (required) internal notes, then the PR title as a last resort.
const summary = extractNotes('customer-facing') || extractNotes('internal') || `- ${pr.title}`;

const content = `---\n"${PKG}": ${bump}\n---\n\n${summary}\n`;
const filePath = `.changeset/pr-${pr.number}.md`;

// Idempotent: only write when the derived changeset differs from what's on the branch.
let sha;
try {
const cur = await github.rest.repos.getContent({ ...context.repo, path: filePath, ref: head });
sha = cur.data.sha;
const existing = Buffer.from(cur.data.content, 'base64').toString('utf8');
if (existing === content) {
core.info('Changeset already up to date — no commit.');
return;
}
} catch (e) {
if (e.status !== 404) throw e; // 404 = file not yet present
}

await github.rest.repos.createOrUpdateFileContents({
...context.repo,
path: filePath,
branch: head,
message: `chore(changeset): auto-generate from PR template (${bump})`,
content: Buffer.from(content).toString('base64'),
...(sha ? { sha } : {}),
});
core.notice(`Wrote ${filePath} — bump: ${bump}\n${summary}`);
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: CI

on:
pull_request:
push:
branches:
- main
- v8

permissions:
contents: read

jobs:
build-test:
name: Build & test (node ${{ matrix.node-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: ['18.20', '20', '22']
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

- name: Install
run: npm ci

- name: Build
run: npm run build

- name: Test
run: npm test
Loading
Loading