From 9ea35ca8cbb2a92db813ed860cd2181643c7791f Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Tue, 25 Aug 2026 08:35:43 +0000 Subject: [PATCH 1/2] fix(tests): align subagent catalog division count with bundled library The bundled subagent catalog now loads 19 divisions (272 agents), but two tests still hard-coded an expected count of 16. Update the assertions so the pre-commit suite is green. --- tests/integration/test_subagents_api.py | 2 +- tests/unit/agents/test_subagent_catalog.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_subagents_api.py b/tests/integration/test_subagents_api.py index 5bc8d4da..53c4deea 100644 --- a/tests/integration/test_subagents_api.py +++ b/tests/integration/test_subagents_api.py @@ -103,7 +103,7 @@ async def test_catalog_divisions(env: Any) -> None: r = await c.get("/api/subagent-catalog/divisions", headers=auth) assert r.status_code == 200, r.text rows = r.json() - assert len(rows) == 16 + assert len(rows) == 19 assert any(row["id"] == "engineering" and row["count"] > 0 for row in rows) diff --git a/tests/unit/agents/test_subagent_catalog.py b/tests/unit/agents/test_subagent_catalog.py index 3b3f2a49..06871fb3 100644 --- a/tests/unit/agents/test_subagent_catalog.py +++ b/tests/unit/agents/test_subagent_catalog.py @@ -192,7 +192,7 @@ def test_bundled_library_non_empty() -> None: catalog = SubagentCatalog(default_package_root()) catalog.refresh() assert len(catalog.list_summaries()) > 100 - assert len(catalog.list_divisions()) == 16 + assert len(catalog.list_divisions()) == 19 assert catalog.get("engineering-software-architect") is not None From 310ba4faa15c16227f0831d378b13b4eadeb73e3 Mon Sep 17 00:00:00 2001 From: jubaoliang Date: Tue, 25 Aug 2026 08:56:36 +0000 Subject: [PATCH 2/2] refactor(fnos): split fnos packaging into docker/ and native/ variants Restructure the FnOS package layout so the Docker build and the native installer live under separate directories (fnos/docker and fnos/native) instead of a single fnos/ tree plus a parallel fnos-native/. Update the FPK build workflow, build-fpk.sh and fnos/common.sh to source from the new paths, and refresh fnos/README.md accordingly. Follow-up to PR #407. --- .github/workflows/fnos-build-fpk.yml | 6 +- fnos/README.md | 61 +++++++++--------- fnos/{ => docker}/Dockerfile | 2 +- {fnos-native => fnos/docker}/ICON.PNG | Bin {fnos-native => fnos/docker}/ICON_256.PNG | Bin {fnos-native => fnos/docker}/LICENSE | 0 .../app/docker/docker-compose.yaml | 0 fnos/{ => docker}/app/ui/config | 0 .../docker}/app/ui/images/icon_256.png | Bin .../docker}/app/ui/images/icon_64.png | Bin fnos/{ => docker}/cmd/config_callback | 0 fnos/{ => docker}/cmd/config_init | 0 fnos/{ => docker}/cmd/install_callback | 0 fnos/{ => docker}/cmd/install_init | 0 fnos/{ => docker}/cmd/main | 0 fnos/{ => docker}/cmd/uninstall_callback | 0 fnos/{ => docker}/cmd/uninstall_init | 0 fnos/{ => docker}/cmd/upgrade_callback | 0 fnos/{ => docker}/cmd/upgrade_init | 0 fnos/{ => docker}/config/privilege | 0 fnos/{ => docker}/config/resource | 0 fnos/{ => docker}/manifest | 0 fnos/{ => docker}/wizard/uninstall | 0 fnos/{ => native}/ICON.PNG | Bin fnos/{ => native}/ICON_256.PNG | Bin fnos/{ => native}/LICENSE | 0 {fnos-native => fnos/native}/app/bin/octop | 0 .../native}/app/bin/octop-cli | 0 {fnos-native => fnos/native}/app/ui/config | 0 fnos/{ => native}/app/ui/images/icon_256.png | Bin fnos/{ => native}/app/ui/images/icon_64.png | Bin .../native}/cmd/config_callback | 0 {fnos-native => fnos/native}/cmd/config_init | 0 .../native}/cmd/install_callback | 0 {fnos-native => fnos/native}/cmd/install_init | 0 {fnos-native => fnos/native}/cmd/main | 0 .../native}/cmd/uninstall_callback | 0 .../native}/cmd/uninstall_init | 0 .../native}/cmd/upgrade_callback | 0 {fnos-native => fnos/native}/cmd/upgrade_init | 0 {fnos-native => fnos/native}/config/privilege | 0 {fnos-native => fnos/native}/config/resource | 0 {fnos-native => fnos/native}/manifest | 0 {fnos-native => fnos/native}/wizard/uninstall | 0 scripts/build-fpk.sh | 4 +- scripts/fnos/common.sh | 2 +- 46 files changed, 38 insertions(+), 37 deletions(-) rename fnos/{ => docker}/Dockerfile (98%) rename {fnos-native => fnos/docker}/ICON.PNG (100%) rename {fnos-native => fnos/docker}/ICON_256.PNG (100%) rename {fnos-native => fnos/docker}/LICENSE (100%) rename fnos/{ => docker}/app/docker/docker-compose.yaml (100%) rename fnos/{ => docker}/app/ui/config (100%) rename {fnos-native => fnos/docker}/app/ui/images/icon_256.png (100%) rename {fnos-native => fnos/docker}/app/ui/images/icon_64.png (100%) rename fnos/{ => docker}/cmd/config_callback (100%) rename fnos/{ => docker}/cmd/config_init (100%) rename fnos/{ => docker}/cmd/install_callback (100%) rename fnos/{ => docker}/cmd/install_init (100%) rename fnos/{ => docker}/cmd/main (100%) rename fnos/{ => docker}/cmd/uninstall_callback (100%) rename fnos/{ => docker}/cmd/uninstall_init (100%) rename fnos/{ => docker}/cmd/upgrade_callback (100%) rename fnos/{ => docker}/cmd/upgrade_init (100%) rename fnos/{ => docker}/config/privilege (100%) rename fnos/{ => docker}/config/resource (100%) rename fnos/{ => docker}/manifest (100%) rename fnos/{ => docker}/wizard/uninstall (100%) rename fnos/{ => native}/ICON.PNG (100%) rename fnos/{ => native}/ICON_256.PNG (100%) rename fnos/{ => native}/LICENSE (100%) rename {fnos-native => fnos/native}/app/bin/octop (100%) rename {fnos-native => fnos/native}/app/bin/octop-cli (100%) rename {fnos-native => fnos/native}/app/ui/config (100%) rename fnos/{ => native}/app/ui/images/icon_256.png (100%) rename fnos/{ => native}/app/ui/images/icon_64.png (100%) rename {fnos-native => fnos/native}/cmd/config_callback (100%) rename {fnos-native => fnos/native}/cmd/config_init (100%) rename {fnos-native => fnos/native}/cmd/install_callback (100%) rename {fnos-native => fnos/native}/cmd/install_init (100%) rename {fnos-native => fnos/native}/cmd/main (100%) rename {fnos-native => fnos/native}/cmd/uninstall_callback (100%) rename {fnos-native => fnos/native}/cmd/uninstall_init (100%) rename {fnos-native => fnos/native}/cmd/upgrade_callback (100%) rename {fnos-native => fnos/native}/cmd/upgrade_init (100%) rename {fnos-native => fnos/native}/config/privilege (100%) rename {fnos-native => fnos/native}/config/resource (100%) rename {fnos-native => fnos/native}/manifest (100%) rename {fnos-native => fnos/native}/wizard/uninstall (100%) diff --git a/.github/workflows/fnos-build-fpk.yml b/.github/workflows/fnos-build-fpk.yml index d7176b12..25fec8dc 100644 --- a/.github/workflows/fnos-build-fpk.yml +++ b/.github/workflows/fnos-build-fpk.yml @@ -96,7 +96,7 @@ jobs: uses: docker/build-push-action@v6 with: context: . - file: fnos/Dockerfile + file: fnos/docker/Dockerfile push: true tags: | ghcr.io/TencentCloud/octop:vanilla @@ -180,8 +180,8 @@ jobs: set -x LOG="${{ github.workspace }}/native-install.log" : > "$LOG" - mkdir -p "${{ github.workspace }}/fnos-native/app/site-packages" - SP="${{ github.workspace }}/fnos-native/app/site-packages" + mkdir -p "${{ github.workspace }}/fnos/native/app/site-packages" + SP="${{ github.workspace }}/fnos/native/app/site-packages" { # 用 uv 安装核心 whl 及其依赖到包内 site-packages。 # pip 对 orcakit-harness-agent[all] 的复杂依赖树会报 resolution-too-deep, diff --git a/fnos/README.md b/fnos/README.md index 23d16658..524d2f90 100644 --- a/fnos/README.md +++ b/fnos/README.md @@ -30,41 +30,42 @@ After install, open the app (Docker: `http://:8088`, native: `http:// ## 目录结构 ``` -fnos/ # Docker 版(docker-project) -├── manifest # 应用元信息(platform=all / 名称/版本/桌面入口等) -├── ICON.PNG / ICON_256.PNG -├── LICENSE # 复用仓库根 LICENSE(MIT) -├── cmd/ # 生命周期脚本(main / install_callback / config_callback 等) -├── config/ -│ ├── privilege # 权限声明(docker-octop 用户) -│ └── resource # 资源声明(docker-project + 数据共享目录) -├── wizard/ -│ └── install # 安装向导(可配置管理员账号/密码、日志级别、LLM 密钥) -├── app/ -│ ├── docker/ -│ │ └── docker-compose.yaml # 引用 ghcr.io/TencentCloud/octop:latest -│ └── ui/ -│ ├── config # 桌面图标入口 -│ └── images/icon-{64,256}.png -└── Dockerfile # 从仓库源码构建镜像,安装全部附加组件(browser + desktop) - -fnos-native/ # 本地版(非 Docker 的 FnOS 原生 app) -├── manifest # platform=all + 原生 app 元信息 -├── cmd/ # 生命周期脚本(main / install_callback / config_callback) -├── config/ -│ ├── privilege # 权限声明(root,用于补装 Chromium 系统库) -│ └── resource # data-share + usr-local-linker -├── app/ -│ ├── bin/octop # 启动器(用自带 Python 运行时启动 octop init/run) -│ └── ui/ # 桌面图标入口 -└── wizard/ # 安装/配置/卸载/升级向导 +fnos/ +├── README.md +├── docker/ # Docker 版(docker-project) +│ ├── manifest # 应用元信息(platform=all / 名称/版本/桌面入口等) +│ ├── ICON.PNG / ICON_256.PNG +│ ├── LICENSE # 复用仓库根 LICENSE(MIT) +│ ├── cmd/ # 生命周期脚本(main / install_callback / config_callback 等) +│ ├── config/ +│ │ ├── privilege # 权限声明(docker-octop 用户) +│ │ └── resource # 资源声明(docker-project + 数据共享目录) +│ ├── wizard/ +│ │ └── install # 安装向导(可配置管理员账号/密码、日志级别、LLM 密钥) +│ ├── app/ +│ │ ├── docker/ +│ │ │ └── docker-compose.yaml # 引用 ghcr.io/TencentCloud/octop:latest +│ │ └── ui/ +│ │ ├── config # 桌面图标入口 +│ │ └── images/icon-{64,256}.png +│ └── Dockerfile # 从仓库源码构建镜像,安装全部附加组件(browser + desktop) +└── native/ # 本地版(非 Docker 的 FnOS 原生 app) + ├── manifest # platform=all + 原生 app 元信息 + ├── cmd/ # 生命周期脚本(main / install_callback / config_callback) + ├── config/ + │ ├── privilege # 权限声明(root,用于补装 Chromium 系统库) + │ └── resource # data-share + usr-local-linker + ├── app/ + │ ├── bin/octop # 启动器(用自带 Python 运行时启动 octop init/run) + │ └── ui/ # 桌面图标入口 + └── wizard/ # 安装/配置/卸载/升级向导 ``` ## 工作机制 1. **源码同步**:`.github/workflows/zz-sync-upstream.yml` 每 6 小时把上游 `TencentCloud/Octop` 的更新合并进本仓 `main` 分支(使用仓库自带 `GITHUB_TOKEN`,无需 PAT)。 -2. **镜像构建**:`.github/workflows/zz-build-fpk.yml` 的 `image` job 在 `main` 更新时,用 `fnos/Dockerfile` 从仓库源码构建 Octop 镜像并推送到 `ghcr.io/TencentCloud/octop:latest`(含全部附加组件)。 -3. **安装包构建**:同一 workflow 的 `fpk` job 用 `scripts/build-fpk.sh` 把 `fnos/` 打成 Docker 版 `.fpk`;`native` job 用 python-build-standalone 构建 Python 3.12 运行时、安装全部依赖与 Playwright Chromium,打成本地版 `.fpk`(`continue-on-error`,失败不阻塞 Docker 版)。两者均以滚动发布 `fnos-latest` 提供下载。 +2. **镜像构建**:`.github/workflows/fnos-build-fpk.yml` 的 `image` job 在 `main` 更新时,用 `fnos/docker/Dockerfile` 从仓库源码构建 Octop 镜像并推送到 `ghcr.io/TencentCloud/octop:latest`(含全部附加组件)。 +3. **安装包构建**:同一 workflow 的 `fpk` job 用 `scripts/build-fpk.sh` 把 `fnos/docker/` 打成 Docker 版 `.fpk`;`native` job 用 python-build-standalone 构建 Python 3.12 运行时、安装全部依赖与 Playwright Chromium,把 `fnos/native/` 打成本地版 `.fpk`(`continue-on-error`,失败不阻塞 Docker 版)。两者均以滚动发布 `fnos-latest` 提供下载。 ## 本地构建 .fpk(无需 Docker) diff --git a/fnos/Dockerfile b/fnos/docker/Dockerfile similarity index 98% rename from fnos/Dockerfile rename to fnos/docker/Dockerfile index d0e5fd96..7c892772 100644 --- a/fnos/Dockerfile +++ b/fnos/docker/Dockerfile @@ -7,7 +7,7 @@ # - desktop (mss / pynput / pillow,桌面控制附加组件) # # 构建上下文必须为仓库根目录(fnpack / CI 中以仓库根为 context): -# docker build -f fnos/Dockerfile -t ghcr.io/TencentCloud/octop:latest . +# docker build -f fnos/docker/Dockerfile -t ghcr.io/TencentCloud/octop:latest . # # 国内加速(可选 build-arg): # PIP_INDEX_URL / PIP_TRUSTED_HOST / NPM_REGISTRY / APT_MIRROR diff --git a/fnos-native/ICON.PNG b/fnos/docker/ICON.PNG similarity index 100% rename from fnos-native/ICON.PNG rename to fnos/docker/ICON.PNG diff --git a/fnos-native/ICON_256.PNG b/fnos/docker/ICON_256.PNG similarity index 100% rename from fnos-native/ICON_256.PNG rename to fnos/docker/ICON_256.PNG diff --git a/fnos-native/LICENSE b/fnos/docker/LICENSE similarity index 100% rename from fnos-native/LICENSE rename to fnos/docker/LICENSE diff --git a/fnos/app/docker/docker-compose.yaml b/fnos/docker/app/docker/docker-compose.yaml similarity index 100% rename from fnos/app/docker/docker-compose.yaml rename to fnos/docker/app/docker/docker-compose.yaml diff --git a/fnos/app/ui/config b/fnos/docker/app/ui/config similarity index 100% rename from fnos/app/ui/config rename to fnos/docker/app/ui/config diff --git a/fnos-native/app/ui/images/icon_256.png b/fnos/docker/app/ui/images/icon_256.png similarity index 100% rename from fnos-native/app/ui/images/icon_256.png rename to fnos/docker/app/ui/images/icon_256.png diff --git a/fnos-native/app/ui/images/icon_64.png b/fnos/docker/app/ui/images/icon_64.png similarity index 100% rename from fnos-native/app/ui/images/icon_64.png rename to fnos/docker/app/ui/images/icon_64.png diff --git a/fnos/cmd/config_callback b/fnos/docker/cmd/config_callback similarity index 100% rename from fnos/cmd/config_callback rename to fnos/docker/cmd/config_callback diff --git a/fnos/cmd/config_init b/fnos/docker/cmd/config_init similarity index 100% rename from fnos/cmd/config_init rename to fnos/docker/cmd/config_init diff --git a/fnos/cmd/install_callback b/fnos/docker/cmd/install_callback similarity index 100% rename from fnos/cmd/install_callback rename to fnos/docker/cmd/install_callback diff --git a/fnos/cmd/install_init b/fnos/docker/cmd/install_init similarity index 100% rename from fnos/cmd/install_init rename to fnos/docker/cmd/install_init diff --git a/fnos/cmd/main b/fnos/docker/cmd/main similarity index 100% rename from fnos/cmd/main rename to fnos/docker/cmd/main diff --git a/fnos/cmd/uninstall_callback b/fnos/docker/cmd/uninstall_callback similarity index 100% rename from fnos/cmd/uninstall_callback rename to fnos/docker/cmd/uninstall_callback diff --git a/fnos/cmd/uninstall_init b/fnos/docker/cmd/uninstall_init similarity index 100% rename from fnos/cmd/uninstall_init rename to fnos/docker/cmd/uninstall_init diff --git a/fnos/cmd/upgrade_callback b/fnos/docker/cmd/upgrade_callback similarity index 100% rename from fnos/cmd/upgrade_callback rename to fnos/docker/cmd/upgrade_callback diff --git a/fnos/cmd/upgrade_init b/fnos/docker/cmd/upgrade_init similarity index 100% rename from fnos/cmd/upgrade_init rename to fnos/docker/cmd/upgrade_init diff --git a/fnos/config/privilege b/fnos/docker/config/privilege similarity index 100% rename from fnos/config/privilege rename to fnos/docker/config/privilege diff --git a/fnos/config/resource b/fnos/docker/config/resource similarity index 100% rename from fnos/config/resource rename to fnos/docker/config/resource diff --git a/fnos/manifest b/fnos/docker/manifest similarity index 100% rename from fnos/manifest rename to fnos/docker/manifest diff --git a/fnos/wizard/uninstall b/fnos/docker/wizard/uninstall similarity index 100% rename from fnos/wizard/uninstall rename to fnos/docker/wizard/uninstall diff --git a/fnos/ICON.PNG b/fnos/native/ICON.PNG similarity index 100% rename from fnos/ICON.PNG rename to fnos/native/ICON.PNG diff --git a/fnos/ICON_256.PNG b/fnos/native/ICON_256.PNG similarity index 100% rename from fnos/ICON_256.PNG rename to fnos/native/ICON_256.PNG diff --git a/fnos/LICENSE b/fnos/native/LICENSE similarity index 100% rename from fnos/LICENSE rename to fnos/native/LICENSE diff --git a/fnos-native/app/bin/octop b/fnos/native/app/bin/octop similarity index 100% rename from fnos-native/app/bin/octop rename to fnos/native/app/bin/octop diff --git a/fnos-native/app/bin/octop-cli b/fnos/native/app/bin/octop-cli similarity index 100% rename from fnos-native/app/bin/octop-cli rename to fnos/native/app/bin/octop-cli diff --git a/fnos-native/app/ui/config b/fnos/native/app/ui/config similarity index 100% rename from fnos-native/app/ui/config rename to fnos/native/app/ui/config diff --git a/fnos/app/ui/images/icon_256.png b/fnos/native/app/ui/images/icon_256.png similarity index 100% rename from fnos/app/ui/images/icon_256.png rename to fnos/native/app/ui/images/icon_256.png diff --git a/fnos/app/ui/images/icon_64.png b/fnos/native/app/ui/images/icon_64.png similarity index 100% rename from fnos/app/ui/images/icon_64.png rename to fnos/native/app/ui/images/icon_64.png diff --git a/fnos-native/cmd/config_callback b/fnos/native/cmd/config_callback similarity index 100% rename from fnos-native/cmd/config_callback rename to fnos/native/cmd/config_callback diff --git a/fnos-native/cmd/config_init b/fnos/native/cmd/config_init similarity index 100% rename from fnos-native/cmd/config_init rename to fnos/native/cmd/config_init diff --git a/fnos-native/cmd/install_callback b/fnos/native/cmd/install_callback similarity index 100% rename from fnos-native/cmd/install_callback rename to fnos/native/cmd/install_callback diff --git a/fnos-native/cmd/install_init b/fnos/native/cmd/install_init similarity index 100% rename from fnos-native/cmd/install_init rename to fnos/native/cmd/install_init diff --git a/fnos-native/cmd/main b/fnos/native/cmd/main similarity index 100% rename from fnos-native/cmd/main rename to fnos/native/cmd/main diff --git a/fnos-native/cmd/uninstall_callback b/fnos/native/cmd/uninstall_callback similarity index 100% rename from fnos-native/cmd/uninstall_callback rename to fnos/native/cmd/uninstall_callback diff --git a/fnos-native/cmd/uninstall_init b/fnos/native/cmd/uninstall_init similarity index 100% rename from fnos-native/cmd/uninstall_init rename to fnos/native/cmd/uninstall_init diff --git a/fnos-native/cmd/upgrade_callback b/fnos/native/cmd/upgrade_callback similarity index 100% rename from fnos-native/cmd/upgrade_callback rename to fnos/native/cmd/upgrade_callback diff --git a/fnos-native/cmd/upgrade_init b/fnos/native/cmd/upgrade_init similarity index 100% rename from fnos-native/cmd/upgrade_init rename to fnos/native/cmd/upgrade_init diff --git a/fnos-native/config/privilege b/fnos/native/config/privilege similarity index 100% rename from fnos-native/config/privilege rename to fnos/native/config/privilege diff --git a/fnos-native/config/resource b/fnos/native/config/resource similarity index 100% rename from fnos-native/config/resource rename to fnos/native/config/resource diff --git a/fnos-native/manifest b/fnos/native/manifest similarity index 100% rename from fnos-native/manifest rename to fnos/native/manifest diff --git a/fnos-native/wizard/uninstall b/fnos/native/wizard/uninstall similarity index 100% rename from fnos-native/wizard/uninstall rename to fnos/native/wizard/uninstall diff --git a/scripts/build-fpk.sh b/scripts/build-fpk.sh index 6712f93f..da7ec739 100644 --- a/scripts/build-fpk.sh +++ b/scripts/build-fpk.sh @@ -70,11 +70,11 @@ build_one() { local KIND="$1" PKG OUTNAME case "$KIND" in docker) - PKG="$ROOT/fnos" + PKG="$ROOT/fnos/docker" OUTNAME="${PREFIX}-${VER}${ITER_SUFFIX}.fpk" ;; native) - PKG="$ROOT/fnos-native" + PKG="$ROOT/fnos/native" OUTNAME="${PREFIX}-native-${VER}${ITER_SUFFIX}.fpk" ;; *) echo "未知类型: $KIND"; return 1 ;; diff --git a/scripts/fnos/common.sh b/scripts/fnos/common.sh index b7749829..dd7a8be1 100644 --- a/scripts/fnos/common.sh +++ b/scripts/fnos/common.sh @@ -3,7 +3,7 @@ # Octop FnOS 打包共享函数库。 # 仓库唯一来源:scripts/fnos/common.sh # 打包时由 scripts/build-fpk.sh 注入到包内 cmd/common.sh; -# fnos/ 与 fnos-native/ 的 cmd 脚本及 app/bin 脚本统一 source 本文件, +# fnos/docker/ 与 fnos/native/ 的 cmd 脚本及 app/bin 脚本统一 source 本文件, # 避免 find_python312 / fix_ownership_and_perms / free_octop_ports 重复维护。 # set -u