如何手动打包 .rowboat-app 并发布到 Rowboat 应用注册表?
【免费下载链接】rowboatOpen-source AI coworker, with memory项目地址: https://gitcode.com/GitHub_Trending/rowb/rowboat
如果你的应用代码仓库、构建流水线或 monorepo 需要自己管理,而不是走 Rowboat 应用内的引导式发布(Apps → 应用详情 → Publish,它会自动建仓库、推源码、发 release 并注册),就需要走 publishing-apps.md 中描述的进阶手动路径。这条路径分两段:先把应用打成<name>.rowboat-app打包文件并在 GitHub release 上挂好资产,再向注册表仓库rowboatlabs/apps-registry提交一个单文件 PR 完成注册。注册表的校验 Action 通过并自动合并后,应用就进入 Rowboat 的 Apps → Catalog。
准备条件
- 一个 GitHub 账号,且对承载应用的仓库有 push 权限(注册表校验会检查 PR 作者对
repo有 push 访问权)。 - 应用目录里已有能构建出浏览器可运行静态文件的构建产物,以及一份合法的 manifest
rowboat-app.json。 - 应用的
name必须满足:3–64 个字符,形如my-app(小写字母、数字、连字符,即^[a-z0-9]+(-[a-z0-9]+)*$,见 registry-record.schema.json 与 rowboat-app.ts 中的PACKAGE_NAME_RE)。name必须与打包文件名的主干一致,且一旦注册后不能再改。 version必须是严格 semver(MAJOR.MINOR.PATCH,不允许 prerelease/build 后缀)。
构建打包前的目录结构
按 publishing-apps.md 的定义,.rowboat-app是一个改名的 ZIP,归档根目录(相对路径、正斜杠)下需要:
rowboat-app.json # manifest(必需) dist/** # 浏览器可运行的静态文件(必需,且 dist/<entry> 必须存在) agents/<file>.yaml # 只包含 manifest.agents 中列出的文件 defaults/** # 可选的初始数据,首次安装时复制到 data/打包时必须遵守的规则:
- 不得包含
src/、package.json、node_modules/、data/、点文件(dotfiles)以及.rowboat-*.json。 - 安装器会强制大小限制:压缩后 100 MB、解压后 500 MB、最多 10,000 个条目;符号链接条目和不安全路径会被拒绝。
- agent 定义文件里只允许出现
name、instructions、triggers三个字段;运行态、active、模型覆盖等字段会被拒绝。
manifest 的最小示例(my-app、1.2.0为文档示例值,替换为你自己的 name/version;entry指向 dist 下必须存在的入口文件):
{ "schemaVersion": 1, "name": "my-app", "version": "1.2.0", "description": "What the app does", "entry": "index.html" }完整字段定义见 rowboat-app.ts 中的RowboatAppManifestSchema(还包含可选的icon、agents、capabilities、dataContracts等;build与minRowboatVersion是 V1 保留字段,仅校验不执行)。
打包为 .rowboat-app
从应用根目录(rowboat-app.json、dist/所在目录)把白名单内的文件压入 ZIP,归档名必须为<manifest.name>.rowboat-app。以文档示例命名、且应用带有一个 agent 和一个 defaults 目录为例:
zip -r my-app.rowboat-app rowboat-app.json dist agents/my-agent.yaml defaults注意按你的实际情况调整:agents/下只放manifest.agents里列出的文件,defaults/没有就不带;src/、package.json、node_modules/、data/、点文件一律不进包。应用内自带的打包器(packager.ts)用的就是同一份白名单逻辑,并会输出 SHA-256 供核对。
发布 GitHub release 并挂双资产
把源码推到你的 GitHub 仓库后,创建 release 时文档强制两点:
- tag 约定:release tag 必须是
v<version>(例如v1.2.0),且与manifest.version一致。 - 双资产要求:每个 release 必须同时挂上两个资产,文件名一字不差:
<name>.rowboat-app—— 打包好的 bundle;rowboat-app.json—— manifest 的独立副本。
独立 manifest 的作用是支撑 Rowboat 的免配额更新检查:客户端通过releases/latest/download/rowboat-app.json拉取它。缺少任一资产都会导致注册校验失败或版本发现中断。
monorepo 的特殊限制
版本发现永远读取仓库的latestrelease。如果一个 monorepo 注册了多个应用,那么每一个release 都必须挂上所有已注册应用的资产对——只要某个应用单独发版,其他应用的解析就会坏掉。一个应用一个仓库可以完全避开这个问题,这也是引导式发布采用的方式。
提交注册记录到注册表
注册表仓库rowboatlabs/apps-registry中每个应用一条记录,位于apps/<name>.json。记录格式(文档示例,your-github-login替换为你的 GitHub 账号,my-app与 manifest 一致):
{ "schemaVersion": 1, "name": "my-app", "owner": "your-github-login", "repo": "your-github-login/my-app", "description": "What the app does", "iconUrl": "https://raw.githubusercontent.com/you/my-app/HEAD/dist/icon.png", "createdAt": "2026-07-06T00:00:00Z" }字段约束以 registry-record.schema.json 为准:name3–64 字符且符合包名正则,repo形如owner/repo,description最长 500 字符,iconUrl必须是https://开头的 URI,createdAt为 ISO 时间戳。注册可以走应用内表单(Apps → Catalog → Register existing release),也可以自己开这个单文件 PR。
操作路径:forkrowboatlabs/apps-registry,在其main基础上新建分支,添加唯一的apps/<name>.json文件并提交,然后向main开 PR。校验 Action 会检查:
- PR 恰好只新增这一个文件;
name合法、唯一且未被退役;owner等于 PR 作者;- PR 作者对
repo有 push 访问权; releases/latest/download/<name>.rowboat-app存在(即 release 资产挂对了)。
验证结果
- PR 被auto-merge:注册成功。此时在 Rowboat 里通过 Apps → Catalog 搜索
my-app即可看到并安装该应用。 - PR 被关闭且带有
rejected: <code>评论:注册被拒,按评论里的代码对照上面的校验项排查,修正记录或 release 后重新提交。 - 手动快速自检:直接访问
https://github.com/<owner>/<repo>/releases/latest/download/<name>.rowboat-app与.../rowboat-app.json,两者都能下载说明双资产就位。
发布后续版本
后续更新同样遵循双资产 +v<version>tag 约定:升 manifest 的version,重新打包,在仓库新建 release 并挂上新的<name>.rowboat-app和rowboat-app.json两个资产即可,无需再和注册表交互。参考 publisher.ts 中publishUpdate的实现可看到与之一致的流程(bump 版本 → 打包 → 推源码 → release → 上传双资产)。
【免费下载链接】rowboatOpen-source AI coworker, with memory项目地址: https://gitcode.com/GitHub_Trending/rowb/rowboat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考