From 6873dfb79487d41d8618b946e6a41c341e32ef17 Mon Sep 17 00:00:00 2001 From: HarveySang <277645525+HarveySang@users.noreply.github.com> Date: Wed, 26 Aug 2026 22:33:58 +0800 Subject: [PATCH 1/2] feat: publish DeepSeek Harness plugin install path --- .../deepseek-harness-plugin-release.yml | 159 ++++++++++++++++++ README.ja-JP.md | 50 +++++- README.md | 50 +++++- README.zh-CN.md | 50 +++++- deepseek-harness-plugin/README.md | 14 +- deepseek-harness-plugin/README.zh.md | 14 +- deepseek-harness-plugin/SOURCE.md | 6 +- .../docs/install-for-beginners.zh.md | 2 +- .../deepseek-harness-plugin-integration.md | 25 ++- deepseek-harness-plugin/package.json | 11 +- deepseek-harness-plugin/pnpm-lock.yaml | 8 +- .../skills/opengui-coremate-install/SKILL.md | 2 +- .../scripts/install-macos.sh | 7 +- .../src/client/CorematePromotionCard.tsx | 2 +- deepseek-harness-plugin/tests/bundle.spec.ts | 11 +- .../tests/install-skill.spec.ts | 9 +- 16 files changed, 367 insertions(+), 53 deletions(-) create mode 100644 .github/workflows/deepseek-harness-plugin-release.yml diff --git a/.github/workflows/deepseek-harness-plugin-release.yml b/.github/workflows/deepseek-harness-plugin-release.yml new file mode 100644 index 0000000..840f82a --- /dev/null +++ b/.github/workflows/deepseek-harness-plugin-release.yml @@ -0,0 +1,159 @@ +name: DeepSeek Harness Plugin Release + +on: + push: + tags: + - 'dsh-coremate-mobile-v*' + +permissions: + contents: read + +concurrency: + group: dsh-plugin-release-${{ github.ref }} + cancel-in-progress: false + +jobs: + build: + if: github.actor == 'gofenix' + runs-on: ubuntu-latest + defaults: + run: + working-directory: deepseek-harness-plugin + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Verify release source and version + shell: bash + run: | + git fetch --no-tags origin main + git merge-base --is-ancestor "$GITHUB_SHA" origin/main + node --input-type=module <<'NODE' + import { readFileSync } from 'node:fs' + + const pkg = JSON.parse(readFileSync('package.json', 'utf8')) + const expectedTag = `dsh-coremate-mobile-v${pkg.version}` + if (expectedTag !== process.env.GITHUB_REF_NAME) { + throw new Error(`tag ${process.env.GITHUB_REF_NAME} does not match ${expectedTag}`) + } + const installer = readFileSync('skills/opengui-coremate-install/scripts/install-macos.sh', 'utf8') + const skill = readFileSync('skills/opengui-coremate-install/SKILL.md', 'utf8') + const agent = readFileSync('skills/opengui-coremate-install/agents/openai.yaml', 'utf8') + if (!installer.includes(`release_version="${pkg.version}"`)) throw new Error('installer version is out of sync') + if (!skill.includes(`OpenGUI v${pkg.version} release`)) throw new Error('Skill version is out of sync') + if (!agent.includes(`OpenGUI v${pkg.version}`)) throw new Error('Skill agent version is out of sync') + NODE + + - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 + with: + version: 11.19.0 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: 22.19.0 + cache: pnpm + cache-dependency-path: deepseek-harness-plugin/pnpm-lock.yaml + + - run: pnpm install --frozen-lockfile + - run: pnpm run check + + - name: Pack and verify the only release artifact + shell: bash + run: | + rm -rf release-assets + mkdir release-assets + archive="dsh-coremate-mobile-$(node -p "require('./package.json').version").tgz" + npm pack --pack-destination release-assets + test -f "release-assets/$archive" + test "$(find release-assets -maxdepth 1 -type f | wc -l | tr -d ' ')" = 1 + tar -tzf "release-assets/$archive" > "$RUNNER_TEMP/archive-files.txt" + tar -tvzf "release-assets/$archive" > "$RUNNER_TEMP/archive-verbose.txt" + grep -Fx 'package/lib/index.js' "$RUNNER_TEMP/archive-files.txt" + grep -Fx 'package/cordis.patch.yml' "$RUNNER_TEMP/archive-files.txt" + grep -Fx 'package/assets/platform-tools/win32-x64/adb.exe' "$RUNNER_TEMP/archive-files.txt" + grep -Fx 'package/assets/platform-tools/win32-x64/AdbWinApi.dll' "$RUNNER_TEMP/archive-files.txt" + grep -Fx 'package/assets/platform-tools/win32-x64/AdbWinUsbApi.dll' "$RUNNER_TEMP/archive-files.txt" + grep -E '^-rwxr-xr-x .* package/assets/platform-tools/darwin/adb$' "$RUNNER_TEMP/archive-verbose.txt" + grep -E '^-rwxr-xr-x .* package/assets/platform-tools/linux-x64/adb$' "$RUNNER_TEMP/archive-verbose.txt" + ( + cd release-assets + sha256sum "$archive" > "$archive.sha256" + ) + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: dsh-coremate-mobile-release-assets + path: deepseek-harness-plugin/release-assets/ + if-no-files-found: error + retention-days: 7 + + publish: + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: dsh-coremate-mobile-release-assets + path: release-assets + + - name: Create or finish the public GitHub Release + shell: bash + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} + run: | + version="${GITHUB_REF_NAME#dsh-coremate-mobile-v}" + archive="dsh-coremate-mobile-${version}.tgz" + checksum="${archive}.sha256" + test -f "release-assets/$archive" + test -f "release-assets/$checksum" + test "$(find release-assets -maxdepth 1 -type f | wc -l | tr -d ' ')" = 2 + + tag_type="$(gh api "repos/${GH_REPO}/git/ref/tags/${GITHUB_REF_NAME}" --jq .object.type)" + tag_sha="$(gh api "repos/${GH_REPO}/git/ref/tags/${GITHUB_REF_NAME}" --jq .object.sha)" + if [[ "$tag_type" == tag ]]; then + tag_sha="$(gh api "repos/${GH_REPO}/git/tags/${tag_sha}" --jq .object.sha)" + fi + [[ "$tag_sha" == "$GITHUB_SHA" ]] + + if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then + draft="$(gh api "repos/${GH_REPO}/releases/tags/${GITHUB_REF_NAME}" --jq .draft)" + if [[ "$draft" != true ]]; then + assets="$(gh release view "$GITHUB_REF_NAME" --json assets --jq '.assets[].name' | sort)" + expected="$(printf '%s\n%s\n' "$archive" "$checksum" | sort)" + [[ "$assets" == "$expected" ]] + mkdir "$RUNNER_TEMP/published-assets" + gh release download "$GITHUB_REF_NAME" \ + --pattern "$archive" \ + --pattern "$checksum" \ + --dir "$RUNNER_TEMP/published-assets" + cmp "release-assets/$archive" "$RUNNER_TEMP/published-assets/$archive" + cmp "release-assets/$checksum" "$RUNNER_TEMP/published-assets/$checksum" + exit 0 + fi + else + notes="$RUNNER_TEMP/dsh-release-notes.md" + cat > "$notes" <

+ DeepSeek Harnessプラグインをインストール Claude または Codex でブートストラップ マルチロールオペレーターシステム 最大12時間のタスク @@ -22,6 +23,11 @@ OpenGUI は、AI エージェントが実機上の Android アプリ UI を見て、理解し、操作できるようにします。

+

+ 推奨:DeepSeek HarnessでOpenGUIを直接使えます。
+ Codexに1つのプロンプトを送るだけで、検証済みプラグインのダウンロード、DSHへのインストール、DSHの起動まで進みます。バックエンド一式のデプロイは不要です。 +

+ ## Demo

@@ -30,9 +36,44 @@ OpenGUI は実際の Android アプリ UI を読み取り、次のステップを計画し、モバイル操作を実行して、構造化された結果を返します。 -## Quick Start +## DeepSeek HarnessでOpenGUIを使う + +macOSでは、固定バージョンのインストーラーSkillをCodexに実行させる方法が最短です。Node.js 22.19以降または24以降が必要で、互換性のあるDSHバージョンは自動的にインストールされます。次の内容を1つのプロンプトとして送信します: + +```text +Install and run the OpenGUI installer Skill from https://github.com/Core-Mate/OpenGUI/tree/dsh-coremate-mobile-v0.1.5/deepseek-harness-plugin/skills/opengui-coremate-install for my DSH web profile. Only ask me for phone-side authorization and model credentials. +``` + +Skillは公開ReleaseのパッケージとチェックサムをダウンロードしてSHA-256を検証し、OpenGUIプラグインだけをインストールします。必要な場合はDSHを起動して開き、既存のプラグインと設定は保持します。DSHがすでに起動していた場合は、一度再起動するとプラグインが読み込まれます。LinuxまたはWindowsでは、[手動パッケージガイド](./deepseek-harness-plugin/README.md#1-download-the-release-package)を使用してください。 + +インストール後、DSHでワークスペースを追加または選択し、認証済みのAndroidスマートフォンを接続して選択してから、次を送信します: + +```text +@OpenGUI Open Settings and report the Android version +``` + +このプラグインは、OpenGUIバックエンド一式を必要とせず、DSHにスマートフォンとブラウザの操作機能を追加します。[ユースケース](./deepseek-harness-plugin/docs/use-cases.md)を確認するか、[v0.1.5リリースパッケージ](https://github.com/Core-Mate/OpenGUI/releases/tag/dsh-coremate-mobile-v0.1.5)をダウンロードできます。 + +主なユースケース: -OpenGUI を最も早く試す方法は、Claude Code または Codex にブートストラップを任せることです。 +- 許可されたデバイスでのUI自動操作テストと回帰テスト +- 投稿、メッセージ送信、アカウント変更の前に人が確認するソーシャルメディア管理とリード調査 +- アカウント所有者とゲームのルールが自動化を認めている場合の反復的なゲームテストとゲーム内ワークフロー + +GUI操作向けの現在の推奨順: + +| 優先度 | モデルファミリー | ガイダンス | +|---|---|---| +| 1 | Doubao VLM | ビジュアルGUI操作の第一候補です。 | +| 2 | Qwen VLM | 実用的な代替候補ですが、一部のソーシャルメディア向けプロンプトは安全ポリシーの影響を受けやすい場合があります。 | +| 3 | OpenAIのビジョン対応モデル | 利用できますが、スクリーンショットを多用するタスクでは一般にコストが高くなります。 | +| 4 | Grokのビジョン対応モデル | 現時点では実験的な選択肢です。ツール利用と操作の安定性には、さらに検証が必要です。 | + +モデルの提供状況、料金、ポリシーは、バージョンや地域によって異なります。どのプロバイダーを選ぶ場合も、画像入力とツール呼び出しの両方に対応したモデルが必要です。 + +## OpenGUIスタック一式を実行する + +OpenGUIのバックエンドとAndroidクライアント一式を実行する場合は、Claude CodeまたはCodexにブートストラップを任せることができます。 ```text Read ./skills/open-gui-bootstrap/SKILL.md and help me run OpenGUI. Only ask me for phone-side actions. @@ -146,6 +187,7 @@ OpenGUI は、明示的なオーケストレーションレイヤーを持つモ - 実行リカバリーと失敗レポートを改善する。 - Android GUI Agent の信頼性 benchmark タスクを追加する。 - モデル設定とコスト削減プロファイルのドキュメントを拡充する。 +- OpenGUIの技術スタック一式を自分で運用したくないチーム向けに、ホスト型OpenGUI Agentサービスを提供する。 ## OpenGUI の使い方 @@ -298,6 +340,10 @@ flowchart LR ## コミュニティ / サポート +[OpenGUI Discordコミュニティ](https://discord.gg/pqHHw7XgJ3)では、GUIエージェント技術、実際のユースケース、リリース情報について話し合えます。確認済みのWeChatコミュニティへの参加方法は、準備ができ次第ここで公開します。 + +ホスト型OpenGUI Agentサービスの開始後、コミュニティメンバーはAgentのトライアルクレジットを申請できるようになります。提供数、申請条件、有効期間はサービス開始時に案内します。 + 特に有用なプロジェクトフィードバック: - バグや機能リクエストの Issue を作成する diff --git a/README.md b/README.md index 4d47272..fb4a0cb 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@

+ Install the DeepSeek Harness plugin Bootstrap with Claude or Codex Multi-role operator system Tasks up to 12 hours @@ -23,6 +24,11 @@ OpenGUI helps AI agents see, understand, and operate Android app interfaces on real devices.

+

+ Recommended: use OpenGUI directly in DeepSeek Harness.
+ Paste one prompt into Codex. It downloads the verified plugin, installs it into DSH, and opens DSH. No full backend deployment is required. +

+ ## Demo

@@ -31,9 +37,44 @@ OpenGUI reads a real Android app UI, plans the next step, takes mobile actions, and returns structured results. -## Quick Start +## Use OpenGUI in DeepSeek Harness + +The shortest path on macOS is to let Codex run the pinned installer Skill. It requires Node.js 22.19+ or 24+ and installs the compatible DSH version automatically. Paste this as one prompt: + +```text +Install and run the OpenGUI installer Skill from https://github.com/Core-Mate/OpenGUI/tree/dsh-coremate-mobile-v0.1.5/deepseek-harness-plugin/skills/opengui-coremate-install for my DSH web profile. Only ask me for phone-side authorization and model credentials. +``` + +The Skill downloads the public release package and checksum, verifies SHA-256, installs only the OpenGUI plugin, starts DSH when needed, and opens DSH. It preserves unrelated DSH plugins and settings. If DSH was already running, restart it once to load the plugin. For Linux or Windows, use the [manual package guide](./deepseek-harness-plugin/README.md#1-download-the-release-package). + +After installation, add or select a DSH workspace, connect and select an authorized Android phone, then send: + +```text +@OpenGUI Open Settings and report the Android version +``` + +The plugin adds phone and browser operation to DSH without requiring the full OpenGUI backend stack. See more [use cases](./deepseek-harness-plugin/docs/use-cases.md) or download the [v0.1.5 release package](https://github.com/Core-Mate/OpenGUI/releases/tag/dsh-coremate-mobile-v0.1.5). + +Good fits include: -The fastest way to try OpenGUI is to let Claude Code or Codex bootstrap it for you. +- automated UI operation and regression testing on authorized devices +- social media management and lead research, with human confirmation before publishing, messaging, or account changes +- repetitive game testing and in-game workflows where the account owner and game rules permit automation + +For GUI execution, our current recommendation order is: + +| Priority | Model family | Guidance | +|---|---|---| +| 1 | Doubao VLM | Recommended first for visual GUI execution. | +| 2 | Qwen VLM | A practical alternative, but some social media prompts may be more sensitive to model safety policies. | +| 3 | OpenAI vision-capable models | Capable, but generally the higher-cost option for screenshot-heavy tasks. | +| 4 | Grok vision-capable models | Experimental for this workflow; tool use and action reliability still need more validation. | + +Model availability, pricing, and policy behavior vary by version and region. Whichever provider you choose, the model must support both image input and tool calling. + +## Run the Full OpenGUI Stack + +To run the full OpenGUI backend and Android client, let Claude Code or Codex bootstrap it for you. ```text Read ./skills/open-gui-bootstrap/SKILL.md and help me run OpenGUI. Only ask me for phone-side actions. @@ -149,6 +190,7 @@ The source code currently exposes these pieces: - Improve execution recovery and failure reporting. - Add benchmark tasks for Android GUI agent reliability. - Expand docs for model configuration and cost-saving profiles. +- Launch a hosted OpenGUI Agent service for teams that want GUI operation without running the full stack themselves. ## How to Use OpenGUI @@ -300,6 +342,10 @@ flowchart LR ## Community / Support +Join the [OpenGUI Discord community](https://discord.gg/pqHHw7XgJ3) to discuss GUI agent development, share real use cases, and get release updates. A verified WeChat community entry will be published here when it is ready. + +Community members will also be able to apply for trial Agent credits when the hosted OpenGUI Agent service opens. Availability, eligibility, and validity will be announced with the service. + The most useful project feedback is: - open issues for bugs and feature requests diff --git a/README.zh-CN.md b/README.zh-CN.md index ffc7a2c..b10951b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -7,6 +7,7 @@

+ 安装 DeepSeek Harness 插件 Bootstrap with Claude or Codex Multi-role operator system Tasks up to 12 hours @@ -22,6 +23,11 @@ OpenGUI 让 AI Agent 能够看懂、理解并操作真实 Android 设备上的 App 界面。

+

+ 推荐:直接在 DeepSeek Harness 中使用 OpenGUI。
+ 只需把一段话发给 Codex,它会下载并校验插件、安装到 DSH,再打开 DSH,不需要先部署完整后端。 +

+ ## Demo

@@ -30,9 +36,44 @@ OpenGUI 会读取真实 Android App 界面,规划下一步操作,执行移动端动作,并返回结构化结果。 -## Quick Start +## 在 DeepSeek Harness 中使用 OpenGUI + +macOS 上最短的路径,是让 Codex 运行固定版本的安装 Skill。环境需要 Node.js 22.19+ 或 24+,兼容的 DSH 版本会自动安装。把下面整段作为一条消息发给 Codex: + +```text +请安装并运行这个 OpenGUI 安装 Skill:https://github.com/Core-Mate/OpenGUI/tree/dsh-coremate-mobile-v0.1.5/deepseek-harness-plugin/skills/opengui-coremate-install,把插件安装到我的 DSH web profile。只在需要手机端授权或模型凭据时询问我。 +``` + +Skill 会下载公开 Release 的插件包和校验文件,验证 SHA-256,只安装 OpenGUI 插件,在需要时启动并打开 DSH,同时保留其他 DSH 插件和设置。如果 DSH 原本正在运行,重启一次即可加载插件。Linux 或 Windows 用户可按[手动安装说明](./deepseek-harness-plugin/README.zh.md#1-下载发布包)操作。 + +安装完成后,在 DSH 中添加或选择工作区,连接并选择已授权的 Android 手机,然后发送: + +```text +@OpenGUI 打开设置并报告 Android 版本 +``` + +插件可以直接为 DSH 增加手机与浏览器操作能力,不需要部署完整的 OpenGUI 后端。你还可以查看更多[使用场景](./deepseek-harness-plugin/docs/use-cases.zh.md),或下载 [v0.1.5 安装包](https://github.com/Core-Mate/OpenGUI/releases/tag/dsh-coremate-mobile-v0.1.5)。 + +适合的使用场景包括: -最快的试用方式,是让 Claude Code 或 Codex 帮你完成启动。 +- 在已授权设备上执行自动化操作测试和回归测试 +- 管理社媒账号和挖掘线索,在发布、私信或修改账号前由人工确认 +- 在账号所有者和游戏规则允许自动化的前提下,执行重复性游戏测试和游戏内流程 + +针对 GUI 操作,我们目前的模型推荐顺序是: + +| 优先级 | 模型系列 | 使用建议 | +|---|---|---| +| 1 | 豆包 VLM | 视觉 GUI 操作的首选。 | +| 2 | 千问 VLM | 可作为备选,但部分社媒任务更容易受到模型安全策略限制。 | +| 3 | OpenAI 视觉模型 | 能力可用,但截图密集型任务的成本通常更高。 | +| 4 | Grok 视觉模型 | 目前作为实验选项,工具调用和操作稳定性还需要更多验证。 | + +具体模型的可用性、价格和策略会随版本及地区变化。无论选择哪家模型,都需要同时支持图片输入和工具调用。 + +## 运行完整 OpenGUI 技术栈 + +如果要运行完整的 OpenGUI 后端和 Android 客户端,可以让 Claude Code 或 Codex 帮你完成启动。 ```text Read ./skills/open-gui-bootstrap/SKILL.md and help me run OpenGUI. Only ask me for phone-side actions. @@ -147,6 +188,7 @@ OpenGUI 采用的是一套分层清晰的移动 operator system。 - 提升执行恢复和失败反馈能力。 - 增加 Android GUI Agent 可靠性 benchmark 任务。 - 完善模型配置和省钱混用方案文档。 +- 推出托管版 OpenGUI Agent 服务,让不想自行部署完整技术栈的团队也能使用 GUI 操作能力。 ## 怎么使用 OpenGUI @@ -298,6 +340,10 @@ flowchart LR ## 社区 / 支持 +欢迎加入 [OpenGUI Discord 社区](https://discord.gg/pqHHw7XgJ3),讨论 GUI Agent 技术方向、分享真实使用场景并获取版本动态。经过验证的微信群入口准备好后,也会在这里公开。 + +托管版 OpenGUI Agent 服务开放后,社区成员还可以申请 Agent 体验额度。具体名额、领取条件和有效期将随服务一同公布。 + 最有价值的项目反馈包括: - 提交 bug 和 feature request diff --git a/deepseek-harness-plugin/README.md b/deepseek-harness-plugin/README.md index cac51a3..ff25aa5 100644 --- a/deepseek-harness-plugin/README.md +++ b/deepseek-harness-plugin/README.md @@ -25,13 +25,13 @@ The examples use the `web` profile and the default `$DSH_HOME=~/.dsh`. Substitut ### macOS: install with the Codex Skill -Ask Codex to install the repository skill from `skills/opengui-coremate-install`, then invoke `$opengui-coremate-install`. The Skill downloads and verifies the pinned `v0.1.5` package from the public Release, preserves the rest of the `web` profile, and starts DSH only when it is not already running. GitHub login is not required. +Ask Codex to install the repository skill from [`deepseek-harness-plugin/skills/opengui-coremate-install`](./skills/opengui-coremate-install), then invoke `$opengui-coremate-install`. The Skill downloads and verifies the pinned `v0.1.5` package from the public OpenGUI Release, preserves the rest of the `web` profile, and starts DSH only when it is not already running. GitHub login is not required. If DSH is already listening on port 3080, the installer leaves that process untouched and reports that a manual restart is required. The manual package flow below remains available on every supported host. ### 1. Download the release package -Download these files from [GitHub Releases](https://github.com/Core-Mate/Coremate-Mobile-Plugin/releases): +Download these files from the [public OpenGUI Release](https://github.com/Core-Mate/OpenGUI/releases/tag/dsh-coremate-mobile-v0.1.5): - `dsh-coremate-mobile-0.1.5.tgz` - `dsh-coremate-mobile-0.1.5.tgz.sha256` @@ -227,15 +227,17 @@ For profile-specific isolation, you can instead add this to `$DSH_HOME/profiles/ This is an advanced option: a profile patch replaces the target row's entire `config`, and a matching section in `$DSH_HOME/settings.yaml` still has higher precedence. Never put the API key in the patch. -## Install from Git (development) +## Install from a source checkout (development) -Production installations should pin a release tag or commit SHA instead of following the movable `main` branch: +Production installations should use the prebuilt release package above. For development, clone the public OpenGUI release tag and install the plugin directory: ```sh -dsh plugin --profile web add 'git+https://github.com/Core-Mate/Coremate-Mobile-Plugin.git#v0.1.5' +git clone --branch dsh-coremate-mobile-v0.1.5 --depth 1 https://github.com/Core-Mate/OpenGUI.git +cd OpenGUI/deepseek-harness-plugin +dsh plugin --profile web add "$(pwd)" ``` -The public repository can be fetched without GitHub authentication. Git installation runs the package's `prepare` build, so the profile allowlist must also contain `dsh-coremate-mobile: true`. Only grant installation-script permission to reviewed, pinned source. See the [developer integration and verification record](docs/research/deepseek-harness-plugin-integration.md) for the full semantics. +The public repository can be fetched without GitHub authentication. Source installation runs the package's `prepare` build, so the profile allowlist must also contain `dsh-coremate-mobile: true`. Only grant installation-script permission to reviewed, pinned source. See the [developer integration and verification record](docs/research/deepseek-harness-plugin-integration.md) for the full semantics. ```yaml allowBuilds: diff --git a/deepseek-harness-plugin/README.zh.md b/deepseek-harness-plugin/README.zh.md index c9e72b8..ad33ffb 100644 --- a/deepseek-harness-plugin/README.zh.md +++ b/deepseek-harness-plugin/README.zh.md @@ -27,13 +27,13 @@ ### macOS:通过 Codex Skill 安装 -让 Codex 从仓库的 `skills/opengui-coremate-install` 安装 Skill,然后调用 `$opengui-coremate-install`。Skill 会从公开 Release 下载并校验固定的 `v0.1.5` 安装包,保留 `web` profile 中的其他配置,并且只在 DSH 尚未运行时负责启动,不要求登录 GitHub。 +让 Codex 从仓库的 [`deepseek-harness-plugin/skills/opengui-coremate-install`](./skills/opengui-coremate-install) 安装 Skill,然后调用 `$opengui-coremate-install`。Skill 会从 OpenGUI 的公开 Release 下载并校验固定的 `v0.1.5` 安装包,保留 `web` profile 中的其他配置,并且只在 DSH 尚未运行时负责启动,不要求登录 GitHub。 如果 3080 端口已有 DSH,安装器不会终止或重启该进程,只会提示需要手动重启。下面的手动安装方式仍适用于所有受支持的系统。 ### 1. 下载发布包 -从 [GitHub Releases](https://github.com/Core-Mate/Coremate-Mobile-Plugin/releases) 下载: +从 [OpenGUI 公开 Release](https://github.com/Core-Mate/OpenGUI/releases/tag/dsh-coremate-mobile-v0.1.5) 下载: - `dsh-coremate-mobile-0.1.5.tgz` - `dsh-coremate-mobile-0.1.5.tgz.sha256` @@ -229,15 +229,17 @@ OpenGUI 任务运行时,输入框右侧会出现方形“停止 OpenGUI 操作 这是高级用法:profile patch 会替换目标行的整个 `config`,之后 `$DSH_HOME/settings.yaml` 中的同名 section 仍具有更高优先级。不要把 API Key 写入 patch。 -## 从 Git 安装(开发用途) +## 从源码 checkout 安装(开发用途) -发布环境应固定 release tag 或 commit SHA,不要跟随可移动的 `main`: +生产环境应使用上面的预构建 Release 包。开发时可以 checkout OpenGUI 的公开 Release tag,再安装插件目录: ```sh -dsh plugin --profile web add 'git+https://github.com/Core-Mate/Coremate-Mobile-Plugin.git#v0.1.5' +git clone --branch dsh-coremate-mobile-v0.1.5 --depth 1 https://github.com/Core-Mate/OpenGUI.git +cd OpenGUI/deepseek-harness-plugin +dsh plugin --profile web add "$(pwd)" ``` -公开仓库无需 GitHub 登录即可拉取。Git 安装需要运行包内 `prepare` 构建,因此还要在 profile 的 `allowBuilds` 中明确允许 `dsh-coremate-mobile: true`。只应对已审查并固定版本的源码授予安装期脚本权限。详细语义见[开发者接入与实测记录](docs/research/deepseek-harness-plugin-integration.md)。 +公开仓库无需 GitHub 登录即可拉取。源码安装需要运行包内 `prepare` 构建,因此还要在 profile 的 `allowBuilds` 中明确允许 `dsh-coremate-mobile: true`。只应对已审查并固定版本的源码授予安装期脚本权限。详细语义见[开发者接入与实测记录](docs/research/deepseek-harness-plugin-integration.md)。 ```yaml allowBuilds: diff --git a/deepseek-harness-plugin/SOURCE.md b/deepseek-harness-plugin/SOURCE.md index a37edc3..04a2537 100644 --- a/deepseek-harness-plugin/SOURCE.md +++ b/deepseek-harness-plugin/SOURCE.md @@ -1,8 +1,8 @@ # Source provenance -This directory was imported from the standalone -[`Core-Mate/Coremate-Mobile-Plugin`](https://github.com/Core-Mate/Coremate-Mobile-Plugin) -repository. +This directory was imported from the historical standalone +`Core-Mate/Coremate-Mobile-Plugin` repository. The public source is now maintained +in [`Core-Mate/OpenGUI/deepseek-harness-plugin`](https://github.com/Core-Mate/OpenGUI/tree/main/deepseek-harness-plugin). - Source branch: `main` - Source commit: `7a77c0ab222121d466c23c92c5df24d680c7c3a1` diff --git a/deepseek-harness-plugin/docs/install-for-beginners.zh.md b/deepseek-harness-plugin/docs/install-for-beginners.zh.md index e346853..a72aa3d 100644 --- a/deepseek-harness-plugin/docs/install-for-beginners.zh.md +++ b/deepseek-harness-plugin/docs/install-for-beginners.zh.md @@ -4,7 +4,7 @@ ## 目前能不能直接安装? -可以。从 [GitHub Releases](https://github.com/Core-Mate/Coremate-Mobile-Plugin/releases) 打开最新版本,在 Assets 中下载 `dsh-coremate-mobile-0.1.5.tgz`。 +可以。从 [OpenGUI 的公开 Release](https://github.com/Core-Mate/OpenGUI/releases/tag/dsh-coremate-mobile-v0.1.5) 打开插件版本,在 Assets 中下载 `dsh-coremate-mobile-0.1.5.tgz`。 下载后不要解压。不要下载 “Source code (zip)” 或 “Source code (tar.gz)”;它们是 GitHub 自动生成的源码压缩包,不是普通用户安装包。 diff --git a/deepseek-harness-plugin/docs/research/deepseek-harness-plugin-integration.md b/deepseek-harness-plugin/docs/research/deepseek-harness-plugin-integration.md index e87b33e..dea832f 100644 --- a/deepseek-harness-plugin/docs/research/deepseek-harness-plugin-integration.md +++ b/deepseek-harness-plugin/docs/research/deepseek-harness-plugin-integration.md @@ -107,24 +107,19 @@ pnpm dsh plugin --profile web add ../Deepseek-ai 本地 checkout 安装不需要授权插件自己的 `prepare`;但必须保证 checkout 中已有可加载的 `lib/index.js`。如果 pnpm 同样要求处理 `@google/genai` 和 `protobufjs`,沿用方案一的两个 `false` 决定。相对路径锚定、初始化和安装后 bundle 对账由[官方 CLI 插件实现](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.0-rc.7/apps/cli/src/plugin.ts)定义;本地 checkout 无需允许插件自己的构建脚本由[官方 CLI 行为参考](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.0-rc.7/apps/cli/reference/README.zh.md#插件管理)明确说明。 -## 方案三:直接从 Git 安装 +## 方案三:从公开 tag 的源码 checkout 安装 -推荐固定 release tag 或 commit SHA,不要让生产安装跟随可移动的 `main`: +插件迁入 OpenGUI monorepo 后,不应把仓库根目录当作插件包直接交给 DSH。开发验证应固定插件 release tag,checkout 后安装其中的 `deepseek-harness-plugin` 目录: ```sh -cd /Users/panda/Documents/Projects/Deepseek-harness -pnpm dsh plugin --profile web add \ - 'git+https://github.com/Core-Mate/Coremate-Mobile-Plugin.git#' -``` - -私有仓库也可以使用已配置的 SSH: - -```sh -pnpm dsh plugin --profile web add \ - 'git+ssh://git@github.com/Core-Mate/Coremate-Mobile-Plugin.git#' +git clone --branch dsh-coremate-mobile-v0.1.5 --depth 1 \ + https://github.com/Core-Mate/OpenGUI.git +cd OpenGUI/deepseek-harness-plugin +pnpm build +dsh plugin --profile web add "$(pwd)" ``` -Git 依赖取得的是源码。pnpm 不会因为包有 `build` 脚本就主动构建;当前插件依靠 `prepare: pnpm run build` 生成 `lib/`。pnpm 10 及以上默认阻止 Git 依赖的 `prepare`,所以首次 `add` 预期可能失败。失败后,把 pnpm 输出的**确切包键**合并到这个 profile 的工作区文件,不要覆盖原有字段: +源码 checkout 不包含预先生成的 `lib/`,所以应先完成本地构建。若改用会触发 `prepare` 的安装方式,pnpm 10 及以上默认可能阻止安装期脚本。失败后,把 pnpm 输出的**确切包键**合并到这个 profile 的工作区文件,不要覆盖原有字段: ```yaml # $DSH_HOME/profiles/web/pnpm-workspace.yaml @@ -140,9 +135,9 @@ allowBuilds: protobufjs: false ``` -然后原样重试 `add`。`dsh-coremate-mobile: true` 意味着在 agent 沙箱之外以当前用户身份运行仓库的安装期代码;只应对已审查并固定到 SHA 的源码授权。两个 `false` 则明确拒绝无关传递依赖的安装脚本。官方教程还指出,预构建 npm 包或 tarball 不需要允许插件自己的构建脚本。[官方 Git 安装与构建授权说明](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.0-rc.7/docs/user/develop/basic/publish.zh.md#从-github-安装构建脚本这道坎)。 +然后原样重试 `add`。`dsh-coremate-mobile: true` 意味着在 agent 沙箱之外以当前用户身份运行仓库的安装期代码;只应对已审查并固定版本的源码授权。两个 `false` 则明确拒绝无关传递依赖的安装脚本。官方教程还指出,预构建 npm 包或 tarball 不需要允许插件自己的构建脚本。[官方 Git 安装与构建授权说明](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.0-rc.7/docs/user/develop/basic/publish.zh.md#从-github-安装构建脚本这道坎)。 -Git 安装成功前必须现场确认以下事实:远端确实包含指定 commit/tag、当前机器能够认证私有仓库、安装期 `prepare` 能在没有相邻 Harness 源码的临时环境中完成。源码与 manifest 能证明设计意图,但不能替代这三项实时检查。 +源码安装成功前必须现场确认以下事实:远端确实包含指定 tag、本地构建能在没有相邻 Harness 源码的临时环境中完成、安装后的 profile 能实际装载插件。源码与 manifest 能证明设计意图,但不能替代这三项实时检查。 ## 配置、settings 与凭据 diff --git a/deepseek-harness-plugin/package.json b/deepseek-harness-plugin/package.json index 0fa6185..ca802f3 100644 --- a/deepseek-harness-plugin/package.json +++ b/deepseek-harness-plugin/package.json @@ -4,7 +4,8 @@ "description": "Standalone DeepSeek Harness plugin for Android phone and managed local-browser control", "repository": { "type": "git", - "url": "git+https://github.com/Core-Mate/Coremate-Mobile-Plugin.git" + "url": "git+https://github.com/Core-Mate/OpenGUI.git", + "directory": "deepseek-harness-plugin" }, "type": "module", "main": "lib/index.js", @@ -63,11 +64,11 @@ } }, "dependencies": { - "@deepseek-ai/schemastery": "^3.18.1", - "@earendil-works/pi-ai": "^0.82.1", + "@deepseek-ai/schemastery": "3.18.1", + "@earendil-works/pi-ai": "0.82.1", "puppeteer-core": "25.8.0", - "sharp": "^0.35.3", - "tar": "^7.5.22", + "sharp": "0.35.3", + "tar": "7.5.22", "yauzl": "3.4.0" }, "peerDependencies": { diff --git a/deepseek-harness-plugin/pnpm-lock.yaml b/deepseek-harness-plugin/pnpm-lock.yaml index 985d825..dd483d8 100644 --- a/deepseek-harness-plugin/pnpm-lock.yaml +++ b/deepseek-harness-plugin/pnpm-lock.yaml @@ -9,19 +9,19 @@ importers: .: dependencies: '@deepseek-ai/schemastery': - specifier: ^3.18.1 + specifier: 3.18.1 version: 3.18.1 '@earendil-works/pi-ai': - specifier: ^0.82.1 + specifier: 0.82.1 version: 0.82.1(ws@8.21.3)(zod@4.4.3) puppeteer-core: specifier: 25.8.0 version: 25.8.0(yauzl@3.4.0) sharp: - specifier: ^0.35.3 + specifier: 0.35.3 version: 0.35.3(@types/node@24.13.3) tar: - specifier: ^7.5.22 + specifier: 7.5.22 version: 7.5.22 yauzl: specifier: 3.4.0 diff --git a/deepseek-harness-plugin/skills/opengui-coremate-install/SKILL.md b/deepseek-harness-plugin/skills/opengui-coremate-install/SKILL.md index a29bf22..4853c21 100644 --- a/deepseek-harness-plugin/skills/opengui-coremate-install/SKILL.md +++ b/deepseek-harness-plugin/skills/opengui-coremate-install/SKILL.md @@ -19,7 +19,7 @@ If port 3080 already belongs to DSH, the script preserves that process. Do not k ## First-run handoff -Tell the user that opening DSH, selecting phones, and manually opening mirrors do not require separate model setup. `/opengui ` prefers the current DSH conversation model. A model that explicitly supports images runs without a prompt; an unknown model asks once for permission to reuse it; an explicitly incompatible model enters the dedicated visual-model fallback. An empty `/opengui` only prints usage. The legacy `/coremate` alias remains available for compatibility. +Tell the user to add or select a DSH workspace, then connect and select an authorized phone. Opening DSH, selecting phones, and manually opening mirrors do not require separate model setup. `/opengui ` prefers the current DSH conversation model. A model that explicitly supports images runs without a prompt; an unknown model asks once for permission to reuse it; an explicitly incompatible model enters the dedicated visual-model fallback. An empty `/opengui` only prints usage. The legacy `/coremate` alias remains available for compatibility. The dedicated fallback still requires image input and tool calling. Its setup explains Base URL, API protocol, model ID, and API Key before asking for missing values. diff --git a/deepseek-harness-plugin/skills/opengui-coremate-install/scripts/install-macos.sh b/deepseek-harness-plugin/skills/opengui-coremate-install/scripts/install-macos.sh index 0424a08..8c7df50 100755 --- a/deepseek-harness-plugin/skills/opengui-coremate-install/scripts/install-macos.sh +++ b/deepseek-harness-plugin/skills/opengui-coremate-install/scripts/install-macos.sh @@ -6,7 +6,7 @@ dsh_version="0.1.0-rc.7" profile="web" port="${COREMATE_INSTALL_PORT_OVERRIDE:-3080}" package_name="dsh-coremate-mobile" -github_repository="Core-Mate/Coremate-Mobile-Plugin" +github_repository="Core-Mate/OpenGUI" github_release_base="https://github.com/${github_repository}/releases/download" release_base="${COREMATE_INSTALL_RELEASE_BASE:-${github_release_base}}" dsh_home="${DSH_HOME:-${HOME}/.dsh}" @@ -101,14 +101,15 @@ fi archive_name="${package_name}-${release_version}.tgz" checksum_name="${archive_name}.sha256" -release_url="${release_base%/}/v${release_version}" +release_tag="${package_name}-v${release_version}" +release_url="${release_base%/}/${release_tag}" temporary="$(mktemp -d "${TMPDIR:-/tmp}/opengui-coremate-install.XXXXXX")" trap 'rm -rf "$temporary"' EXIT download() { local url="$1" local output="$2" - local args=(-fL --retry 3 --connect-timeout 15 --output "$output") + local args=(-fL --retry 3 --connect-timeout 15 --max-time 300 --output "$output") if [[ "$url" == https://* ]]; then args+=(--proto '=https' --tlsv1.2); fi curl "${args[@]}" "$url" } diff --git a/deepseek-harness-plugin/src/client/CorematePromotionCard.tsx b/deepseek-harness-plugin/src/client/CorematePromotionCard.tsx index 60ae31b..4b1c9c0 100644 --- a/deepseek-harness-plugin/src/client/CorematePromotionCard.tsx +++ b/deepseek-harness-plugin/src/client/CorematePromotionCard.tsx @@ -3,7 +3,7 @@ import type { CorematePromotionData } from './promotion-data.ts' import { OpenGuiMark } from './OpenGuiMark.tsx' const GITHUB_URL = 'https://github.com/Core-Mate/OpenGUI' -const USE_CASES_URL = 'https://github.com/Core-Mate/Coremate-Mobile-Plugin/blob/main/docs/use-cases.zh.md' +const USE_CASES_URL = 'https://github.com/Core-Mate/OpenGUI/blob/main/deepseek-harness-plugin/docs/use-cases.zh.md' const cardStyle: CSSProperties = { display: 'flex', diff --git a/deepseek-harness-plugin/tests/bundle.spec.ts b/deepseek-harness-plugin/tests/bundle.spec.ts index 0f11d13..ccf74d8 100644 --- a/deepseek-harness-plugin/tests/bundle.spec.ts +++ b/deepseek-harness-plugin/tests/bundle.spec.ts @@ -9,6 +9,7 @@ describe('standalone DeepSeek Harness bundle', () => { it('publishes a patch that inserts only this external plugin', async () => { const packageJson = JSON.parse(await readFile(new URL('package.json', root), 'utf8')) as { name: string + repository: { type: string; url: string; directory: string } exports: Record files: string[] dsh: { bundle: { patch: string }; client: { inject: string[]; platform: string } } @@ -18,6 +19,11 @@ describe('standalone DeepSeek Harness bundle', () => { expect(fileURLToPath(patchPath)).toBe(fileURLToPath(new URL('cordis.patch.yml', root))) expect(packageJson.name).toBe('dsh-coremate-mobile') + expect(packageJson.repository).toEqual({ + type: 'git', + url: 'git+https://github.com/Core-Mate/OpenGUI.git', + directory: 'deepseek-harness-plugin', + }) expect(packageJson.exports['./client']).toBeDefined() expect(packageJson.files).toContain('lib/client.js') expect(packageJson.dsh.client).toEqual({ @@ -36,10 +42,11 @@ describe('standalone DeepSeek Harness bundle', () => { }) it('keeps OpenGUI controls in its view while retaining task stop inside the composer', async () => { - const [clientSource, viewSource, noticeSource] = await Promise.all([ + const [clientSource, viewSource, noticeSource, promotionSource] = await Promise.all([ readFile(new URL('src/client/index.tsx', root), 'utf8'), readFile(new URL('src/client/CoremateView.tsx', root), 'utf8'), readFile(new URL('src/client/CoremateTaskNotice.tsx', root), 'utf8'), + readFile(new URL('src/client/CorematePromotionCard.tsx', root), 'utf8'), ]) expect(clientSource).not.toContain("'conversation.composer.dock'") @@ -53,6 +60,8 @@ describe('standalone DeepSeek Harness bundle', () => { expect(viewSource).toContain('data-coremate-connect-more') expect(viewSource).toContain('https://opengui.ai/') expect(noticeSource).toContain('请前往 OpenGUI Tab') + expect(promotionSource).toContain('https://github.com/Core-Mate/OpenGUI/blob/main/deepseek-harness-plugin/docs/use-cases.zh.md') + expect(promotionSource).not.toContain('Coremate-Mobile-Plugin') expect(clientSource).not.toContain("'shell.overlay'") }) diff --git a/deepseek-harness-plugin/tests/install-skill.spec.ts b/deepseek-harness-plugin/tests/install-skill.spec.ts index 40deba0..5d636b9 100644 --- a/deepseek-harness-plugin/tests/install-skill.spec.ts +++ b/deepseek-harness-plugin/tests/install-skill.spec.ts @@ -20,7 +20,7 @@ async function fixture() { const root = await mkdtemp(join(tmpdir(), 'coremate-install-skill-')) roots.push(root) const bin = join(root, 'bin') - const release = join(root, 'release', 'v0.1.5') + const release = join(root, 'release', 'dsh-coremate-mobile-v0.1.5') const home = join(root, 'dsh-home') await Promise.all([mkdir(bin, { recursive: true }), mkdir(release, { recursive: true })]) const archive = join(release, 'dsh-coremate-mobile-0.1.5.tgz') @@ -56,6 +56,13 @@ async function run(value: Awaited>, extraEnv: Record< } describe('macOS installation Skill', () => { + it('downloads the namespaced plugin release from the public OpenGUI repository', async () => { + const source = await readFile(installer, 'utf8') + expect(source).toContain('github_repository="Core-Mate/OpenGUI"') + expect(source).toContain('release_tag="${package_name}-v${release_version}"') + expect(source).not.toContain('Coremate-Mobile-Plugin') + }) + it('installs and verifies a first release, then repeats without replacing profile files', async () => { const value = await fixture() const first = await run(value) From c71bd6a19d62fb53ee9a206b507a9ca1747184c4 Mon Sep 17 00:00:00 2001 From: HarveySang <277645525+HarveySang@users.noreply.github.com> Date: Wed, 26 Aug 2026 22:37:44 +0800 Subject: [PATCH 2/2] ci: harden plugin release workflow --- .github/workflows/deepseek-harness-plugin-release.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deepseek-harness-plugin-release.yml b/.github/workflows/deepseek-harness-plugin-release.yml index 840f82a..7a7cdc2 100644 --- a/.github/workflows/deepseek-harness-plugin-release.yml +++ b/.github/workflows/deepseek-harness-plugin-release.yml @@ -20,7 +20,7 @@ jobs: run: working-directory: deepseek-harness-plugin steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 persist-credentials: false @@ -46,11 +46,11 @@ jobs: if (!agent.includes(`OpenGUI v${pkg.version}`)) throw new Error('Skill agent version is out of sync') NODE - - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 + - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 with: version: 11.19.0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22.19.0 cache: pnpm @@ -82,7 +82,7 @@ jobs: sha256sum "$archive" > "$archive.sha256" ) - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: dsh-coremate-mobile-release-assets path: deepseek-harness-plugin/release-assets/ @@ -95,7 +95,7 @@ jobs: permissions: contents: write steps: - - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: dsh-coremate-mobile-release-assets path: release-assets