Skip to content

feat(apps): 妙搭(Miaoda) 应用 HTML 秒搭一键部署#163

Open
nengqi wants to merge 1 commit into
riba2534:mainfrom
nengqi:feat/apps-miaoda
Open

feat(apps): 妙搭(Miaoda) 应用 HTML 秒搭一键部署#163
nengqi wants to merge 1 commit into
riba2534:mainfrom
nengqi:feat/apps-miaoda

Conversation

@nengqi

@nengqi nengqi commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

这个 PR 做什么

新增 apps 命令组,把「妙搭(Miaoda)」低代码平台能力接入 feishu-cli —— 一份 HTML 秒级发布成可分享的飞书应用(一键部署)。对标官方 lark-cli v1.0.47 的 shortcuts/apps 近逐行直译,两边共用 larksuite/oapi-sdk-go/v3

命令

命令 端点 说明
apps create POST /open-apis/spark/v1/apps 创建 HTML 妙搭应用
apps html-publish POST .../apps/{id}/upload_and_release_html_code 打包 HTML 文件/目录发布,返回访问 URL
apps update PATCH .../apps/{id} 改名 / 描述
apps list GET .../apps 列出应用
apps access-scope-get GET .../apps/{id}/access-scope 查看访问范围
apps access-scope-set PUT .../apps/{id}/access-scope 设置访问范围(specific / public / tenant)

全部 User Access Token + scope spark:app:read / spark:app:write

html-publish 关键设计

  • --path 接单个 HTML 文件或整个目录 → 打包成单个 tar.gz → 单次 multipart(form field file)上传 → 返回 data.url
  • 入口约束:目录形态根目录需 index.html,单文件形态文件名需为 index.html
  • 体积闸门:未压缩总大小 ≤ 200MiB(打包进内存前拦截,防 OOM / 解压炸弹)、打包后 tar.gz ≤ 20MiB(对齐接口上限)。
  • 凭证文件防护:默认拦截 .env / .env.* / .npmrc / .netrc / .git-credentials / .aws/credentials / .docker/config.json / .kube/config--allow-sensitive 显式放行并记录放行清单。
  • 路径安全:symlink 不跟随;tar 条目名拦绝对路径 / .. / 空字节。
  • --dry-run 预览打包清单(文件列表 / 总大小 / 缺 index 警告 / 放行凭证),不发请求。

验证

  • go build/vet/test ./... 全绿,gofmt 干净,go mod tidy 无改动(未引入新依赖)。
  • 单测覆盖:scope 枚举映射、access-scope flag 组合校验、targets 拆分、tarball 打包 round-trip、index 校验、凭证文件门、两道体积闸门拦截、dry-run 渲染、html-publish 响应只取 data.url
  • 真 server e2e:对真实妙搭服务跑通 create → html-publish(拿到线上 URL 且页面正确渲染上传的 HTML)→ access-scope get/set tenant → update → list 全部 happy path。

备注

  • 复用既有 internal/client 的响应解析 / 错误码翻译;新增 SparkCall(user-only,无 X-App-Id)对应妙搭契约。
  • 文档同步:README 命令清单 + 权限 JSON(spark:app:read/write)+ 新 skill + CHANGELOG + root.go。

对齐官方 lark-cli apps 域,移植妙搭低代码应用的一键部署能力(全部 User 身份,需 spark scope):

- apps create     创建 HTML 应用(POST /open-apis/spark/v1/apps),返回 data.app.app_id
- apps html-publish  --path 打包成单 tar.gz,单次 multipart 上传发布,返回 data.url(一键部署)
                  index.html 校验 + 200MB/20MB 尺寸上限 + 凭证文件扫描(--allow-sensitive 放行)
                  复用 SDK Formdata 原语,线格式与 lark-cli 一致;响应只白名单提取 url
- apps update     部分更新名称/描述(PATCH /apps/{id})
- apps access-scope-get/set  查看/设置访问范围(specific|public|tenant → Range|All|Tenant)
- apps list       列出当前用户应用(隐藏,游标分页)

internal/client: SparkCall(JSON, 镜像 BaseV3Call) + SparkHTMLPublish(multipart)
统一 --format/--jq,写命令 --dry-run;权限 spark:app:read/write
文档:README 命令参考+权限清单、CHANGELOG、skills/feishu-cli-apps、root.go
测试:cmd/apps_test.go + internal/client/apps_test.go(23 用例,纯逻辑不触网)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant