Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
703fc64
feat(packages): add dsh-plugin-browserskill — DeepSeek Harness tools …
BB-fat Aug 13, 2026
2de7c5c
fix(dsh-plugin-browserskill): enforce the session cap before spawning
BB-fat Aug 13, 2026
54869ca
fix(dsh-plugin-browserskill): include the bsk error hint in the throw…
BB-fat Aug 13, 2026
0771292
fix(dsh-plugin-browserskill): keep the terminal result card for multi…
BB-fat Aug 13, 2026
6b96fcc
feat(dsh-plugin-browserskill): add the web client half with a browser…
BB-fat Aug 14, 2026
afdc398
fix(dsh-plugin-browserskill): strict session ownership on a shared da…
BB-fat Aug 14, 2026
3d050e0
feat(dsh-plugin-browserskill): strict ownership boundary — foreign se…
BB-fat Aug 14, 2026
a7bc8ba
feat(dsh-plugin-browserskill): host-side ObservationService for the P…
BB-fat Aug 14, 2026
24faa10
feat(dsh-plugin-browserskill): observation overlay — floating card, i…
BB-fat Aug 14, 2026
ce89e95
feat(dsh-plugin-browserskill): multi-session strip, focus pin, and ed…
BB-fat Aug 14, 2026
2955260
fix(dsh-plugin-browserskill): register observation routes once webSer…
BB-fat Aug 14, 2026
bc5d961
fix(dsh-plugin-browserskill): serialize per-session commands (observa…
BB-fat Aug 14, 2026
461d204
fix(dsh-plugin-browserskill): serve observation thumbnails over the p…
BB-fat Aug 14, 2026
e2d0757
fix(dsh-plugin-browserskill): prefix routes register without a traili…
BB-fat Aug 14, 2026
dde707b
fix(dsh-plugin-browserskill): report interrupt-killed commands as int…
BB-fat Aug 14, 2026
916229d
docs(dsh-plugin-browserskill): README section for the observation ove…
BB-fat Aug 14, 2026
47070fd
feat(dsh-plugin-browserskill): default the overlay to the top-right +…
BB-fat Aug 14, 2026
b07b8fe
fix(dsh-plugin-browserskill): dock below the shell top bar
BB-fat Aug 14, 2026
eb71ddc
docs(dsh-plugin-browserskill): note the top-right docking and shell-n…
BB-fat Aug 14, 2026
d1001e1
feat(dsh-plugin-browserskill): reskin the overlay with BrowserSkill's…
BB-fat Aug 14, 2026
52aa356
test(dsh-plugin-browserskill): build the scoped css before vitest
BB-fat Aug 14, 2026
a4e6685
fix(dsh-plugin-browserskill): address review findings (leaks, trust f…
BB-fat Aug 14, 2026
4d1dcd1
feat(dsh-plugin-browserskill): publish the BSK skill through ctx.skills
BB-fat Aug 14, 2026
ce11325
feat(dsh-plugin-browserskill): reveal tool schemas only after skill i…
BB-fat Aug 14, 2026
43ebfab
fix(dsh-plugin-browserskill): register the lazy suite from any fiber
BB-fat Aug 14, 2026
51df868
chore(dsh-plugin-browserskill): prepare the package for npm publishing
BB-fat Aug 14, 2026
51085b9
fix(browser-skill): route DSH usage through injected tools
BB-fat Aug 17, 2026
9854ee2
fix(dsh-plugin-browserskill): stop observation overlay from flashing …
BB-fat Aug 17, 2026
3fb9e9f
fix(dsh-plugin-browserskill): compact overlay toolbar and four-corner…
BB-fat Aug 17, 2026
e7aad9b
style(dsh-plugin-browserskill): wrap lines to satisfy biome
BB-fat Aug 17, 2026
14c5884
style(dsh-plugin-browserskill): fix overlay CSS stylelint errors
BB-fat Aug 17, 2026
edb1496
ci: publish the dsh plugin to npm as @wxg-prc-cpg/browser-skill-dsh-p…
BB-fat Aug 17, 2026
8bae851
docs: add DeepSeek Harness plugin section to the README
BB-fat Aug 18, 2026
fea66ce
fix(dsh-plugin-browserskill): send JSON content-type on overlay inter…
BB-fat Aug 18, 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
105 changes: 105 additions & 0 deletions .github/workflows/release-dsh-plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: Release dsh plugin

on:
push:
tags:
- dsh-plugin-v*
workflow_dispatch:

permissions:
contents: read

concurrency:
group: release-dsh-plugin-${{ github.ref }}
cancel-in-progress: false

env:
PACKAGE_NAME: "@wxg-prc-cpg/browser-skill-dsh-plugin"
PACKAGE_DIR: packages/dsh-plugin-browserskill

jobs:
resolve:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
steps:
- uses: actions/checkout@v6

- name: Resolve plugin version
id: version
shell: bash
run: |
set -euo pipefail
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
VERSION="$(node -p "require('./${{ env.PACKAGE_DIR }}/package.json').version")"
else
VERSION="${GITHUB_REF_NAME#dsh-plugin-v}"
fi
VERSION="${VERSION#v}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "tag=dsh-plugin-v${VERSION}" >> "$GITHUB_OUTPUT"

guard:
needs: resolve
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Verify tag matches package.json name and version
shell: bash
run: |
set -euo pipefail
PKG_NAME="$(node -p "require('./${{ env.PACKAGE_DIR }}/package.json').name")"
PKG_VERSION="$(node -p "require('./${{ env.PACKAGE_DIR }}/package.json').version")"
RELEASE_VERSION="${{ needs.resolve.outputs.version }}"
if [ "$PKG_NAME" != "$PACKAGE_NAME" ]; then
echo "package.json name (${PKG_NAME}) does not match expected ${PACKAGE_NAME}"
exit 1
fi
if [ "$PKG_VERSION" != "$RELEASE_VERSION" ]; then
echo "${PACKAGE_DIR}/package.json version (${PKG_VERSION}) does not match release version (${RELEASE_VERSION})"
exit 1
fi
echo "Version guard passed: ${PKG_NAME}@${RELEASE_VERSION}"

publish:
needs: [resolve, guard]
runs-on: ubuntu-latest
# Secret NPM_TOKEN is stored on the GitHub Environment also named NPM_TOKEN.
environment: NPM_TOKEN
permissions:
contents: read
steps:
- uses: actions/checkout@v6

- uses: pnpm/action-setup@v6

- uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
registry-url: https://registry.npmjs.org
scope: "@wxg-prc-cpg"

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

- name: Typecheck plugin
run: pnpm --filter "${{ env.PACKAGE_NAME }}" typecheck

- name: Test plugin
run: pnpm --filter "${{ env.PACKAGE_NAME }}" test

- name: Publish to npm
working-directory: ${{ env.PACKAGE_DIR }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
set -euo pipefail
if [ -z "${NODE_AUTH_TOKEN:-}" ]; then
echo "::error::Environment secret NPM_TOKEN is not configured"
exit 1
fi
pnpm publish --access public --no-git-checks
echo "Published ${PACKAGE_NAME}@${{ needs.resolve.outputs.version }}"
3 changes: 3 additions & 0 deletions .stylelintignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@
**/.output/**
**/target/**
**/node_modules/**
# Generated client CSS (tailwind compile output); built by
# packages/dsh-plugin-browserskill/scripts/build-client-css.mjs.
**/dsh-plugin-browserskill/src/client/bsk-ui.nomodule.css
20 changes: 17 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
</p>

**BrowserSkill** connects Cursor, Claude Code, Codex, OpenClaw, CodeBuddy,
WorkBuddy, Pi, Hermes Agent, and other shell-capable AI agents to your already logged-in
WorkBuddy, Pi, Hermes Agent, DeepSeek Harness, and other AI agents to your already logged-in
browser.

Need the agent to touch a tab you already have open? It must borrow that tab
Expand Down Expand Up @@ -123,7 +123,8 @@ internal variants and install paths.

Other shell-capable agent harnesses are supported too. Copy
[`skill/SKILL.md`](skill/SKILL.md) into your harness's skills directory as
`browser-skill/SKILL.md` to install the skill manually.
`browser-skill/SKILL.md` to install the skill manually. DeepSeek Harness uses a
dedicated plugin instead — see [DeepSeek Harness plugin](#deepseek-harness-plugin).

</details>

Expand All @@ -133,6 +134,16 @@ Start a new Agent session and write a prompt that needs the browser, for example
/browser-skill open example.com and summarize what is on the page.
```

## DeepSeek Harness plugin

A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) plugin that
injects native `browser_*` tools (no shelling out to `bsk`) and a live Web UI
overlay of each Agent Window.

```sh
dsh plugin --profile web add @wxg-prc-cpg/browser-skill-dsh-plugin
```

## How It Works

BrowserSkill is a local bridge between your agent harness and your browser.
Expand Down Expand Up @@ -166,7 +177,9 @@ flowchart TB

The agent never talks to the browser directly. It asks the `bsk` CLI to perform a
browser task; the local daemon routes that request to the extension; the
extension runs it in an Agent Window.
extension runs it in an Agent Window. DeepSeek Harness takes the same path
through the [plugin](#deepseek-harness-plugin): the agent calls injected
`browser_*` tools, and the plugin invokes `bsk` on its behalf.

## For Developers

Expand All @@ -176,6 +189,7 @@ The repository is a Cargo + pnpm workspace:
- `crates/bsk-protocol` — shared wire types and JSON schemas
- `apps/extension` — browser extension
- `packages/ui` and `packages/i18n` — shared extension UI support
- `packages/dsh-plugin-browserskill` — DeepSeek Harness plugin (`@wxg-prc-cpg/browser-skill-dsh-plugin`)

## License

Expand Down
15 changes: 12 additions & 3 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<a href="README.md">English</a> · 中文
</p>

**BrowserSkill** 把 Cursor、Claude Code、Codex、OpenClaw、CodeBuddy、WorkBuddy、Pi、Hermes Agent 等支持 Shell 的 AI Agent 连接到你已登录的浏览器。
**BrowserSkill** 把 Cursor、Claude Code、Codex、OpenClaw、CodeBuddy、WorkBuddy、Pi、Hermes Agent、DeepSeek Harness 等 AI Agent 连接到你已登录的浏览器。

需要 Agent 操作你已打开的标签页?必须显式借用该标签,任务结束后归还,其余浏览器窗口不受影响。

Expand Down Expand Up @@ -102,7 +102,7 @@ bsk install-skill

用 <kbd>Space</kbd> 选择需要安装的 Agent harness,然后按 <kbd>Enter</kbd> 安装 skill。运行 `bsk install-skill --list` 可查看 internal 变体及安装路径。

其他支持 Shell 的 Agent harness 也可使用 BrowserSkill,但需手动将 [`skill/SKILL.md`](skill/SKILL.md) 复制到对应 skills 目录下的 `browser-skill/SKILL.md`。
其他支持 Shell 的 Agent harness 也可使用 BrowserSkill,但需手动将 [`skill/SKILL.md`](skill/SKILL.md) 复制到对应 skills 目录下的 `browser-skill/SKILL.md`。DeepSeek Harness 走独立插件,见 [DeepSeek Harness 插件](#deepseek-harness-插件)。

</details>

Expand All @@ -112,6 +112,14 @@ bsk install-skill
/browser-skill open example.com and summarize what is on the page.
```

## DeepSeek Harness 插件

[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 插件:注入原生 `browser_*` 工具(无需再通过 Shell 调用 `bsk`),并在 Web UI 中实时观察每个 Agent Window。

```sh
dsh plugin --profile web add @wxg-prc-cpg/browser-skill-dsh-plugin
```

## 工作原理

BrowserSkill 是 Agent 运行时与浏览器之间的本地桥接层。
Expand Down Expand Up @@ -143,7 +151,7 @@ flowchart TB
style UserWindows fill:#f8fafc,stroke:#cbd5e1,color:#334155
```

Agent 不直接与浏览器通信。它通过 `bsk` CLI 下发浏览器任务;本地 daemon 把请求路由到扩展;扩展在 Agent Window 中执行。
Agent 不直接与浏览器通信。它通过 `bsk` CLI 下发浏览器任务;本地 daemon 把请求路由到扩展;扩展在 Agent Window 中执行。DeepSeek Harness 走同一条链路,只是经由 [插件](#deepseek-harness-插件):Agent 调用注入的 `browser_*` 工具,由插件代为执行 `bsk`。

## 面向开发者

Expand All @@ -153,6 +161,7 @@ Agent 不直接与浏览器通信。它通过 `bsk` CLI 下发浏览器任务;
- `crates/bsk-protocol` — 共享协议类型与 JSON Schema
- `apps/extension` — 浏览器扩展
- `packages/ui` 和 `packages/i18n` — 扩展 UI 共享支持
- `packages/dsh-plugin-browserskill` — DeepSeek Harness 插件(`@wxg-prc-cpg/browser-skill-dsh-plugin`)

## 许可证

Expand Down
5 changes: 5 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@
"**",
"!**/node_modules/**",
"!**/dist/**",
"!packages/dsh-plugin-browserskill/lib/**",
"!packages/dsh-plugin-browserskill/src/skill-content.generated.ts",
"!packages/dsh-plugin-browserskill/src/client/bsk-ui.nomodule.css",
"!packages/dsh-plugin-browserskill/.bsk-ui.raw.css",
"!packages/dsh-plugin-browserskill/.bsk-ui.input.css",
"!**/target/**",
"!**/.wxt/**",
"!**/.output/**",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"ext:dev": "pnpm --filter @browser-skill/extension dev",
"ext:test": "pnpm --filter @browser-skill/extension test",
"vom:test": "pnpm --filter @browser-skill/vom test",
"lint": "biome check . && stylelint \"**/*.css\"",
"lint": "biome check . && stylelint \"**/*.css\" && pnpm --filter @wxg-prc-cpg/browser-skill-dsh-plugin typecheck && pnpm --filter @wxg-prc-cpg/browser-skill-dsh-plugin test",
"format": "biome format --write ."
},
"devDependencies": {
Expand Down
5 changes: 5 additions & 0 deletions packages/dsh-plugin-browserskill/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
lib/
src/client/bsk-ui.nomodule.css
.bsk-ui.input.css
.bsk-ui.raw.css
src/skill-content.generated.ts
21 changes: 21 additions & 0 deletions packages/dsh-plugin-browserskill/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Tencent

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading