@amaster.ai/pi-lark 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/lark-apps/SKILL.md +41 -6
- package/skills/lark-apps/references/lark-apps-cloud-dev.md +5 -4
- package/skills/lark-apps/references/lark-apps-create.md +6 -3
- package/skills/lark-apps/references/lark-apps-db.md +130 -2
- package/skills/lark-apps/references/lark-apps-get.md +1 -1
- package/skills/lark-apps/references/lark-apps-list.md +1 -1
- package/skills/lark-apps/references/lark-apps-local-dev.md +27 -1
- package/skills/lark-apps/references/lark-apps-release-create.md +1 -1
- package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
- package/skills/lark-base/SKILL.md +155 -159
- package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
- package/skills/lark-base/references/lark-base-app-block-data-config.md +122 -0
- package/skills/lark-base/references/lark-base-app.md +225 -0
- package/skills/lark-base/references/lark-base-cell-value.md +26 -19
- package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +37 -5
- package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +18 -2
- package/skills/lark-base/references/lark-base-dashboard.md +25 -12
- package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
- package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
- package/skills/lark-base/references/lark-base-data-query.md +8 -11
- package/skills/lark-base/references/lark-base-field-create.md +13 -45
- package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
- package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
- package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +18 -100
- package/skills/lark-base/references/lark-base-field-update.md +13 -51
- package/skills/lark-base/references/lark-base-filter-condition.md +19 -31
- package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
- package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
- package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +145 -0
- package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +233 -0
- package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
- package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
- package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
- package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
- package/skills/lark-calendar/SKILL.md +3 -1
- package/skills/lark-calendar/references/lark-calendar-create.md +4 -3
- package/skills/lark-doc/SKILL.md +26 -61
- package/skills/lark-doc/references/genres/business-analysis.md +30 -0
- package/skills/lark-doc/references/genres/data-report.md +32 -0
- package/skills/lark-doc/references/genres/email.md +38 -0
- package/skills/lark-doc/references/genres/execution-plan.md +27 -0
- package/skills/lark-doc/references/genres/formal-doc.md +37 -0
- package/skills/lark-doc/references/genres/meeting-minutes.md +24 -0
- package/skills/lark-doc/references/genres/memo-brief.md +25 -0
- package/skills/lark-doc/references/genres/official-redhead.md +73 -0
- package/skills/lark-doc/references/genres/prd.md +26 -0
- package/skills/lark-doc/references/genres/proposal.md +24 -0
- package/skills/lark-doc/references/genres/research-report.md +32 -0
- package/skills/lark-doc/references/genres/retrospective.md +25 -0
- package/skills/lark-doc/references/genres/route-consumer.md +37 -0
- package/skills/lark-doc/references/genres/route-creative.md +36 -0
- package/skills/lark-doc/references/genres/route-knowledge.md +39 -0
- package/skills/lark-doc/references/genres/route-marketing.md +40 -0
- package/skills/lark-doc/references/genres/route-media.md +36 -0
- package/skills/lark-doc/references/genres/route-opinion.md +38 -0
- package/skills/lark-doc/references/genres/route-personal-brand.md +36 -0
- package/skills/lark-doc/references/genres/route-platform.md +9 -0
- package/skills/lark-doc/references/genres/route-report.md +10 -0
- package/skills/lark-doc/references/genres/route-workplace.md +17 -0
- package/skills/lark-doc/references/genres/sop-tutorial.md +41 -0
- package/skills/lark-doc/references/genres/technical-doc.md +39 -0
- package/skills/lark-doc/references/genres/wechat.md +39 -0
- package/skills/lark-doc/references/genres/weekly-report.md +24 -0
- package/skills/lark-doc/references/genres/white-paper.md +32 -0
- package/skills/lark-doc/references/genres/xiaohongshu.md +38 -0
- package/skills/lark-doc/references/lark-doc-create-workflow.md +121 -0
- package/skills/lark-doc/references/lark-doc-create.md +22 -48
- package/skills/lark-doc/references/lark-doc-fetch.md +80 -92
- package/skills/lark-doc/references/lark-doc-history.md +16 -15
- package/skills/lark-doc/references/lark-doc-md.md +5 -1
- package/skills/lark-doc/references/lark-doc-media-download.md +2 -1
- package/skills/lark-doc/references/lark-doc-script.md +76 -0
- package/skills/lark-doc/references/lark-doc-update.md +73 -221
- package/skills/lark-doc/references/lark-doc-whiteboard.md +5 -9
- package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +17 -12
- package/skills/lark-doc/references/lark-doc-xml.md +38 -167
- package/skills/lark-drive/SKILL.md +11 -7
- package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
- package/skills/lark-drive/references/lark-drive-copy.md +87 -0
- package/skills/lark-drive/references/lark-drive-download.md +29 -2
- package/skills/lark-drive/references/lark-drive-export.md +4 -0
- package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
- package/skills/lark-drive/references/lark-drive-preview.md +21 -2
- package/skills/lark-drive/references/lark-drive-push.md +5 -1
- package/skills/lark-drive/references/lark-drive-search.md +2 -0
- package/skills/lark-drive/references/lark-drive-task-result.md +3 -0
- package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
- package/skills/lark-event/SKILL.md +7 -4
- package/skills/lark-event/references/lark-event-vc.md +8 -2
- package/skills/lark-im/SKILL.md +14 -9
- package/skills/lark-im/references/lark-im-chat-list.md +9 -2
- package/skills/lark-im/references/lark-im-chat-members-list.md +7 -4
- package/skills/lark-im/references/lark-im-chat-messages-list.md +10 -3
- package/skills/lark-im/references/lark-im-chat-search.md +9 -2
- package/skills/lark-im/references/lark-im-feed-group-list-item.md +2 -2
- package/skills/lark-im/references/lark-im-feed-group-list.md +2 -2
- package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
- package/skills/lark-im/references/lark-im-flag-list.md +2 -2
- package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
- package/skills/lark-im/references/lark-im-messages-resources-download.md +19 -25
- package/skills/lark-im/references/lark-im-messages-search.md +4 -5
- package/skills/lark-im/references/lark-im-threads-messages-list.md +8 -4
- package/skills/lark-mail/references/lark-mail-triage.md +19 -4
- package/skills/lark-minutes/SKILL.md +12 -6
- package/skills/lark-minutes/references/lark-minutes-apply-permission.md +95 -0
- package/skills/lark-minutes/references/lark-minutes-detail.md +7 -6
- package/skills/lark-minutes/references/lark-minutes-download.md +4 -2
- package/skills/lark-minutes/references/lark-minutes-search.md +6 -7
- package/skills/lark-note/SKILL.md +13 -9
- package/skills/lark-note/references/lark-note-detail.md +5 -2
- package/skills/lark-note/references/lark-note-transcript.md +2 -0
- package/skills/lark-shared/SKILL.md +39 -3
- package/skills/lark-sheets/SKILL.md +83 -82
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
- package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
- package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
- package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
- package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
- package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
- package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
- package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
- package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
- package/skills/lark-sheets/scripts/sheets_df.py +21 -3
- package/skills/lark-slides/SKILL.md +64 -81
- package/skills/lark-slides/references/cli/lark-slides-add-slide.md +92 -0
- package/skills/lark-slides/references/cli/lark-slides-create.md +176 -0
- package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +65 -0
- package/skills/lark-slides/references/cli/lark-slides-history.md +132 -0
- package/skills/lark-slides/references/cli/lark-slides-media-upload.md +103 -0
- package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +259 -0
- package/skills/lark-slides/references/cli/lark-slides-screenshot.md +115 -0
- package/skills/lark-slides/references/cli/lark-slides-update-slide.md +163 -0
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +110 -0
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +188 -0
- package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +157 -0
- package/skills/lark-slides/references/iconpark-index.json +5 -41901
- package/skills/lark-slides/references/iconpark.md +3 -44
- package/skills/lark-slides/references/lark-slides-add-slide.md +5 -0
- package/skills/lark-slides/references/lark-slides-create.md +3 -162
- package/skills/lark-slides/references/lark-slides-delete-slide.md +5 -0
- package/skills/lark-slides/references/lark-slides-edit-workflows.md +3 -142
- package/skills/lark-slides/references/lark-slides-history.md +3 -130
- package/skills/lark-slides/references/lark-slides-media-upload.md +3 -124
- package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +3 -83
- package/skills/lark-slides/references/lark-slides-replace-slide.md +3 -235
- package/skills/lark-slides/references/lark-slides-screenshot.md +3 -95
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -108
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +3 -186
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +3 -132
- package/skills/lark-slides/references/planning-layer.md +1 -1
- package/skills/lark-slides/references/slides_chart_demo.xml +5 -1416
- package/skills/lark-slides/references/slides_xml_schema_definition.xml +3 -3468
- package/skills/lark-slides/references/troubleshooting.md +3 -61
- package/skills/lark-slides/references/validation-checklist.md +3 -154
- package/skills/lark-slides/references/workflow/error-handling.md +62 -0
- package/skills/lark-slides/references/workflow/slides-editing.md +143 -0
- package/skills/lark-slides/references/workflow/template-editing.md +85 -0
- package/skills/lark-slides/references/workflow/validation-xml.md +156 -0
- package/skills/lark-slides/references/xml/iconpark-index.json +37458 -0
- package/skills/lark-slides/references/xml/iconpark.md +46 -0
- package/skills/lark-slides/references/xml/slides_chart_demo.xml +1415 -0
- package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +3514 -0
- package/skills/lark-slides/references/xml/xml-schema-quick-ref.md +497 -0
- package/skills/lark-slides/references/xml-schema-quick-ref.md +3 -483
- package/skills/lark-slides/scripts/iconpark_tool.py +1 -1
- package/skills/lark-slides/scripts/sxsd_validator.py +154 -10
- package/skills/lark-slides/scripts/xml_lint.py +2989 -0
- package/skills/lark-slides/scripts/xml_lint_test.py +4720 -0
- package/skills/lark-slides/scripts/xml_text_overlap_lint.py +3 -2691
- package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +5 -3788
- package/skills/lark-task/SKILL.md +12 -0
- package/skills/lark-task/references/lark-task-create.md +3 -1
- package/skills/lark-vc/SKILL.md +15 -5
- package/skills/lark-vc/references/lark-vc-detail.md +11 -6
- package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-vc/references/lark-vc-meeting-events.md} +121 -20
- package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-vc/references/lark-vc-meeting-list-active.md} +2 -2
- package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-vc/references/lark-vc-meeting-message-send.md} +3 -3
- package/skills/lark-vc/references/lark-vc-recording.md +8 -6
- package/skills/lark-vc/references/vc-domain-boundaries.md +8 -1
- package/skills/lark-vc-agent/SKILL.md +24 -9
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +2 -2
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +2 -2
- package/skills/lark-whiteboard/SKILL.md +15 -8
- package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
- package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
- package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
- package/skills/lark-whiteboard/routes/dsl.md +8 -2
- package/skills/lark-whiteboard/routes/mermaid.md +1 -1
- package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
- package/skills/lark-whiteboard/routes/svg.md +3 -1
- package/skills/lark-whiteboard/scenes/mention.md +71 -0
- package/skills/lark-wiki/SKILL.md +8 -4
- package/skills/lark-wiki/references/lark-wiki-delete-space.md +6 -3
- package/skills/lark-wiki/references/lark-wiki-node-copy.md +5 -19
- package/skills/lark-wiki/references/lark-wiki-node-create.md +19 -2
- package/skills/lark-wiki/references/lark-wiki-node-get.md +15 -0
- package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
- package/skills/lark-base/references/lark-base-data-analysis-sop.md +0 -210
- package/skills/lark-base/references/lark-base-data-query-guide.md +0 -61
- package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
- package/skills/lark-doc/references/lark-doc-word-stat.md +0 -93
- package/skills/lark-doc/references/style/lark-doc-create-workflow.md +0 -47
- package/skills/lark-doc/references/style/lark-doc-style.md +0 -68
- package/skills/lark-doc/references/style/lark-doc-update-workflow.md +0 -48
- package/skills/lark-doc/scripts/doc_word_stat.py +0 -1243
- package/skills/lark-slides/references/lark-slides-replace-pages.md +0 -95
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -219
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +0 -126
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amaster.ai/pi-lark",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Pi extension for Lark/Feishu workspace — calendar, docs, drive, sheets, tasks, mail and more via lark-cli.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"vitest": "^4.0.0"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@amaster.ai/pi-shared": "0.1.
|
|
64
|
+
"@amaster.ai/pi-shared": "0.1.9"
|
|
65
65
|
},
|
|
66
66
|
"scripts": {
|
|
67
67
|
"fetch-skills": "node scripts/fetch-skills.mjs",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lark-apps
|
|
3
3
|
version: 1.0.0
|
|
4
|
-
description: "妙搭(Spark/Miaoda)应用开发与托管:应用创建、本地全栈开发、云端生成迭代、创意设计(UI mockup / 可交互原型 / 线框图 / 落地页 / 仪表盘 / 幻灯片 deck / 视觉探索)、AI相关能力和飞书平台能力或者其他外部能力集成、日志/Trace/监控指标/PV/UV
|
|
4
|
+
description: "妙搭(Spark/Miaoda)应用开发与托管:应用创建、本地全栈开发、云端生成迭代、创意设计(UI mockup / 可交互原型 / 线框图 / 落地页 / 仪表盘 / 幻灯片 deck / 视觉探索)、AI相关能力和飞书平台能力或者其他外部能力集成、日志/Trace/监控指标/PV/UV 查询、环境变量管理、应用协作者与协作权限设置、应用角色与成员管理、自动化触发器(定时/记录变更/Webhook/飞书审批)。当用户要开发/新建一个系统·工具·平台·应用,或要本地开发 / 云端开发 / 修改 / 部署 / 发布 / 上线 / 拿可分享链接,或用 HTML 做页面·网站·部署到妙搭,或要设计 / design / mockup / prototype / wireframe / 做 PPT / deck / 视觉探索,或提到妙搭/Spark/Miaoda(应用运行时域名形如 *.aiforce.cloud)、应用数据库、应用文件存储、开放 API Key、可见范围、应用协作者/开发权限、应用角色/角色成员、线上日志、接口请求量、错误量、延迟、访问量、环境变量、给妙搭应用配自动化任务/定时触发/审批通过后自动触发时使用。不负责普通云盘文件上传(lark-drive)、飞书文档编辑(lark-doc)、原生幻灯片创建(lark-slides)。"
|
|
5
5
|
metadata:
|
|
6
6
|
requires:
|
|
7
7
|
bins: ["lark-cli"]
|
|
@@ -44,6 +44,7 @@ lark-cli auth login --domain apps
|
|
|
44
44
|
| 调试应用运行时缓存:查看/删除单个业务 key、清空指定环境缓存 | `+cache-get`/`+cache-delete`/`+cache-clear` | [`lark-apps-cache.md`](references/lark-apps-cache.md) |
|
|
45
45
|
| **部署/上线应用**("部署""上线""推上去并部署""发布到云端");查发布状态/历史 | 本地开发链路先按 [`lark-apps-local-dev.md`](references/lark-apps-local-dev.md) 确认本次改动已 git commit + git push,再用 `+release-create` / `+release-get`;查历史用 `+release-list` | [`lark-apps-local-dev.md`](references/lark-apps-local-dev.md), [`lark-apps-release-create.md`](references/lark-apps-release-create.md), [`lark-apps-release-get.md`](references/lark-apps-release-get.md), [`lark-apps-release-list.md`](references/lark-apps-release-list.md) |
|
|
46
46
|
| 设置或查看运行时可见范围 | `+access-scope-set`, `+access-scope-get` | 对应 access-scope reference |
|
|
47
|
+
| 管理应用协作者(列出/添加/改权限/移除)或协作权限设置 | `+member-list`, `+member-add`, `+member-update`, `+member-remove`, `+member-settings-get`, `+member-settings-set` | 本文「应用协作者与协作权限设置」 |
|
|
47
48
|
| 创意模式(html)应用的评论相关操作 | 创意模式应用评论走 lark-drive 文档评论体系,读取 [`../lark-drive/SKILL.md`](../lark-drive/SKILL.md) 了解评论能力 | [`../lark-drive/SKILL.md`](../lark-drive/SKILL.md) |
|
|
48
49
|
| 管理 `app_...` 应用内角色、角色成员,或查询用户匹配角色 | `+role-list/get/create/update/delete`, `+role-member-list/add/remove`, `+role-match-list` | [`lark-apps-role.md`](references/lark-apps-role.md) |
|
|
49
50
|
| 云端 Agent 生成/迭代应用(开发方式已定为云端后) | `+session-create` -> `+chat` -> `+session-get` | [`lark-apps-cloud-dev.md`](references/lark-apps-cloud-dev.md) |
|
|
@@ -51,35 +52,69 @@ lark-cli auth login --domain apps
|
|
|
51
52
|
| 管理妙搭应用自动化触发器(定时/记录变更/Webhook/飞书审批四类触发器的查询/创建/更新/启停;Webhook URL·Token 一次性回显、不落盘) | `+automation-list/get/create/update/enable/disable` | [`lark-apps-automation.md`](references/lark-apps-automation.md) |
|
|
52
53
|
| 查看某次会话某一轮(turn)的回复消息(含仍在生成中的本轮)/ 导出上一轮模型回复("这一轮回复了什么""上一轮的回复""导出某轮消息") | 先 `+session-get`(取 `latest_turn.turn_id`)-> `+session-messages-list --turn-id <id>`(仅 user 身份;分页用 `--page-token`) | [`lark-apps-session-messages-list.md`](references/lark-apps-session-messages-list.md) |
|
|
53
54
|
| 外部能力(AI模型能力和飞书平台能力)集成/插件/Plugin/Capability | `+plugin-install`, `+plugin-list`, `+plugin-uninstall` | [`lark-apps-plugin-install.md`](references/lark-apps-plugin-install.md), [`lark-apps-plugin-uninstall.md`](references/lark-apps-plugin-uninstall.md), [`lark-apps-plugin-list.md`](references/lark-apps-plugin-list.md) |
|
|
55
|
+
| 把一批 ID 在妙搭 user_id ↔ 飞书 open_id / union_id / 飞书 user_id 之间互转(例如拿到 open_id 但下游要 user_id) | `+user-id-convert --convert-type <方向> --ids <id1,id2,...>` | [`lark-apps-user-id-convert.md`](references/lark-apps-user-id-convert.md) |
|
|
54
56
|
|
|
55
57
|
## 高频路径
|
|
56
58
|
|
|
59
|
+
- **Base 到应用数据库同步**:用户说“Base 同步到数据库 / 整库同步 / 多张表同步 / 批量任务重新启用 / operation-not-allowed”时,先读 [`lark-apps-db.md`](references/lark-apps-db.md) 的 Base 数据同步段落,再查 app_id 或处理授权。先形成计划再动手:`+db-sync-create` 一次只处理一张 Base 表,整库/多表必须拆成多份单表配置和多次 preview/create;batch/import 任务是一次性任务,不能重新 enable,遇 operation-not-allowed 先解释生命周期边界,再用 `+db-sync-get` 查状态/结果,持续同步要新建 streaming 任务。
|
|
57
60
|
- **性能/监控/观测指标**:用户问“接口请求量、错误量、错误率、接口慢、延迟、CPU、内存、最近一小时/七天趋势”时,不要去当前工作区搜索监控文件,也不要询问“监控数据在哪”。先按「app_id 获取」解析应用:`lark-cli apps +list --keyword "<应用名>" --as user`;拿到 `app_id` 后读 [`lark-apps-observability.md`](references/lark-apps-observability.md),用 `+metric-list`。
|
|
58
61
|
- **请求量 + 错误量 + 延迟**:请求量/错误量用 `lark-cli apps +metric-list --app-id <app_id> --metric requests --since <range> --as user`(不传 `--series` 会同时返回 total/error);延迟用 `--metric latency`(不传 `--series` 会返回 p50/p99)。如果用户给了具体接口,再加 `--api <path-or-name>`;不要臆造 group-by 参数。
|
|
59
62
|
- **PV/UV/访问量/活跃用户**:先解析 `app_id`,再用 `+analytics-list`,不要误用 `+metric-list`。
|
|
60
63
|
- **设置环境变量**:如果用户只给应用名,仍先 `+list --keyword` 解析 app_id;设置 online 环境且用户已经明确说“确认/直接执行”时,调用 `+env-set --environment online ... --yes`,不要再次要求确认。回复和日志摘要里只提 key / env / app,不回显真实 value;需要传复杂值时优先用 `@file` 或 stdin。
|
|
61
64
|
- **删除环境变量**:`+env-delete` 是破坏性操作。除非用户在同一轮已经明确确认删除这个 app/env/key,否则先向用户确认应用、环境、key 和删除后果;确认后再加 `--yes`。不要因为认证失败/重登完成就自动继续删除,必须保留确认门槛。
|
|
62
65
|
|
|
66
|
+
## 应用协作者与协作权限设置
|
|
67
|
+
|
|
68
|
+
这组命令管理妙搭应用的开发协作者和协作策略,不等同于 `+access-scope-*` 的运行时访问范围,也不等同于 `+role-*` 的应用内业务角色。所有命令使用 `app_...` 应用 ID 和 `--as user`。不要读取或判断 `app_type` 来预判支持范围,直接调用对应的协作者命令。
|
|
69
|
+
|
|
70
|
+
- `+member-list`、`+member-settings-get` 是只读命令,需要 `spark:app:read`。
|
|
71
|
+
- `+member-add`、`+member-update`、`+member-remove`、`+member-settings-set` 是高风险写命令,需要 `spark:app:write`。先用 `--dry-run` 核对目标、URL 和请求体;dry-run 不需要 `--yes`。用户已确认具体应用、成员/设置及影响,或已按下方「高影响动作:确认与预授权」对整条流程明确预授权时,真实执行加 `--yes`;否则在 dry-run 后停下请求确认。批量移除成员仍执行「禁止预授权判定底线」,不能从泛化的“直接做”推导出 `--yes`。
|
|
72
|
+
- 添加、更新、移除成员时必须显式提供匹配的外部 ID 类型,禁止传内部数字 ID、猜测类型或做隐式转换:用户 `--member-type openid --member-id ou_...`;群组 `--member-type openchat --member-id oc_...`;部门 `--member-type opendepartmentid --member-id od-...`。
|
|
73
|
+
- `+member-list --member-type` 的筛选枚举是响应对象类型 `user` / `department` / `chat`,与写命令的 ID 类型枚举不同。可再用 `--role view|edit|full_access` 筛选。
|
|
74
|
+
- `+member-list` 一次返回应用的全部直接协作者,不提供分页参数;可用 `--member-type` 和 `--role` 缩小结果范围。
|
|
75
|
+
- 成员响应不包含应用详情。需要名称、类型或发布状态时单独调用 `+get --app-id <app_id>`,不要期待成员分页重复返回 `app`。
|
|
76
|
+
- 收到 subtype `feature_not_available`(OpenAPI code `3340005`;直连服务可能为 `40005`)时,立即停止 CLI 自动化,不切换 `app_type`,也不尝试用 access scope、应用角色或其它成员命令绕过。向用户说明该应用暂不支持通过 lark-cli 设置协作者,并引导其在妙搭后台的权限设置中操作。
|
|
77
|
+
- `external_invite` 只在 `+member-settings-get` 的响应中读取,不能独立设置;它会跟随 `external_access`。CLI 不注册 `--external-invite`,需要改变外部协作能力时只设置 `--external-access`。
|
|
78
|
+
- `copy_download_by` 也只在 `+member-settings-get` 的响应中读取。CCM 当前明确不支持为妙搭对象写入复制、打印和下载权限,因此 CLI 不注册 `--copy-download-by`。保留读取结果,不要尝试写入,也不要改用其它权限字段模拟。
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 读取协作者和当前协作策略
|
|
82
|
+
lark-cli apps +member-list --app-id <app_id> --as user
|
|
83
|
+
lark-cli apps +member-settings-get --app-id <app_id> --as user
|
|
84
|
+
|
|
85
|
+
# 写操作先预览精确的 typed-ID 字段;确认后把 --dry-run 换成 --yes
|
|
86
|
+
lark-cli apps +member-add --app-id <app_id> --member-type openid --member-id ou_xxx --perm view --dry-run --as user
|
|
87
|
+
lark-cli apps +member-update --app-id <app_id> --member-type openchat --member-id oc_xxx --perm edit --dry-run --as user
|
|
88
|
+
lark-cli apps +member-remove --app-id <app_id> --member-type opendepartmentid --member-id od-xxx --dry-run --as user
|
|
89
|
+
lark-cli apps +member-settings-set --app-id <app_id> --external-access disabled --comment-by viewer --dry-run --as user
|
|
90
|
+
```
|
|
91
|
+
|
|
63
92
|
## 选择开发路径(进意图路由前先判这步)
|
|
64
93
|
|
|
65
94
|
新建必先定 **app_type** 和**开发方式**两件正交的事;修改已有先按「app_id 获取」指认到 app,指认不到就问用户,不擅自 `+create`。开发方式(本地 vs 云端)只看用户对"谁来写代码"的偏好,与应用复杂度、要不要数据库无关。
|
|
66
95
|
|
|
96
|
+
**app_type 三类边界**(先判"要不要把数据存到服务端",再判"纯展示还是有交互"):
|
|
97
|
+
|
|
67
98
|
| 信号 | 判定 |
|
|
68
99
|
|---|---|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
100
|
+
| 含数据库 / 后端持久化:登录 / 增删改查 / 报名·投票·站会存记录 / 多人协作 / 泛称"系统·工具"且明确要存数据 | `app_type=full_stack` |
|
|
101
|
+
| 纯静态展示(给人"看"的物料,无 JS 交互):PPT/deck / demo / 落地页 / 海报 / UI mockup / 线框图 / 静态仪表盘 / 视觉探索 | `app_type=html`,加载 [`creative-design/creative-design.md`](creative-design/creative-design.md)(含完整开发与发布流程) |
|
|
102
|
+
| 有 JS 交互但无数据库(给人"用"的前端应用):可交互原型 / SPA / 表单校验 / 动态计算 / 调用外部 API / 泛称"工具·系统"但未明确要存数据 | `app_type=frontend`(**默认倾向**:用户未明确提出数据库需求时默认引导 frontend,不默认 full_stack) |
|
|
103
|
+
| 类型模糊(尤其"要不要存数据"不清) | **追问**,话术偏向 frontend,例:"看起来是个前端应用,需要保存数据吗?";确认要存数据再转 full_stack,确认纯展示再转 html |
|
|
71
104
|
| 用户要自己写 / 本地 IDE·code agent / 拉源码到本地 / 交研发 | 本地开发,读 [`lark-apps-local-dev.md`](references/lark-apps-local-dev.md) |
|
|
72
105
|
| 让妙搭 AI 云端生成 / 对话式 / 自己不碰代码 | 云端会话,读 [`lark-apps-cloud-dev.md`](references/lark-apps-cloud-dev.md) |
|
|
73
106
|
| 未表达"谁来写"偏好 | **必须先问**(本地代码开发 vs 云端 AI 生成);选定前不擅自选边、不暗示默认,不得以"需求不模糊"为由跳过提问直接 `+init` / `git clone` / `+session-create` / 首轮 `+chat` |
|
|
74
107
|
| 修改已有 + 当前目录是 `.spark/meta.json` 项目 | 直接继续本地按意图路由,不必问也不必判云端 |
|
|
75
108
|
| 修改已有 + 有云端偏好 | 云端会话;未表达偏好且非本地项目 → 默认本地;判不准先问 |
|
|
76
109
|
|
|
110
|
+
**类型升级**:`frontend` 应用后续需要数据库/后端能力时,本地 CLI 不提供类型升级;引导用户到云端会话(打开 `https://miaoda.feishu.cn/app/{app_id}`),用自然语言描述后端需求(如"给这个应用加登录和数据存储")即可触发升级,无需特殊指令。
|
|
111
|
+
|
|
77
112
|
## 发布态护栏
|
|
78
113
|
|
|
79
114
|
- **发布意图判定**:用户要"可访问 / 线上 / 分享 / 新链接 / 上线" = 发布意图,先走发布链路、确认完成再给链接。
|
|
80
115
|
- 完成 ≠ 发布:云端会话完成 / `+list is_published=true` 都不代表最新内容已部署。
|
|
81
|
-
- 开发态链接 `https://miaoda.feishu.cn/app/{app_id}
|
|
82
|
-
- 发布态链接来源:`+release-get` 轮询 `finished` 给 `online_url` / `failed` 给 `error_logs`(html
|
|
116
|
+
- 开发态链接 `https://miaoda.feishu.cn/app/{app_id}`(full_stack / frontend 应用):进应用编辑/开发态、管理与继续开发应用的入口,也是 frontend 升级为 full_stack 的入口(云端会话)。创意模式(html)应用开发态和发布态是同一个链接,无需额外提供开发态链接。
|
|
117
|
+
- 发布态链接来源:`+release-get` 轮询 `finished` 给 `online_url` / `failed` 给 `error_logs`(html / frontend / full_stack 统一走 `+release-get`)。
|
|
83
118
|
- html 应用的主链路是创意模式开发方式:按 [`lark-apps-local-dev.md`](references/lark-apps-local-dev.md) 初始化仓库、在仓库内产出 HTML 及关联文件,并通过 git commit / git push / `+release-create` / `+release-get` 发布部署。任何 git 操作(clone / pull / push)报错时,先执行 `lark-cli apps +git-credential-init --app-id <app_id> --as user` 刷新本地 Git 凭证,再重试原 git 命令。如果刷新凭证也失败,**停止并向用户报告**:原始 git 错误、凭证刷新失败原因,以及是否可能是当前环境(操作系统、沙箱)限制导致(如 macOS Keychain 在沙箱中不可用、Linux 加密文件目录不可写等)。不要改走 `+html-publish`,也不要把 `+html-publish` 当作本地开发链路的 fallback。
|
|
84
119
|
- 创意模式(html)应用的链接格式为 `https://{租户域名}/page/{meta_token}`,**开发态和发布态是同一个链接**(区别于 full_stack 应用两者分开)。此链接形似飞书文档链接。`+get --app-id <meta_token>` 可获取应用信息(含 `app_id`),`+get --app-id <app_id>` 可获取 `meta_token`。看到 `/page/xxx` 链接时,它是妙搭创意模式应用,不要当成飞书文档跳过。
|
|
85
120
|
|
|
@@ -93,7 +128,7 @@ lark-cli auth login --domain apps
|
|
|
93
128
|
- 实现领域 SDK 时,以实际包导出的类型和应用内领域 reference 记录的入参、响应路径为准;禁止修改 ambient `.d.ts`、补造宽松类型或强制断言,让猜测的 SDK 结构仅在本地"编译通过"。
|
|
94
129
|
- typecheck/build 成功不等于合同正确。交付前逐项核对每个 SDK 调用的入参、响应取值路径和策略分支;涉及更新、删除等不同动作时,分别验证各自动作所需的完整状态,不能复用更弱的前置判断。
|
|
95
130
|
- 源码任务交付前确认新增页面、Controller、Module 已接入真实 router/bootstrap,并运行项目现有 typecheck/build;只创建未接线文件不算完成。
|
|
96
|
-
- `+access-scope-*`
|
|
131
|
+
- `+access-scope-*` 只管运行时可见范围(谁能打开应用),不是角色权限;应用协作者/开发权限使用 `+member-*` 和 `+member-settings-*`,应用内业务角色使用 `+role-*`。自动化触发器请用 `+automation-*`(见「意图路由」)。
|
|
97
132
|
|
|
98
133
|
## app_id 获取
|
|
99
134
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
三层父子关系,下层都挂在上层之下:
|
|
12
12
|
|
|
13
|
-
- **app(应用资产)**:一个妙搭应用,由 `+create` 创建并拿到 `app_id
|
|
13
|
+
- **app(应用资产)**:一个妙搭应用,由 `+create` 创建并拿到 `app_id`。`--app-type` 沿用 SKILL.md「选择开发路径」判定的类型(有数据库需求→`full_stack`;纯前端交互、未提数据库→默认 `frontend`),云端生成不写死 `full_stack`。
|
|
14
14
|
- **session(会话)**:一个 app 下的一段独立对话上下文,由 `+session-create` 创建并拿到 `session_id`。一个 app 可有多个 session;`is_active` 表示该 session 当前是否可写(可发起对话)。
|
|
15
15
|
- **turn(轮)**:一个 session 里的一轮交互 = 一条用户消息 + 妙搭 Agent 针对它的生成/迭代。`+chat` 发一条消息就发起一轮;轮的句柄是 `turn_id`,状态看 `latest_turn.status`。
|
|
16
16
|
|
|
@@ -41,7 +41,8 @@
|
|
|
41
41
|
### 典型链路
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
|
-
# 1) 建 app,拿 app_id
|
|
44
|
+
# 1) 建 app,拿 app_id(--app-type 用主路由判定的类型;此例"待办应用"要存待办→full_stack,
|
|
45
|
+
# 若是纯前端交互工具且未提数据库则用 frontend)
|
|
45
46
|
lark-cli apps +create --name "待办应用" --app-type full_stack \
|
|
46
47
|
--description "支持新增、完成、筛选待办"
|
|
47
48
|
|
|
@@ -68,14 +69,14 @@ lark-cli apps +session-list --app-id app_xxx
|
|
|
68
69
|
## 需求发送
|
|
69
70
|
|
|
70
71
|
- 只有用户明确选择云端路径,或明确说“让妙搭 Agent / 云端 AI 生成/迭代”时,才进入本 reference;不要因为用户只说“做个 X”或“给我链接”就默认云端。
|
|
71
|
-
-
|
|
72
|
+
- 进入云端路径后,极简需求也可直接发起生成,例如“做个投票工具”“做个站会小应用”。先按主路由判定的 `--app-type` 建 app(有数据库需求→`full_stack`,纯前端交互未提数据库→默认 `frontend`),再用 `+chat --message "<用户原话>"` 透传需求,不编造实体、字段或业务细节。
|
|
72
73
|
- 如果需求过泛,可在 `+chat --message` 中保留原话,并只补一句“请先生成通用版本,后续可继续迭代”,不要用多轮追问阻塞生成。
|
|
73
74
|
|
|
74
75
|
## 会话落点
|
|
75
76
|
|
|
76
77
|
| 情形 | 动作 |
|
|
77
78
|
|---|---|
|
|
78
|
-
| 全新应用 + 云端生成 |
|
|
79
|
+
| 全新应用 + 云端生成 | 先按主路由判定的类型 `+create --app-type <frontend\|full_stack>`(未提数据库默认 frontend)拿 `app_id`,再 `+session-create` -> `+chat` |
|
|
79
80
|
| 已知 app_id,用户没指定会话 | 先 `+session-list`;有活跃会话时问用户继续现有还是新开 |
|
|
80
81
|
| 用户说“新开一段/换个话题” | `+session-create` 后再 `+chat` |
|
|
81
82
|
| 用户说“接着刚才” | 复用上下文 session_id;拿不到就 `+session-list` 让用户选 |
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
## 何时用
|
|
6
6
|
|
|
7
|
-
用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent
|
|
7
|
+
用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent:用户要“帮我生成/迭代应用”时,先按 SKILL.md「选择开发路径」判定的 `--app-type`(有数据库需求→`full_stack`,纯前端交互未提数据库→默认 `frontend`)创建 app,再进入 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md) 用 `+session-create` / `+chat` 提交需求。
|
|
8
8
|
|
|
9
9
|
## 命令骨架
|
|
10
10
|
|
|
11
11
|
- 必填:`--name`、`--app-type`。
|
|
12
|
-
- app type
|
|
12
|
+
- app type 取值为小写 `html` / `frontend` / `full_stack`;框架按枚举精确校验(不做大小写归一),非法值直接报错。
|
|
13
13
|
- 可选:`--description`、`--icon-url`。
|
|
14
14
|
|
|
15
15
|
## 示例
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
```bash
|
|
18
18
|
lark-cli apps +create --name "客户调研问卷" --app-type html
|
|
19
19
|
|
|
20
|
+
lark-cli apps +create --name "JSON 格式化工具" --app-type frontend \
|
|
21
|
+
--description "纯前端交互工具,无需数据库"
|
|
22
|
+
|
|
20
23
|
lark-cli apps +create --name "审批系统" --app-type full_stack \
|
|
21
24
|
--description "部门审批系统,支持登录、提交申请、多级审批"
|
|
22
25
|
|
|
@@ -35,5 +38,5 @@ lark-cli apps +create --name "Demo" --app-type html --dry-run
|
|
|
35
38
|
|
|
36
39
|
创建后按用户路径继续:
|
|
37
40
|
|
|
38
|
-
- 本地应用开发(含 html
|
|
41
|
+
- 本地应用开发(含 html / frontend / full_stack):读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。
|
|
39
42
|
- 云端 Agent 生成/迭代:读 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md)。
|
|
@@ -15,6 +15,13 @@
|
|
|
15
15
|
| `+db-env-create` | 把单库应用初始化为 dev/online 多环境(高危) | `--environment`、`--sync-data`、`--yes` |
|
|
16
16
|
| `+db-data-export` | 把一张表的数据导出到本地文件 | `--table`、`--output`、`--limit`、`--environment` |
|
|
17
17
|
| `+db-data-import` | 把本地 csv/json 文件导进一张表(高危) | `--file`、`--table`、`--environment`、`--yes` |
|
|
18
|
+
| `+db-sync-create` | 预览或创建 Base 到应用数据库的同步任务(高危) | `--config`、`--preview`、`--output`、`--environment`、`--yes` |
|
|
19
|
+
| `+db-sync-list` | 列出 Base 同步任务 | `--mode`、`--status`、`--table`、`--page-size`/`--page-token`、`--environment` |
|
|
20
|
+
| `+db-sync-get` | 查看同步任务配置、状态、统计和 warnings | `--task-id` |
|
|
21
|
+
| `+db-sync-enable` | 启用 streaming 同步任务 | `--task-id` |
|
|
22
|
+
| `+db-sync-disable` | 停用 streaming 同步任务 | `--task-id` |
|
|
23
|
+
| `+db-sync-update` | 修改 streaming 同步任务映射配置(高危) | `--task-id`、`--config`、`--yes` |
|
|
24
|
+
| `+db-sync-delete` | 删除 streaming 同步任务,保留目标数据(高危) | `--task-id`、`--yes` |
|
|
18
25
|
| `+db-changelog-list` | 查表结构变更(DDL)历史 | `--table`、`--change-id`、`--since`/`--until`、`--environment` |
|
|
19
26
|
| `+db-audit-status` | 看哪些表开了行级审计、保留期 | `--table`、`--environment` |
|
|
20
27
|
| `+db-audit-enable` | 给某表开启行级变更审计 | `--table`、`--retention`、`--environment` |
|
|
@@ -30,7 +37,9 @@
|
|
|
30
37
|
|
|
31
38
|
- **环境 `--environment dev|online`(可省略)**:看表、看结构、数据导入导出、变更追溯、审计、配额都按环境区分。省略 `--environment` 时 CLI 不带该参数、由服务端按应用形态自动选分支——多环境应用走 `dev`、未开多环境的走 `online`;要固定环境就显式传。唯一会报错的组合:对未开多环境的应用显式传 `--environment dev`(无 `dev` 分支)。写操作建议先在 `dev` 验(仅多环境应用有 `dev`)。旧名 `--env` 已**移除**:传入会报 validation 错(提示改用 `--environment`),一律用 `--environment`。`+db-env-diff`/`+db-env-migrate` 是「dev→online 发布」语义,**没有** `--environment`。
|
|
32
39
|
- **本地文件 / `--output` 用工作目录内相对路径**:导入 `--file ./orders.csv`、导出 `--output ./out.csv`;绝对路径、或经 `..`/符号链接越出工作目录的 `--output` 会被拒(validation / exit 2)。路径在别处先 `cd` 过去或改成相对路径。
|
|
33
|
-
- **高危操作必须带 `--yes`**:`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply` 缺省会被确认关卡拦下;动手前先用对应的预览命令或 `--dry-run`
|
|
40
|
+
- **高危操作必须带 `--yes`**:`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete` 缺省会被确认关卡拦下;动手前先用对应的预览命令或 `--dry-run` 看清影响。`+db-sync-create --preview` 只解析/校验配置、不落库,免确认、不需 `--yes`;真正建任务(不带 `--preview`)才需要 `--yes`。
|
|
41
|
+
- **Base 同步不是整库任务**:`+db-sync-create` 一次只处理一张 Base 表到一张目标表。用户说“整库”“客户、订单、回款三张表都同步”时,先明确告诉用户会拆成三套独立配置、三次 preview、用户确认后三次 create;不要暗示一个同步任务能覆盖整个 Base。
|
|
42
|
+
- **batch 任务不能重新启用**:用户说“批量任务重新启用”“operation-not-allowed”时,先给结论:batch/import 是一次性任务,不能 enable。不要先陷入授权排障而漏掉这个结论;授权缺失时也要说明授权完成后应 `+db-sync-get` 查状态/结果,持续同步要新建 streaming。
|
|
34
43
|
- **时间参数按口语自然传**(`--since`/`--until`/`--target`),格式见末尾。
|
|
35
44
|
|
|
36
45
|
## 各命令
|
|
@@ -93,6 +102,120 @@ lark-cli apps +db-data-import --app-id app_xxx --table orders --file ./orders.cs
|
|
|
93
102
|
|
|
94
103
|
**导入/导出限额**:体积 ≤ **1 MB**、行数 ≤ **5000**,导入导出都一样,超限会被拒。超限就分批——导入拆成 ≤1 MB / ≤5000 行的多个文件,导出用 `WHERE` / `LIMIT` 缩小范围。
|
|
95
104
|
|
|
105
|
+
### Base 数据同步
|
|
106
|
+
|
|
107
|
+
Base 数据同步走 `+db-sync-*`,和本地文件导入不同:`+db-data-import` 只处理本地 `.csv/.json` 文件;Base 链接、Base 表、字段映射、持续同步任务都走 `+db-sync-create` / `+db-sync-update`。
|
|
108
|
+
|
|
109
|
+
**任务类型**:
|
|
110
|
+
- `mode=batch`:一次性任务。`schema_only=true` 只建目标表;`schema_only=false` 建表或写入已有表并导入当前 Base 数据。完成后不能 enable/disable/update/delete。
|
|
111
|
+
- `mode=streaming`:持续同步任务。首次同步后持续处理 Base 变化,可 enable/disable/update/delete。
|
|
112
|
+
|
|
113
|
+
**环境(重要)**:`+db-sync-*` 命令省略 `--environment` 时默认落 **online**(不同于 `+db-table-*`/`+db-audit-*` 等「多环境自动选 dev、单环境选 online」的规则——db-sync 家族不走自动选分支)。**多环境应用建表**(`target.table.action=create`)**必须显式 `--environment dev`**:不填或填 `online` 会被 online 分支的 DDL 禁令拒(`k_dl_4000001:forbid ddl/dcl operation in online env`),因为 online 分支产品上不允许直接建表,建表要落到 dev 分支。共享库 / 单环境应用只有 online、在 online 建表正常成功(不会报 `k_dl_4000001`),省略 `--environment` 或填 `online` 均可。
|
|
114
|
+
|
|
115
|
+
**配置格式**:只通过 `--config` 传完整 JSON,支持内联 JSON、`@file`、`-` stdin。配置 key 使用复数:`field_maps`、`option_mappings`、`syncable_source_fields`。不要写单数 `field_map` / `option_mapping`,CLI 会直接报 validation 错。正式 create 时 `field_maps` **可省略或传空数组**:服务端会使用与 preview 相同的逻辑自动匹配字段并直接创建任务;若显式传了映射,则至少要有一项未写成 `"enabled": false`,写了却全部关闭会被 CLI 拒绝。`+db-sync-update` 仍要求至少一个启用的 `field_maps`,因为 update 的语义是修改既有映射。`target.table.action` 只能是 `create` 或 `use_existing`:建表时 `pg_field` 需要完整字段定义;写已有表时通常只需目标列名。`source.base_url`(源 Base 表完整 URL)在 `+db-sync-create` 必填、由服务端强制;`+db-sync-update` 可选——省略时服务端复用原任务的源 URL,仅在换源 / 替换成另一张 Base 表时才需要传新的 `base_url`。`source.table.name` 是要同步的 Base 表名。`base_url` 形如 `https://.../base/<token>?table=<tableId>`:`token` 定位 Base,`table=` 参数(tableId)定位表。填了 `source.table.name` 就以 name 为准——服务端用 `token + name` 反查 tableId(覆盖 url 里的 `table=` 参数);不填才用 url 的 `table=` 参数定位。所以用户自然语言里说「同步 xxx 表」「把 xxx 表同步过去」时,一定要把「xxx」填进 `source.table.name`,不要只给 `base_url`——尤其当 `base_url` 不带 `table=` 参数(指向不带具体表的 Base)时,漏了 name 服务端无从定位表。
|
|
116
|
+
|
|
117
|
+
**不知道要同步哪张表**:若 `base_url` 只有域名+token、不带 `?table=` 参数,又不确定表名,别硬猜。先用 `lark-cli base +table-list --base-token <token>` 列出该 Base 的所有表(`<token>` 就是 `base_url` 里 `/base/` 后面那段),把表名给用户选定,再填进 `source.table.name`(或改用带 `?table=<table_id>` 的完整 URL)。`+db-sync-create` 会在本地就拦下「`base_url` 无 `?table=` 且 `source.table.name` 空」的配置(提交前即报 validation 错,不送到服务端)。
|
|
118
|
+
|
|
119
|
+
**单数 key 恢复**:如果用户说配置里 `field_map` 是单数、`option_mapping` 是单数、或字段映射可能不生效,不要把原配置直接提交。先找到用户这份同步配置,做这三步:
|
|
120
|
+
|
|
121
|
+
1. 只把已知 key 改成复数:`field_map` -> `field_maps`,`option_mapping` -> `option_mappings`;不要发明 `fieldMappings` / `mapping` 之类字段名。
|
|
122
|
+
2. 检查 `field_maps` 是数组,且至少有一项 `enabled` 缺省或为 `true`。如果全是 `"enabled": false`,先让用户确认要启用哪几项,再继续。
|
|
123
|
+
3. 修好后先重新 preview,或复用最近一次 preview `--output` 产出的 `data.config`,再继续 create / update。
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
lark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @sync.json --preview --output ./resolved-sync.json
|
|
127
|
+
lark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
如果本地找不到配置文件,不要只停在“请提供文件”。先说明恢复来源:让用户贴失败时传入的 JSON,或查找最近 preview 的 `--output` 文件;如果是已有任务的修改,先用 `+db-sync-get` 取回当前任务配置,再基于它修正后 update:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
lark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json
|
|
134
|
+
lark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**推荐流程(最佳实践,不是强制)**:优先先 preview,再让用户确认映射,最后用 preview 输出的完整 config 正式创建;这样最稳,也避免手写复杂 `field_maps`。若用户明确要求直接执行、不需要 preview,也可以在 create config 中省略 `field_maps`(或传空数组),由服务端自动匹配并直接创建任务;CLI 不应为了拿 mapping 强制用户先 preview。
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
lark-cli apps +db-sync-create \
|
|
141
|
+
--app-id app_xxx \
|
|
142
|
+
--environment dev \
|
|
143
|
+
--config - \
|
|
144
|
+
--preview \
|
|
145
|
+
--output ./resolved-sync.json <<'JSON'
|
|
146
|
+
{
|
|
147
|
+
"mode": "streaming",
|
|
148
|
+
"source": {
|
|
149
|
+
"type": "base",
|
|
150
|
+
"base_url": "https://example.feishu.cn/base/xxx",
|
|
151
|
+
"table": {"name": "客户"}
|
|
152
|
+
},
|
|
153
|
+
"target": {
|
|
154
|
+
"type": "postgresql",
|
|
155
|
+
"table": {"name": "customers", "action": "use_existing"}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
JSON
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
preview 返回 `data.config`、`syncable_source_fields` 和 `summary`。`--output` 只把 `data.config` 写入文件,文件可直接作为正式输入:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
lark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes
|
|
165
|
+
lark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**多表 Base**:本命令一次只处理一张表。用户要同步整个 Base 时,先把计划说清楚:不是一个“整库同步任务”,而是按表拆成 N 个单表任务。每张表各有一份配置文件、一次 `+db-sync-create --preview`、一次用户确认后的 `+db-sync-create --yes`,并记录各自 `task_id`。
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
lark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @customers-sync.json --preview --output ./customers-resolved.json
|
|
172
|
+
lark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @orders-sync.json --preview --output ./orders-resolved.json
|
|
173
|
+
lark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @payments-sync.json --preview --output ./payments-resolved.json
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
配置也必须是单表粒度:每份 JSON 只有一个 `source.table` 和一个 `target.table`,字段名保持 `field_maps`、`option_mappings`、`syncable_source_fields` 这些复数 key。
|
|
177
|
+
|
|
178
|
+
**修改 streaming 映射**:先用 get 导出当前配置,编辑 `field_maps` 后 update。update 是高危操作,必须经用户确认再加 `--yes`。
|
|
179
|
+
|
|
180
|
+
`+db-sync-get` 返回的 `source` **不含 `base_url`**(只有 token / tableId,服务端没有 domain 拼不出完整 URL),这是正常的。原表 update 直接省略 `base_url` 即可;只有要换成另一张 Base 表时,才在 config 里显式补一个新的 `base_url`。不要为了"补全" `base_url` 而编造 domain 或拼接 URL——拿不到就省略,让服务端复用原任务的源 URL。
|
|
181
|
+
|
|
182
|
+
`+db-sync-update` 也遵循 db-sync 家族「省略 `--environment` 落 online」的规则,所以改 dev 上的任务必须显式带该任务所在环境的 `--environment`(多环境应用的 streaming 任务通常在 `dev`),否则会错落 online、找不到任务或改错分支。
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
lark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json
|
|
186
|
+
lark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**列表与生命周期**:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
lark-cli apps +db-sync-list --app-id app_xxx --mode streaming --table customers
|
|
193
|
+
lark-cli apps +db-sync-disable --app-id app_xxx --task-id streaming_123
|
|
194
|
+
lark-cli apps +db-sync-enable --app-id app_xxx --task-id streaming_123
|
|
195
|
+
lark-cli apps +db-sync-delete --app-id app_xxx --task-id streaming_123 --yes
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`+db-sync-enable`、`+db-sync-disable`、`+db-sync-update`、`+db-sync-delete` 只适用于 `streaming_...` task。对 `batch_...` 执行这些操作会返回 failed-precondition。
|
|
199
|
+
|
|
200
|
+
**batch 任务 operation-not-allowed 恢复**:用户说“批量任务重新启用”“导入历史订单表的任务重新 enable”“系统说操作不允许”时,先给生命周期结论:batch / import 类任务是一次性任务,完成或失败后不能重新启用,也不要反复调用 `+db-sync-enable`。下一步改为查状态和结果:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
lark-cli apps +db-sync-get --app-id app_xxx --task-id batch_123
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
把 `status`、`result`、`warnings` 和目标表写入情况告诉用户。若用户要的是后续持续同步,不是“重启这个 batch”,应新建 `mode=streaming` 任务:先 `+db-sync-create --preview` 给用户确认映射和影响,再带 `--yes` 创建;不要强行 enable 已完成的 batch 任务。若此时 CLI 还缺授权,仍要先解释这个生命周期边界,再提示授权完成后用 `+db-sync-get` 查结果。
|
|
207
|
+
|
|
208
|
+
**失败恢复**:看到 `warnings` 不要直接说同步成功。按 warning 或 error 的 `hint` 继续排查,恢复路径按任务 mode 分支:
|
|
209
|
+
|
|
210
|
+
- **streaming 任务**:常见路径是 `+log-list --keyword <target_table>` / `+log-get` 查日志,然后用 `+db-execute` 修目标表结构,或用 `+db-sync-update`(带该任务所在环境的 `--environment`)修字段映射,最后对同一 `task_id` 再 `+db-sync-get` 复查。
|
|
211
|
+
- **batch 任务**:batch 是一次性任务、**不能 update**(见上文生命周期)。修完目标表结构(`+db-execute`)后不要 update 原 batch,而是重新 `+db-sync-create --preview` 建新任务;只想看这个 batch 的结果就直接 `+db-sync-get`。
|
|
212
|
+
|
|
213
|
+
若此时 CLI 还缺授权、查不到 warning 详情,也不要只给泛化的字段核对建议:先说明被授权卡住,再把对应 mode 的固定命令链作为授权完成后的下一步明确交代给用户。
|
|
214
|
+
|
|
215
|
+
**online 禁 DDL(`k_dl_4000001`)恢复**:`+db-sync-create` 建表报 `k_dl_4000001:forbid ddl/dcl operation in online env` 时,这必然是多环境应用(共享库在 online 建表不会报此码)。online 分支**本就不允许**直接建表,这是多环境应用的产品设计、不是可绕过的限制。改用 `--environment dev` 重跑 `+db-sync-create`,把表建到 dev 分支;不要试图「在 online 想办法重试建表」,没有这个选项。
|
|
216
|
+
|
|
217
|
+
**缺 Base 表记录 ID 映射列(`400002477`)恢复**:streaming 自动同步要求目标表有一个映射给「Base 表记录 ID」的 **text + 单值 + unique** 列。用 `action=use_existing` 写已有表时,若该表没有这样的列,会报 `400002477`(Field mapping must include 'Base 表记录 ID')。先用 `+db-execute` 给表加一个,如 `ALTER TABLE <表> ADD COLUMN base_record_id varchar UNIQUE`,再把它映射给「Base 表记录 ID」、重跑 `+db-sync-create --preview`。注意这是**加列**、不是建表,不需要审计列 / RLS 那套建表规范。
|
|
218
|
+
|
|
96
219
|
### 变更追溯与审计
|
|
97
220
|
|
|
98
221
|
**`+db-changelog-list`**:查表结构变更(DDL)历史——谁、什么时候、改了哪张表、做了什么。可按 `--table` 过滤、按 `--change-id` 精确定位某条、用 `--since`/`--until` 圈时间区间,分页 `--page-size`/`--page-token`。
|
|
@@ -156,7 +279,12 @@ lark-cli apps +db-quota-get --app-id app_xxx --environment dev
|
|
|
156
279
|
|
|
157
280
|
- 用户说「本地 / 开发库 / 调试库」优先 `--environment dev`,线上排查用 `--environment online`;数据面写操作(导入 / 审计开关)建议先在 `dev` 验再动 `online`。**注意省略 `--environment` 时写操作会落到服务端选中的分支——单环境应用即 `online`(生产)**:不确定应用是否多环境时,写操作显式传 `--environment`;显式 `dev` 在单环境应用上会安全报错(无 dev 分支),正好当「是否多环境」的探针用。
|
|
158
281
|
- 看表用 `+db-table-list`,看结构用 `+db-table-get`(要建表语句加 `--format pretty`);`+db-env-create` 仅用于存量单库拆多环境,新建的 full_stack 应用一般不需要。
|
|
159
|
-
-
|
|
282
|
+
- 高危命令(`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete`)动手前先看清影响再带 `--yes`:发布 / 恢复先跑对应预览 `+db-env-diff` / `+db-recovery-diff`,Base 同步先跑 `+db-sync-create --preview`,导入无预览命令、可先 `--dry-run` 看请求或先在 `--environment dev` 验;不要静默追加 `--yes`,遇 confirmation_required(exit 10)按 lark-shared 协议向用户确认不可逆风险后再补 `--yes` 重试。
|
|
160
283
|
- 导入 / 导出的本地路径用工作目录内相对路径;超大表导出会被行数 / 体积上限拒,改用 `+db-execute` 分批。
|
|
284
|
+
- Base 同步优先走 preview → 用户确认 → create,这是最稳的最佳实践、不是强制。用户明确要求直接 create 时,可省略 `field_maps`(或传空数组)让服务端自动匹配并创建;不要为了拿 mapping 强制用户先 preview。显式写映射时使用 `field_maps` / `option_mappings` 复数 key。
|
|
285
|
+
- 修复 Base 同步配置时,只把 `field_map` / `option_mapping` 改成 `field_maps` / `option_mappings`。若显式给了 `field_maps`,检查至少一个映射启用;全是 `"enabled": false` 时先让用户确认要启用哪项。create 也可删掉/置空 `field_maps` 交给服务端自动匹配,但 update 仍必须提供启用的映射。
|
|
286
|
+
- `+db-sync-update` 省略 `source.base_url` 是合法的(服务端复用原任务源 URL);`+db-sync-get` 不返回 `base_url` 属正常,不要因此编造 domain / 拼接 URL 去"补全",只有换源 / 替换表时才传新的 `base_url`。`+db-sync-create` 的 `base_url` 必填,缺失由服务端报错。用户说「同步 xxx 表」时把「xxx」填进 `source.table.name`——填了 name 就以 name 为准(服务端用 `base_url` 的 token + name 反查 tableId,覆盖 url 的 `table=` 参数),不填才用 url 的 `table=` 参数定位;别只给 `base_url`。
|
|
287
|
+
- batch 同步任务不能重新 enable。遇到 operation-not-allowed 先 `+db-sync-get` 查状态和结果;要持续同步就新建 streaming 任务,走 preview -> 用户确认 -> create。
|
|
288
|
+
- `+db-sync-*` 省略 `--environment` 默认落 online。多环境应用建表(`action=create`)必须显式 `--environment dev`;省略或填 `online` 会撞 `k_dl_4000001`(online 禁 DDL)——那是多环境应用的产品设计,把表建到 dev 分支即可,不要在 online 重试建表。共享库应用在 online 建表正常,不受此限。
|
|
161
289
|
- `+db-audit-list` 多表查询时,把结果里 `skipped` 的表(不存在 / 未开审计)连同原因一并向用户说明,不要让用户以为这些表「没有变更」。
|
|
162
290
|
- 恢复是覆盖式且不可逆:`+db-recovery-apply` 前必须先 `+db-recovery-diff`,并明确告知用户会覆盖当前数据。
|
|
@@ -26,7 +26,7 @@ lark-cli apps +get --app-id app_xxx -q '.data.app.app_type'
|
|
|
26
26
|
| 字段 | 类型 | 说明 |
|
|
27
27
|
|------|------|------|
|
|
28
28
|
| `app_id` | string | 应用唯一标识 |
|
|
29
|
-
| `app_type` | string | 应用类型(如 HTML、FULL_STACK、MODERN_HTML) |
|
|
29
|
+
| `app_type` | string | 应用类型(如 HTML、FRONTEND、FULL_STACK、MODERN_HTML) |
|
|
30
30
|
| `name` | string | 应用显示名称 |
|
|
31
31
|
| `description` | string | 应用功能说明 |
|
|
32
32
|
| `icon_url` | string | 应用图标 URL |
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
- 支持 `--keyword` 按应用名模糊搜索。
|
|
12
12
|
- `--ownership` 枚举:`all` / `mine` / `shared`(默认 `all` = 我创建的 + 共享给我的;`mine` = 仅我创建;`shared` = 仅共享给我)。
|
|
13
|
-
- `--app-type` 枚举:`html` / `full_stack`。
|
|
13
|
+
- `--app-type` 枚举:`html` / `frontend` / `full_stack`。
|
|
14
14
|
- 分页:`--page-size` 默认 20,`--page-token` 传上一页 cursor。
|
|
15
15
|
|
|
16
16
|
## 示例
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# lark-apps 本地开发
|
|
2
2
|
|
|
3
|
-
适用:用户要把妙搭应用(full_stack 或 html)源码拉到本地,用本地 code agent/IDE
|
|
3
|
+
适用:用户要把妙搭应用(full_stack、frontend 或 html)源码拉到本地,用本地 code agent/IDE 开发、再发布。其中调试数据库仅 full_stack 适用(frontend / html 无数据库)。
|
|
4
4
|
|
|
5
5
|
## 新建 vs 已有应用
|
|
6
6
|
|
|
@@ -36,6 +36,32 @@ git push origin sprint/default
|
|
|
36
36
|
lark-cli apps +release-create --as user --app-id app_xxx --branch sprint/default
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
+
### frontend
|
|
40
|
+
|
|
41
|
+
纯前端应用(vite-react,无数据库)。流程与 full_stack 基本一致——`+init` 装依赖、`npm run dev`、commit/push/release——差别是无 `+db-*` 调库步骤。后续需要数据库/后端能力时不在本地升级,按 SKILL.md「类型升级」引导到云端会话。
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 新建 frontend 应用
|
|
45
|
+
lark-cli apps +create --as user --name "JSON 格式化工具" --app-type frontend \
|
|
46
|
+
--description "纯前端交互工具,无需数据库"
|
|
47
|
+
|
|
48
|
+
# 初始化本地仓库(--dir 取值见下方「领域规则」,勿照抄此处示例值)
|
|
49
|
+
lark-cli apps +init --as user --app-id app_xxx --dir ./json-tool
|
|
50
|
+
|
|
51
|
+
# 进入仓库后按项目脚手架启动(vite-react)
|
|
52
|
+
cd ./json-tool
|
|
53
|
+
npm install
|
|
54
|
+
npm run dev
|
|
55
|
+
|
|
56
|
+
# 开发完成后:提交本次改动 -> git push origin sprint/default -> +release-create
|
|
57
|
+
git add <本次开发的文件>
|
|
58
|
+
git commit -m "feat: ..."
|
|
59
|
+
git push origin sprint/default
|
|
60
|
+
lark-cli apps +release-create --as user --app-id app_xxx --branch sprint/default
|
|
61
|
+
# 发布是异步的:用 +release-get 轮询到 status=finished 才算部署完成、拿到 online_url
|
|
62
|
+
lark-cli apps +release-get --as user --app-id app_xxx --release-id <上一步返回的 release_id>
|
|
63
|
+
```
|
|
64
|
+
|
|
39
65
|
### html
|
|
40
66
|
|
|
41
67
|
#### 首次开发(无 app,无代码)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# apps +user-id-convert
|
|
2
|
+
|
|
3
|
+
把一批已知 ID 在**妙搭 user_id** 与**飞书开放平台 ID**(open_id / union_id / 飞书 user_id)之间互转。运行时命令事实以 `lark-cli apps +user-id-convert --help` 为准。
|
|
4
|
+
|
|
5
|
+
## 何时用
|
|
6
|
+
|
|
7
|
+
沙箱里的 Code Agent 常通过 `contact` / `im` 域拿到飞书 `open_id`,但下游(妙搭插件、审批、网关)消费的是妙搭 `user_id` 或飞书 `user_id`。这个命令补上中间那一步转换。典型场景:
|
|
8
|
+
|
|
9
|
+
- feishu-approval 插件要发起审批,`createApprovalInstance` 需要飞书 `user_id`,而手里只有妙搭 `user_id` → 用 `miaoda-to-feishu-user-id`。
|
|
10
|
+
- 插件配置表单 / 人员选择器返回 `open_id`,但最终要落库妙搭 `user_id` → 用 `open-id-to-miaoda`。
|
|
11
|
+
|
|
12
|
+
它只做一件事——转换。**没有**本地映射表、缓存、权限预判,也不猜方向。它不替代权限校验:能不能拿到目标 ID 仍由上游 scope 和文档/审批自身的可见范围决定,本命令只转换一个已知 ID 的格式。
|
|
13
|
+
|
|
14
|
+
## 命令骨架
|
|
15
|
+
|
|
16
|
+
- 必填 `--convert-type`:转换方向枚举,缺失或非法直接报可读的校验错误,不猜默认方向。
|
|
17
|
+
- 必填 `--ids`:逗号分隔,或 `@文件` / `-`(stdin)。每次 1–100 个(服务端上限 100;CLI 额外拒绝空批以免空跑)。**不去重**,按输入顺序返回。
|
|
18
|
+
- 只读命令,无写副作用,不需要 `--yes`。
|
|
19
|
+
- 需要 scope `spark:directory.user.id_convert:read`。限流 50 req/s,CLI 不自动重试。
|
|
20
|
+
|
|
21
|
+
### `--convert-type` 方向表
|
|
22
|
+
|
|
23
|
+
| `--convert-type` | 含义 | 目标形态 |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `miaoda-to-open-id` | 妙搭 user_id → 飞书 Open ID | `ou_…` |
|
|
26
|
+
| `miaoda-to-union-id` | 妙搭 user_id → 飞书 Union ID | `on_…` |
|
|
27
|
+
| `open-id-to-miaoda` | 飞书 Open ID → 妙搭 user_id | 数字串 |
|
|
28
|
+
| `union-id-to-miaoda` | 飞书 Union ID → 妙搭 user_id | 数字串 |
|
|
29
|
+
| `miaoda-to-feishu-user-id` | 妙搭 user_id → 飞书 user_id | 数字(employee_id) |
|
|
30
|
+
|
|
31
|
+
## 示例
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 批量把 open_id 转妙搭 user_id
|
|
35
|
+
lark-cli apps +user-id-convert --convert-type open-id-to-miaoda --ids ou_abc123,ou_def456 --as user
|
|
36
|
+
|
|
37
|
+
# 从 stdin 读 ID 列表
|
|
38
|
+
printf 'ou_abc123,ou_def456' | lark-cli apps +user-id-convert --convert-type open-id-to-miaoda --ids - --as user
|
|
39
|
+
|
|
40
|
+
# 只看将要发送的请求体,不真正调用
|
|
41
|
+
lark-cli apps +user-id-convert --convert-type miaoda-to-feishu-user-id --ids 1234567890123456 --dry-run --as user
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 输出契约
|
|
45
|
+
|
|
46
|
+
标准 apps stdout 信封,agent 用 `ok == true` 判成功(不是 `code == 0`)。响应字段保持服务端 `snake_case`。
|
|
47
|
+
|
|
48
|
+
- `data.convert_type`:回显所传的 `--convert-type`。
|
|
49
|
+
- `data.items[]`:`{index, source_id, target_id}`,`index` 是该 ID 在 `--ids` 中的 0 基位置。
|
|
50
|
+
- `data.missed[]`:服务端静默丢弃的未解析 ID,CLI 用输入位置 diff 重建,`{index, source_id, reason: "not_found"}`。
|
|
51
|
+
- `meta`:`{total, hit_count, missed_count}`,`total` = `--ids` 输入数(含重复,不去重),且 `hit_count + missed_count = total`。
|
|
52
|
+
|
|
53
|
+
**部分命中**:批量里只要有 ID 转不出,它不是错误——服务端省略该项,CLI 把它落到 `missed`(`reason: not_found`),并保留 `index` = 输入位置,重复 ID 也能按位置回填。
|
|
54
|
+
|
|
55
|
+
## Agent 规则
|
|
56
|
+
|
|
57
|
+
- **方向不匹配不是错误**:比如在 `miaoda-to-open-id` 下传了 `ou_` 开头的 ID,服务端省略它 → 落到 `missed`。看到 `missed` 时先检查 ID 前缀是否与 `--convert-type` 方向一致。
|
|
58
|
+
- **整批被拒**(服务端 `code != 0`)才是 `api` 错误,带透传 code 和 `log_id`,不重试;限流同理,降低调用频率。
|
|
59
|
+
- 结果只在 stdout 返回一次,不落盘、不写会话上下文。
|
|
60
|
+
|
|
61
|
+
## 边界
|
|
62
|
+
|
|
63
|
+
只转换 ID 格式,不判断调用方是否有权拿到目标 ID。是否有权限由上游 scope 与资源自身可见范围决定,本命令不做预检。
|