Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
181 commits
Select commit Hold shift + click to select a range
6be26be
fix(privacy): fail closed for masked screenshots
unadlib Jul 10, 2026
1b36dd0
fix(privacy): reject network bodies without MIME
unadlib Jul 10, 2026
e8282a0
fix(extension): package store-safe Chrome releases
unadlib Jul 10, 2026
3c8df4b
fix(privacy): hide IndexedDB names in counts-only mode
unadlib Jul 10, 2026
8663a17
fix(privacy): sanitize editable keydown capture
unadlib Jul 10, 2026
b564aab
fix(sdk): surface capture queue failures
unadlib Jul 10, 2026
4ed5ef4
fix: enforce archive export encryption policy
unadlib Jul 10, 2026
342b83f
fix(share): reject invalid API key scopes
unadlib Jul 10, 2026
a301d5f
fix(share): isolate audit sink failures
unadlib Jul 10, 2026
f0ccdb8
fix(protocol): validate event payloads in batches
unadlib Jul 10, 2026
82eacb8
fix(player): escape generated Playwright code
unadlib Jul 10, 2026
e1f4c1f
fix(privacy): redact structured response body values
unadlib Jul 10, 2026
86dfa58
fix(player): send share query keys as headers
unadlib Jul 10, 2026
e89d83d
fix(player): make latest archive load win
unadlib Jul 10, 2026
01bc38b
fix(player): keep share API keys in memory
unadlib Jul 10, 2026
4e2e1b8
fix(player): include captured bodies in HAR
unadlib Jul 10, 2026
17644bf
fix: enforce encrypted local pipeline storage
unadlib Jul 10, 2026
18ba733
fix(bench): exercise filtered export hot path
unadlib Jul 10, 2026
9c87bb1
fix(extension): sync storage test dependency lock
unadlib Jul 10, 2026
eaa1550
fix(deps): update MCP SDK and gate production audit
unadlib Jul 10, 2026
f69b17a
fix(packages): include licenses in published tarballs
unadlib Jul 10, 2026
baf5e19
fix(build): include every workspace in root tsconfig
unadlib Jul 10, 2026
4bb5c16
docs(protocol): align event catalog with schema
unadlib Jul 10, 2026
e64a700
fix(player): validate archive security invariants
unadlib Jul 10, 2026
a932b97
ci(security): pin third-party actions by commit
unadlib Jul 10, 2026
4c84c74
ci(release): pin trusted publishing npm version
unadlib Jul 10, 2026
42c8769
fix(extension): enforce capture scope boundaries
unadlib Jul 10, 2026
57ba5dc
ci(release): verify immutable tagged release sources
unadlib Jul 10, 2026
d810206
fix(player): verify exact Pages deployment commit
unadlib Jul 10, 2026
9a45b91
fix(packages): rebuild artifacts before packing
unadlib Jul 10, 2026
08c789b
ci(lint): check workspace automation scripts
unadlib Jul 10, 2026
b5ed290
fix(pipeline): serialize chunk finalization
unadlib Jul 10, 2026
ae848d1
fix(extension): make E2E scripts cross-platform
unadlib Jul 10, 2026
fa76ad6
fix(extension): bound untrusted page-world messages
unadlib Jul 10, 2026
f0ce9b1
ci(coverage): gate every published runtime
unadlib Jul 10, 2026
45831e1
fix(dev-deps): eliminate high-risk toolchain advisories
unadlib Jul 10, 2026
9fd9c96
fix(pipeline): make IndexedDB blob refs atomic
unadlib Jul 10, 2026
a2431cf
fix(player): require secure share server URLs
unadlib Jul 10, 2026
3e77ee3
fix(extension): recover MV3 sessions across restarts
unadlib Jul 10, 2026
e29c6fb
fix(tooling): pin local executable entrypoints
unadlib Jul 10, 2026
e201f0d
fix(privacy): reject full-mode bodies without MIME
unadlib Jul 10, 2026
cfb97b6
fix(extension): validate runtime message ingress
unadlib Jul 10, 2026
3764f95
fix(player): shell-quote generated curl methods
unadlib Jul 10, 2026
77f8920
fix(extension): restore crash-consistent pipeline state
unadlib Jul 10, 2026
7797830
fix(player): bound archive resource consumption
unadlib Jul 10, 2026
d06ca8b
fix(share): pin canonical public origin
unadlib Jul 10, 2026
43be79d
fix(mcp): bound filesystem scans and tool output
unadlib Jul 10, 2026
06a8852
fix(player): reject ambiguous ZIP entry names
unadlib Jul 10, 2026
b31c271
fix(share): scan full private entries for plaintext
unadlib Jul 10, 2026
b772187
fix(share): bind and label client privacy claims
unadlib Jul 10, 2026
b30c1eb
fix(share): bind persisted records to safe identities
unadlib Jul 10, 2026
3c5d675
fix(share): bound record capacity and list pages
unadlib Jul 10, 2026
38bbbe1
fix(share): make storage commits crash consistent
unadlib Jul 10, 2026
4c13b10
fix(share): complete bounded audit lifecycle
unadlib Jul 10, 2026
116e75f
fix(share): constrain forwarded client trust
unadlib Jul 10, 2026
cb0b2e0
ci(docs): enforce generated API reference drift
unadlib Jul 10, 2026
cd76e50
fix(pipeline): bound crash recovery checkpoints
unadlib Jul 10, 2026
ef2dd72
fix(share): build direct runtime dependencies
unadlib Jul 10, 2026
c15ac6b
ci(bundle): gate every shipped JavaScript surface
unadlib Jul 10, 2026
bbf41b1
fix(share): preserve records above admission limit
unadlib Jul 10, 2026
9fb0c08
fix(share): correct capacity recovery guidance
unadlib Jul 10, 2026
eb04cab
fix(share): verify persisted archive integrity
unadlib Jul 10, 2026
3a6ca2f
fix(share): validate retention timestamp bounds
unadlib Jul 10, 2026
a9e7f89
fix(share): validate query bootstrap targets
unadlib Jul 10, 2026
7aee9d8
fix(share): strictly normalize persisted summaries
unadlib Jul 10, 2026
03c2fae
fix(share): require credentials on loopback by default
unadlib Jul 10, 2026
47ee0bc
fix(share): reserve concurrent upload capacity
unadlib Jul 10, 2026
8ca4291
fix(share): drain audits during graceful shutdown
unadlib Jul 10, 2026
a57d82d
fix(share): canonicalize proxy IP addresses
unadlib Jul 10, 2026
977fd05
fix(share): require explicit trusted proxies
unadlib Jul 10, 2026
595be99
fix(share): bound audit write backpressure
unadlib Jul 10, 2026
fc3fe18
fix(share): migrate legacy storage permissions
unadlib Jul 10, 2026
4f90e32
fix(share): bound indexed listing pagination
unadlib Jul 10, 2026
47d3512
fix(deps): patch Hono static middleware bypass
unadlib Jul 10, 2026
f2446da
fix(share): reconcile audit logs at startup
unadlib Jul 10, 2026
9be6c99
fix(dev-deps): upgrade vulnerable Turborepo
unadlib Jul 10, 2026
7e696c5
fix(dev-deps): patch esbuild path traversal
unadlib Jul 10, 2026
e8a4810
fix(dev-deps): patch PostCSS style injection
unadlib Jul 10, 2026
ffa898f
fix(dev-deps): patch AJV regex denial of service
unadlib Jul 10, 2026
b082244
fix(dev-deps): patch brace expansion exhaustion
unadlib Jul 10, 2026
41e66ca
fix(dev-deps): patch YAML nesting exhaustion
unadlib Jul 10, 2026
0795736
fix(dev-deps): patch JS-YAML merge exhaustion
unadlib Jul 10, 2026
ce26d30
fix(tooling): pin Turbo platform binaries
unadlib Jul 10, 2026
c532655
fix(share): enforce a single data writer
unadlib Jul 10, 2026
caa4354
fix(release): version all surfaces in lockstep
unadlib Jul 10, 2026
2d2ea14
fix(share): protect audit client hashes with HMAC
unadlib Jul 10, 2026
643e240
fix(release): verify private surface versions
unadlib Jul 10, 2026
54f4f35
ci(bundle): rebaseline hardened Share runtime
unadlib Jul 10, 2026
7493dbb
fix(lite): gate body persistence by capture policy
unadlib Jul 10, 2026
a585de6
fix(lite): enforce tab-bound capture scope
unadlib Jul 10, 2026
1f1f48a
fix(player): reject ambiguous ZIP logical names
unadlib Jul 10, 2026
0655ff9
fix(recorder): enforce WebSocket payload policy
unadlib Jul 10, 2026
0e6c50f
fix(extension): recover offscreen recorder ports
unadlib Jul 10, 2026
879d6ae
fix(share): drain physical audit writes
unadlib Jul 10, 2026
e4fdcad
fix(player): bound archive input buffering
unadlib Jul 10, 2026
43e4054
fix(extension): authorize recorder reconnects
unadlib Jul 10, 2026
c6b865b
fix(share): prune retained expirations before hashing
unadlib Jul 10, 2026
46dfbaf
docs(release): document lockstep versioning
unadlib Jul 10, 2026
4998143
fix(tooling): make browser E2E cross-platform
unadlib Jul 10, 2026
2fb0855
fix(release): enforce stable version formats
unadlib Jul 10, 2026
3ab2ce6
fix(share): bind uploads to archive storage
unadlib Jul 10, 2026
bd86bb4
fix(extension): persist stop intent before teardown
unadlib Jul 10, 2026
e974427
fix(share): release upload admission before audit
unadlib Jul 10, 2026
3d4ae67
fix(extension): await authoritative recorder recovery
unadlib Jul 10, 2026
66adf19
fix(share): bound storage lock shutdown
unadlib Jul 10, 2026
888e735
fix(release): serialize stable deployments
unadlib Jul 10, 2026
0bf078f
fix(player): scrub auto-share credentials from URL
unadlib Jul 10, 2026
5d6b63a
fix(release): verify packed npm artifacts
unadlib Jul 10, 2026
1dc0070
fix(release): retain queued stable deployments
unadlib Jul 10, 2026
34b9fa9
fix(release): reject superseded stable tags
unadlib Jul 10, 2026
8a37f1f
fix(mcp): bound HAR export resources
unadlib Jul 10, 2026
0c227bb
fix(player): bind curl replay URLs as values
unadlib Jul 10, 2026
cf71b29
docs(api): sync player SDK reference
unadlib Jul 10, 2026
a6feba1
fix(extension): close capture before stop persistence
unadlib Jul 10, 2026
411c771
fix(release): bind assets to verified commit
unadlib Jul 10, 2026
b6504be
fix(player): keep playback fixture archive valid
unadlib Jul 10, 2026
9d19db7
fix(tooling): launch Windows package shims safely
unadlib Jul 10, 2026
14438af
fix(extension): bind content capture to tab scope
unadlib Jul 10, 2026
d44ff67
test(extension): await capture target readiness
unadlib Jul 10, 2026
7f5ec59
test(extension): load unpacked builds in branded Chrome
unadlib Jul 10, 2026
289c571
test(extension): read versioned runtime checkpoints
unadlib Jul 10, 2026
b6d7f5b
test(extension): stop capture through popup control
unadlib Jul 10, 2026
977bc21
test(extension): ignore retained stop tombstones
unadlib Jul 10, 2026
5785a4d
test(extension): encrypt smoke test exports
unadlib Jul 10, 2026
2858bd3
test(e2e): force terminate unresponsive children
unadlib Jul 10, 2026
05b155c
fix(pipeline): canonicalize delayed event timelines
unadlib Jul 10, 2026
fd33a48
fix(recorder): reject pre-action event links
unadlib Jul 10, 2026
aa6ef85
fix(extension): separate network event clocks
unadlib Jul 10, 2026
d17ef82
fix(recorder): bound root cause history by event time
unadlib Jul 10, 2026
d9205c5
fix(protocol): reject regressing archive timelines
unadlib Jul 10, 2026
21bf64b
fix(extension): preserve final lite capture artifacts
unadlib Jul 10, 2026
14cfe70
test(extension): route e2e controls through authorized surfaces
unadlib Jul 10, 2026
0c8a320
fix(extension): make offscreen ingest retries idempotent
unadlib Jul 11, 2026
7358f9c
fix(extension): bind subframes to exact documents
unadlib Jul 11, 2026
b794233
fix(extension): preserve screen stop retry results
unadlib Jul 11, 2026
e86a3d9
fix(extension): require primed cdp artifact scope
unadlib Jul 11, 2026
bd3bd10
fix(extension): avoid replaying ambiguous exports
unadlib Jul 11, 2026
987f533
fix(injected): keep duplicate bootstrap inert
unadlib Jul 11, 2026
9aed541
fix(content): make document bootstrap singleton
unadlib Jul 11, 2026
63911fb
fix(extension): enforce manifest permission allowlists
unadlib Jul 11, 2026
07ef403
fix(extension): discard partial runtime restores
unadlib Jul 11, 2026
b6cc30c
fix(extension): preflight runtime capture capabilities
unadlib Jul 11, 2026
1a08be2
fix(extension): make session starts atomic
unadlib Jul 11, 2026
60f0719
fix(extension): hide unsupported capture controls
unadlib Jul 11, 2026
540e4d9
fix(extension): bind lite navigation to exact documents
unadlib Jul 11, 2026
3a48496
fix(extension): describe lite coverage by capability
unadlib Jul 11, 2026
eff3360
fix(extension): skip main-world hooks in full mode
unadlib Jul 11, 2026
91c8006
fix(extension): retain document identity across port disconnects
unadlib Jul 11, 2026
04d63cd
fix(extension): fail closed on root injection errors
unadlib Jul 11, 2026
145a1b1
fix(extension): fail closed on root cdp bootstrap
unadlib Jul 11, 2026
65ca2d5
fix(extension): fence top navigation work by revision
unadlib Jul 11, 2026
15941fd
fix(extension): keep active restores provisional
unadlib Jul 11, 2026
e2a582e
fix(extension): require exact oopif readiness
unadlib Jul 11, 2026
f062078
fix(extension): bind runtime-owned stops
unadlib Jul 11, 2026
aa208b9
fix(extension): drop unreachable store tab capture permission
unadlib Jul 11, 2026
df20a9b
fix(pipeline): persist content delivery receipts
unadlib Jul 11, 2026
06a4cec
fix(pipeline): rebind surviving session metadata
unadlib Jul 11, 2026
754736f
test(share-server): await readiness audit before sink fault
unadlib Jul 11, 2026
9b70388
fix(webblackbox): add recoverable direct capture control
unadlib Jul 11, 2026
55cf893
fix(protocol): close archive privacy validation gaps
unadlib Jul 11, 2026
5424f12
fix(pipeline): bound streaming privacy analysis
unadlib Jul 11, 2026
d58428f
fix(player-sdk): fail closed on unverified archive content
unadlib Jul 11, 2026
e249e9e
fix(share-server): attest bounded archive privacy
unadlib Jul 11, 2026
16eb543
refactor(extension): add exact lifecycle primitives
unadlib Jul 11, 2026
6b480da
fix(extension): detach navigation recovery lanes
unadlib Jul 11, 2026
d2d94de
refactor(extension): support durable delivery operations
unadlib Jul 11, 2026
976f9c1
fix(extension): integrate exact capture lifecycle
unadlib Jul 11, 2026
5261516
build(extension): enforce reproducible closed packages
unadlib Jul 11, 2026
ba31ee9
docs: align capture and sharing security guidance
unadlib Jul 11, 2026
d8fd631
perf(extension): keep content validation lightweight
unadlib Jul 11, 2026
6d6eba0
perf(protocol): make zod schemas tree-shakeable
unadlib Jul 11, 2026
1b5b0bd
perf(extension): localize content markers natively
unadlib Jul 11, 2026
6606d95
build: recalibrate reviewed bundle budgets
unadlib Jul 11, 2026
041ffc0
test(extension): verify encrypted archive evidence
unadlib Jul 11, 2026
b3cfda9
chore(release): stage 0.7.0 changesets
unadlib Jul 11, 2026
452e781
fix(extension): preserve full capture across SPA navigation
unadlib Jul 11, 2026
f3bb41f
test(extension): exercise an in-scope iframe target
unadlib Jul 11, 2026
a36b200
fix(extension): capture scoped worker target network
unadlib Jul 11, 2026
e5ca4d1
test(extension): exercise store-safe activeTab capture
unadlib Jul 11, 2026
3df8af9
fix(ci): migrate dependency audit to pnpm 11
unadlib Jul 16, 2026
40b60d5
Version Packages
github-actions[bot] Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
23 changes: 20 additions & 3 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
"$schema": "https://unpkg.com/@changesets/config@3.1.4/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"fixed": [
[
"@webblackbox/cdp-router",
"@webblackbox/extension",
"@webblackbox/mcp-server",
"@webblackbox/pipeline",
"@webblackbox/player",
"@webblackbox/player-sdk",
"@webblackbox/protocol",
"@webblackbox/recorder",
"@webblackbox/share-server",
"webblackbox"
]
],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": []
"ignore": [],
"privatePackages": {
"version": true,
"tag": false
}
}
8 changes: 4 additions & 4 deletions .github/workflows/changesets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0

- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: pnpm
Expand All @@ -36,7 +36,7 @@ jobs:
run: pnpm install --frozen-lockfile

- name: Create or update version PR
uses: changesets/action@v1
uses: changesets/action@a45c4d594aa4e2c509dc14a9f2b3b67ba3780d0d # v1.9.0
with:
version: pnpm version-packages
title: Version Packages
Expand Down
22 changes: 14 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,23 @@ jobs:
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Dependency audit
run: pnpm audit --audit-level=high

- name: Format Check
run: pnpm format:check

Expand All @@ -39,14 +42,17 @@ jobs:
- name: Typecheck
run: pnpm typecheck

- name: API Documentation Drift Check
run: pnpm docs:api:check

- name: Test
run: pnpm test

- name: Benchmark Regression Gate
run: pnpm bench:ci

- name: Upload Benchmark Report
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always()
with:
name: benchmark-report
Expand Down Expand Up @@ -94,13 +100,13 @@ jobs:
needsChrome: true
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: pnpm
Expand All @@ -109,7 +115,7 @@ jobs:
if: ${{ matrix.needsChrome }}
timeout-minutes: 5
id: setup-chrome
uses: browser-actions/setup-chrome@v2
uses: browser-actions/setup-chrome@2e1d749697dd1612b833dba4a722266286fbefcd # v2.1.2
with:
chrome-version: stable
install-dependencies: true
Expand Down
89 changes: 76 additions & 13 deletions .github/workflows/release-assets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,100 @@ on:
required: true
type: string

permissions:
contents: write
permissions: {}

concurrency:
group: release-assets-stable
queue: max
cancel-in-progress: false

jobs:
chrome-extension:
verify-release:
runs-on: ubuntu-latest
outputs:
verified_sha: ${{ steps.verified_source.outputs.sha }}
permissions:
actions: read
contents: read
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}
steps:
- name: Checkout released ref
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}

- name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22

- name: Verify immutable release source
run: |
git fetch --force --tags origin main:refs/remotes/origin/main
node scripts/verify-release-ref.mjs "$RELEASE_TAG" origin/main

- name: Verify successful CI for release commit
env:
GH_TOKEN: ${{ github.token }}
run: |
release_sha=$(git rev-parse HEAD)
successful_runs=$(gh run list \
--repo "$GITHUB_REPOSITORY" \
--workflow ci.yml \
--commit "$release_sha" \
--branch main \
--event push \
--status success \
--limit 1 \
--json databaseId \
--jq 'length')
if [ "$successful_runs" -ne 1 ]; then
echo "No successful CI workflow found for $release_sha." >&2
exit 1
fi

- name: Export verified release commit
id: verified_source
run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"

chrome-extension:
runs-on: ubuntu-latest
needs: verify-release
permissions:
contents: write
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}
steps:
- name: Checkout verified release commit
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
ref: ${{ needs.verify-release.outputs.verified_sha }}

- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Package Chrome extension
- name: Package and verify store-safe Chrome extension
run: pnpm --filter @webblackbox/extension package:chrome

- name: Resolve Chrome extension archive
id: archive
run: |
archive_path=$(ls -t apps/extension/dist/*-chrome.zip | head -n 1)
archive_path=$(find apps/extension/dist -maxdepth 1 -type f \
-name 'webblackbox-*-chrome.zip' \
! -name '*-enterprise-chrome.zip' \
-print | head -n 1)
if [ -z "$archive_path" ]; then
echo "Could not find packaged Chrome extension archive." >&2
exit 1
Expand Down Expand Up @@ -76,21 +136,24 @@ jobs:

player-pages:
runs-on: ubuntu-latest
needs: verify-release
permissions:
contents: write
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}
PLAYER_SITE_URL: https://webllm.github.io/webblackbox/
steps:
- name: Checkout released ref
uses: actions/checkout@v4
- name: Checkout verified release commit
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}
ref: ${{ needs.verify-release.outputs.verified_sha }}

- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: pnpm
Expand Down
74 changes: 54 additions & 20 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,59 +6,93 @@ on:
- published
workflow_dispatch:
inputs:
ref:
description: Git ref, tag, or SHA to publish from (defaults to the selected branch/ref)
required: false
tag:
description: Exact semantic version tag to publish (for example v1.2.3)
required: true
type: string

permissions:
actions: read
contents: read
id-token: write

concurrency:
group: release-${{ github.event_name == 'workflow_dispatch' && (inputs.ref || github.ref) || github.event.release.tag_name }}
group: release-stable-publish
queue: max
cancel-in-progress: false

jobs:
publish:
runs-on: ubuntu-latest
timeout-minutes: 20
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
ref: ${{ github.event_name == 'workflow_dispatch' && (inputs.ref || github.ref) || github.event.release.tag_name }}
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.event.release.tag_name }}

- name: Verify immutable release source
run: |
git fetch --force --tags origin main:refs/remotes/origin/main
node scripts/verify-release-ref.mjs "$RELEASE_TAG" origin/main

- name: Verify successful CI for release commit
env:
GH_TOKEN: ${{ github.token }}
run: |
release_sha=$(git rev-parse HEAD)
successful_runs=$(gh run list \
--repo "$GITHUB_REPOSITORY" \
--workflow ci.yml \
--commit "$release_sha" \
--branch main \
--event push \
--status success \
--limit 1 \
--json databaseId \
--jq 'length')
if [ "$successful_runs" -ne 1 ]; then
echo "No successful CI workflow found for $release_sha." >&2
exit 1
fi

- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 24
registry-url: https://registry.npmjs.org

- name: Ensure npm supports trusted publishing
run: npm install -g npm@latest
run: npm install -g npm@12.0.0

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Production dependency audit
run: pnpm audit --prod --audit-level=high

- name: Verify source quality
run: |
pnpm format:check
pnpm lint
pnpm typecheck
pnpm docs:api:check
pnpm test

- name: Build workspace
run: pnpm build

- name: Verify bundle budgets
run: pnpm bundle:size

- name: Verify publish artifacts
run: >
pnpm
--filter @webblackbox/mcp-server
--filter @webblackbox/cdp-router
--filter @webblackbox/pipeline
--filter @webblackbox/player-sdk
--filter @webblackbox/protocol
--filter @webblackbox/recorder
--filter webblackbox
exec npm pack --dry-run --json
run: pnpm release:verify-artifacts

- name: Publish packages to npm
env:
Expand All @@ -71,5 +105,5 @@ jobs:
echo "## NPM Publish Triggered"
echo ""
echo "- Source: \`${{ github.event_name }}\`"
echo "- Ref: \`${{ github.event_name == 'workflow_dispatch' && (inputs.ref || github.ref) || github.event.release.tag_name }}\`"
echo "- Ref: \`$RELEASE_TAG\`"
} >> "$GITHUB_STEP_SUMMARY"
3 changes: 0 additions & 3 deletions .npmrc

This file was deleted.

Loading
Loading