Skip to content
Merged

test #33

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
52396b2
chore(browser): extract network interceptor script (#2042)
jackwener Jun 30, 2026
01022d9
chore(daemon): read status through transport layer (#2040)
jackwener Jun 30, 2026
b3695a2
chore(browser): share bind command handling (#2043)
jackwener Jun 30, 2026
5d2e87a
test(slock): cover trimmed task status filters (#2041)
hiSandog Jun 30, 2026
244ec45
fix(core): stop silently swallowing pipeline context + daemon WS erro…
jackwener Jun 30, 2026
d174f72
feat(adapter): add Mercury reimbursement helpers (#2052)
iynewz Jun 30, 2026
9a4e11d
fix(extension): honor persisted remaining idle lifetime on reconcile …
jackwener Jun 30, 2026
1f8b09b
fix(extension): preserve network capture across ensureAttached re-att…
jackwener Jun 30, 2026
215a73d
feat(gemini): add model and thinking selection (#2044)
bailob Jun 30, 2026
0a90179
fix(extension): cdp network-capture + frame-eval robustness (#1984)
jackwener Jun 30, 2026
e7bdad4
Fix ChatGPT intelligence level selection (#2022)
lavapapa Jun 30, 2026
d6a7011
Add ChatGPT Deep Research result extraction (#2023)
lavapapa Jun 30, 2026
23cf6e5
fix(browser): end-to-end command deadlines, safe transport retries, C…
jackwener Jul 3, 2026
bab0409
refactor(transport): exactly-once command transport β€” journal, waiter…
jackwener Jul 3, 2026
96cbeb4
docs: align adapter contribution example with the JavaScript adapter …
yixin-1024 Jul 3, 2026
928b1e5
feat(hltv): add HLTV adapters (#2028)
CrazysCodes Jul 3, 2026
08d50d9
fix(cli): tolerate OPENCLI_DAEMON_PORT when it equals the default por…
jackwener Jul 3, 2026
18dce78
fix(external): run Windows .cmd shims through the shell; non-zero exi…
jackwener Jul 3, 2026
9387cd9
fix(browser): stale default profile must not veto live connections (#…
jackwener Jul 3, 2026
338dc79
test(e2e): stabilize headed Chrome gate
jackwener Jul 3, 2026
63db56d
fix(weibo): resolve uid before the full auth probe to avoid HTTP 400 …
LeoLin990405 Jul 3, 2026
f7ad36b
ci(e2e): pin macOS headed runner
jackwener Jul 3, 2026
1db7b5f
fix(twitter): match localized delete menu and poll for late-hydrating…
LeoLin990405 Jul 3, 2026
8de1184
test(e2e): treat mac AX bridge startup as optional
jackwener Jul 3, 2026
cad35e7
chore(release): bump version to 1.8.6
jackwener Jul 3, 2026
67344d5
test(e2e): run AX smoke headless on all platforms; add daemon transpo…
jackwener Jul 3, 2026
6129bb3
ci(e2e): place each gate where its runner can run it deterministicall…
jackwener Jul 3, 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
4 changes: 3 additions & 1 deletion .github/actions/setup-chrome/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ runs:
uses: browser-actions/setup-chrome@v2
id: setup-chrome
with:
chrome-version: latest
# Stable Chrome for Testing keeps headed E2E on a released browser.
# `latest` pulls Chromium snapshots, which can break extension startup.
chrome-version: stable

- name: Verify Chrome installation
shell: bash
Expand Down
43 changes: 31 additions & 12 deletions .github/workflows/e2e-headed.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,15 @@ jobs:
strategy:
fail-fast: false
matrix:
# NOTE: Windows excluded β€” browser-actions/setup-chrome hangs during
# Chrome MSI installation on Windows runners (known issue).
os: [ubuntu-latest, macos-latest]
# Gate placement by what each runner can run deterministically:
# - the real-browser extension smoke needs a Chrome that reliably runs
# an MV3 extension, which only Linux+xvfb provides on hosted runners
# (headed macOS crashes on Mach port rendezvous outside an Aqua
# session; headless does not connect the extension SW there);
# - the daemon transport contracts need no browser and run blocking on
# every OS, so macOS/Windows get a real gate, not a skipped one.
# macOS pinned to 15 while the macOS 26 image stabilizes.
os: [ubuntu-latest, macos-15, windows-latest]
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
Expand All @@ -49,7 +55,11 @@ jobs:
- name: Install dependencies
run: npm ci

# Linux runs the extension smoke and macOS runs the full real-site e2e
# suite; both need a real Chrome. Windows runs only the browser-free
# transport gate, and the setup-chrome action hangs on Windows anyway.
- name: Setup Chrome
if: runner.os != 'Windows'
uses: ./.github/actions/setup-chrome
id: setup-chrome

Expand All @@ -59,21 +69,28 @@ jobs:
- name: Build extension
run: npm run build --prefix extension

- name: Run AX Chrome smoke (Linux, via xvfb)
# Real-browser extension smoke: Linux under xvfb is the one hosted
# environment where a real Chrome reliably starts an MV3 extension, so
# this is the release-blocking browser gate. Headed (not headless):
# headless does not connect the extension service worker on hosted
# runners. See the matrix comment for why macOS/Windows don't run it.
- name: Run AX Chrome smoke (Linux, real extension via xvfb)
if: runner.os == 'Linux'
env:
CHROME_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
OPENCLI_AX_E2E: '1'
OPENCLI_E2E_HEADED: '1'
run: |
xvfb-run --auto-servernum --server-args="-screen 0 1280x720x24" \
npx vitest run --project e2e tests/e2e/browser-ax-chrome.test.ts --reporter=verbose

- name: Run AX Chrome smoke (macOS / Windows)
if: runner.os != 'Linux'
env:
CHROME_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
OPENCLI_AX_E2E: '1'
run: npx vitest run --project e2e tests/e2e/browser-ax-chrome.test.ts --reporter=verbose
# Transport contract E2E: real daemon process + scripted fake extension.
# Pins the cross-layer contracts (waiter attach, deadline 408, dispatched
# disconnect, profile fallback, graceful shutdown) end to end with the
# actual daemon binary β€” no browser required, so this is the blocking
# gate on EVERY OS, including macOS and Windows.
- name: Run daemon transport contract E2E
run: npx vitest run --project e2e-fixed-port tests/e2e/daemon-transport.test.ts --reporter=verbose

- name: Run E2E tests (Linux, via xvfb)
if: runner.os == 'Linux'
Expand All @@ -83,8 +100,10 @@ jobs:
xvfb-run --auto-servernum --server-args="-screen 0 1280x720x24" \
npx vitest run tests/e2e/ --reporter=verbose

- name: Run E2E tests (macOS / Windows)
if: runner.os != 'Linux'
# Real-site adapter e2e stays on Linux/macOS; Windows runs the two
# deterministic gates above (unit coverage in ci.yml already spans it).
- name: Run E2E tests (macOS)
if: runner.os == 'macOS'
env:
OPENCLI_AX_E2E: '0'
run: npx vitest run tests/e2e/ --reporter=verbose
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Each Chrome profile runs its own OpenCLI extension instance. If you use multiple
opencli profile list
opencli profile rename <contextId> work
opencli profile use work
opencli --profile work browser state
opencli --profile work browser main state
```

With only one connected profile, OpenCLI uses it automatically. With multiple connected profiles and no default, OpenCLI asks you to choose instead of guessing.
Expand Down Expand Up @@ -188,6 +188,7 @@ When the site you need is not yet covered, use the `opencli-adapter-author` skil
| **bilibili** | `hot` `search` `history` `feed` `ranking` `download` `comments` `dynamic` `favorite` `following` `follow` `unfollow` `me` `subtitle` `summary` `video` `user-videos` |
| **zhihu** | `hot` `search` `question` `download` `follow` `like` `favorite` `comment` `answer` |
| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` |
| **hltv** | `search` `player-summary` `player-matches` `player-form` `player-map-pool` `player-vs-team` `player-teammate-impact` `player-duel` `match-map` `match-series` `team-matches` `team-map-pool` `event-matches` |
| **geogebra** | `eval` `add-point` `add-line` `add-circle` `add-polygon` `triangle` `hexagon` `list` `info` |
| **linkedin** | `connect` `inbox` `job-detail` `jobs-preferences` `post-analytics` `posts` `profile-experience` `profile-projects` `profile-read` `profile-analytics` `safe-send` `search` `services-read` `sent-invitations` `thread-snapshot` `timeline` `salesnav-search` `salesnav-inbox` `salesnav-message` `salesnav-thread` |
| **reddit** | `hot` `frontpage` `popular` `search` `subreddit` `read` `user` `user-posts` `user-comments` `upvote` `upvoted` `save` `saved` `comment` `subscribe` |
Expand Down
1 change: 1 addition & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ Agent εœ¨ε†…ιƒ¨θ‡ͺεŠ¨ε€„η†ζ‰€ζœ‰ `opencli browser` 命什——你εͺιœ€η”¨θ‡ͺ
| **bilibili** | `hot` `search` `me` `favorite` `history` `feed` `subtitle` `summary` `video` `comments` `dynamic` `ranking` `following` `follow` `unfollow` `user-videos` `download` |
| **zhihu** | `hot` `search` `question` `download` `follow` `like` `favorite` `comment` `answer` |
| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` |
| **hltv** | `search` `player-summary` `player-matches` `player-form` `player-map-pool` `player-vs-team` `player-teammate-impact` `player-duel` `match-map` `match-series` `team-matches` `team-map-pool` `event-matches` |
| **geogebra** | `eval` `add-point` `add-line` `add-circle` `add-polygon` `triangle` `hexagon` `list` `info` |
| **linkedin** | `connect` `inbox` `job-detail` `jobs-preferences` `post-analytics` `posts` `profile-experience` `profile-projects` `profile-read` `profile-analytics` `safe-send` `search` `people-search` `services-read` `sent-invitations` `thread-snapshot` `timeline` `salesnav-search` `salesnav-inbox` `salesnav-message` `salesnav-thread` |
| **reddit** | `hot` `frontpage` `popular` `search` `subreddit` `read` `user` `user-posts` `user-comments` `upvote` `save` `comment` `subscribe` `saved` `upvoted` |
Expand Down
Loading
Loading