@lark-apaas/coding-miaoda-sandbox-skills 0.1.0-dev.28c4f05 → 0.1.0-dev.4e64c13

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.
Files changed (140) hide show
  1. package/miaoda/animation-skill/SKILL.md +348 -0
  2. package/miaoda/authz-cli/SKILL.md +1 -0
  3. package/miaoda/charts-skill/SKILL.md +264 -0
  4. package/miaoda/creative-to-fullstack/SKILL.md +157 -0
  5. package/miaoda/creative-to-fullstack/references/artifact-signals.md +46 -0
  6. package/miaoda/creative-to-fullstack/references/ui-to-function.md +134 -0
  7. package/miaoda/data-analysis/SKILL.md +151 -0
  8. package/miaoda/data-analysis/references/json-output-specification.md +277 -0
  9. package/miaoda/data-analysis/references/post-analysis-guide.md +77 -0
  10. package/miaoda/data-analysis/references/python-analysis-reference.md +272 -0
  11. package/miaoda/data-analysis/references/tmp-file-management-guide.md +100 -0
  12. package/miaoda/debug-investigation/SKILL.md +21 -18
  13. package/miaoda/extract-json-schema/SKILL.md +147 -0
  14. package/miaoda/lark-apps/SKILL.md +37 -0
  15. package/miaoda/lark-apps/references/openapi-key.md +80 -0
  16. package/miaoda/lark-apps-authz/SKILL.md +292 -0
  17. package/miaoda/lark-apps-authz/references/permission-points.md +39 -0
  18. package/miaoda/lark-apps-authz/references/role.md +122 -0
  19. package/miaoda/lark-apps-db/SKILL.md +226 -0
  20. package/miaoda/lark-apps-db/references/full-reference.md +302 -0
  21. package/miaoda/lark-apps-file/SKILL.md +216 -0
  22. package/miaoda/lark-apps-ops/SKILL.md +62 -0
  23. package/miaoda/lark-apps-ops/references/lark-apps-access-scope-get.md +30 -0
  24. package/miaoda/lark-apps-ops/references/lark-apps-access-scope-set.md +40 -0
  25. package/miaoda/lark-apps-ops/references/lark-apps-cache.md +62 -0
  26. package/miaoda/lark-apps-ops/references/lark-apps-env.md +46 -0
  27. package/miaoda/lark-apps-ops/references/lark-apps-local-dev.md +25 -0
  28. package/miaoda/lark-apps-ops/references/lark-apps-member.md +93 -0
  29. package/miaoda/lark-apps-ops/references/lark-apps-observability.md +46 -0
  30. package/miaoda/lark-apps-ops/references/lark-apps-plugin-install.md +36 -0
  31. package/miaoda/lark-apps-ops/references/lark-apps-plugin-list.md +23 -0
  32. package/miaoda/lark-apps-ops/references/lark-apps-plugin-uninstall.md +25 -0
  33. package/miaoda/lark-apps-ops/references/lark-apps-release-create.md +30 -0
  34. package/miaoda/lark-apps-ops/references/lark-apps-release-get.md +28 -0
  35. package/miaoda/lark-apps-ops/references/lark-apps-release-list.md +31 -0
  36. package/miaoda/lark-apps-ops/references/lark-apps-update.md +30 -0
  37. package/miaoda/lark-apps-ops/references/openapi-key.md +80 -0
  38. package/miaoda/miaoda-file/SKILL.md +1 -0
  39. package/miaoda/miaoda-sql/SKILL.md +6 -2
  40. package/miaoda/performance-review/SKILL.md +144 -0
  41. package/miaoda/performance-review/references/business-analyzer.md +139 -0
  42. package/miaoda/performance-review/references/examples.md +107 -0
  43. package/miaoda/reviewer-usage/SKILL.md +111 -0
  44. package/miaoda/testing-guide/SKILL.md +218 -0
  45. package/miaoda-design/lark-apps-comment/SKILL.md +110 -0
  46. package/miaoda-design/lark-apps-ops/SKILL.md +45 -0
  47. package/miaoda-design/lark-apps-ops/references/lark-apps-release-create.md +51 -0
  48. package/miaoda-design/lark-apps-ops/references/lark-apps-release-get.md +28 -0
  49. package/miaoda-design/lark-apps-ops/references/lark-apps-release-list.md +31 -0
  50. package/miaoda-design/lark-apps-ops/references/lark-apps-update.md +33 -0
  51. package/{shared → miaoda-modern}/lark-apps/SKILL.md +5 -5
  52. package/miaoda-modern/lark-apps/references/openapi-key.md +80 -0
  53. package/miaoda-modern/lark-apps-ops/SKILL.md +62 -0
  54. package/miaoda-modern/lark-apps-ops/references/lark-apps-access-scope-get.md +30 -0
  55. package/miaoda-modern/lark-apps-ops/references/lark-apps-access-scope-set.md +40 -0
  56. package/miaoda-modern/lark-apps-ops/references/lark-apps-cache.md +62 -0
  57. package/miaoda-modern/lark-apps-ops/references/lark-apps-env.md +46 -0
  58. package/miaoda-modern/lark-apps-ops/references/lark-apps-local-dev.md +25 -0
  59. package/miaoda-modern/lark-apps-ops/references/lark-apps-member.md +93 -0
  60. package/miaoda-modern/lark-apps-ops/references/lark-apps-observability.md +46 -0
  61. package/miaoda-modern/lark-apps-ops/references/lark-apps-plugin-install.md +36 -0
  62. package/miaoda-modern/lark-apps-ops/references/lark-apps-plugin-list.md +23 -0
  63. package/miaoda-modern/lark-apps-ops/references/lark-apps-plugin-uninstall.md +25 -0
  64. package/miaoda-modern/lark-apps-ops/references/lark-apps-release-create.md +30 -0
  65. package/miaoda-modern/lark-apps-ops/references/lark-apps-release-get.md +28 -0
  66. package/miaoda-modern/lark-apps-ops/references/lark-apps-release-list.md +31 -0
  67. package/miaoda-modern/lark-apps-ops/references/lark-apps-update.md +30 -0
  68. package/{shared/lark-apps → miaoda-modern/lark-apps-ops}/references/openapi-key.md +3 -3
  69. package/miaoda-modern/memory/SKILL.md +86 -0
  70. package/package.json +1 -1
  71. package/shared/lark-cli/SKILL.md +221 -0
  72. package/shared/lark-cli/lark-base/README.md +56 -0
  73. package/shared/lark-cli/lark-base/references/lark-base-commands.md +108 -0
  74. package/shared/lark-cli/lark-calendar/README.md +158 -0
  75. package/shared/lark-cli/lark-calendar/references/lark-calendar-meeting.md +30 -0
  76. package/shared/lark-cli/lark-calendar/references/lark-calendar-room-find.md +108 -0
  77. package/shared/lark-cli/lark-calendar/references/lark-calendar-suggestion.md +120 -0
  78. package/shared/lark-cli/lark-contact/README.md +35 -0
  79. package/shared/lark-cli/lark-contact/references/lark-contact-get-user.md +13 -0
  80. package/shared/lark-cli/lark-contact/references/lark-contact-search-user.md +121 -0
  81. package/shared/lark-cli/lark-doc/README.md +67 -0
  82. package/shared/lark-cli/lark-doc/references/lark-doc-fetch.md +138 -0
  83. package/shared/lark-cli/lark-doc/references/lark-doc-history.md +61 -0
  84. package/shared/lark-cli/lark-drive/README.md +129 -0
  85. package/shared/lark-cli/lark-drive/references/lark-drive-files-list.md +183 -0
  86. package/shared/lark-cli/lark-im/README.md +84 -0
  87. package/shared/lark-cli/lark-im/references/lark-im-chat-list.md +140 -0
  88. package/shared/lark-cli/lark-im/references/lark-im-chat-members-list.md +84 -0
  89. package/shared/lark-cli/lark-im/references/lark-im-chat-search.md +135 -0
  90. package/shared/lark-cli/lark-im/references/lark-im-reactions.md +232 -0
  91. package/shared/lark-cli/lark-minutes/README.md +51 -0
  92. package/shared/lark-cli/lark-minutes/references/lark-minutes-download.md +130 -0
  93. package/shared/lark-cli/lark-sheets/README.md +173 -0
  94. package/shared/lark-cli/lark-sheets/references/lark-sheets-changeset.md +105 -0
  95. package/shared/lark-cli/lark-sheets/references/lark-sheets-chart.md +45 -0
  96. package/shared/lark-cli/lark-sheets/references/lark-sheets-conditional-format.md +42 -0
  97. package/shared/lark-cli/lark-sheets/references/lark-sheets-filter-view.md +49 -0
  98. package/shared/lark-cli/lark-sheets/references/lark-sheets-filter.md +42 -0
  99. package/shared/lark-cli/lark-sheets/references/lark-sheets-float-image.md +43 -0
  100. package/shared/lark-cli/lark-sheets/references/lark-sheets-formula-verify.md +64 -0
  101. package/shared/lark-cli/lark-sheets/references/lark-sheets-history.md +70 -0
  102. package/shared/lark-cli/lark-sheets/references/lark-sheets-pivot-table.md +44 -0
  103. package/shared/lark-cli/lark-sheets/references/lark-sheets-read-data.md +216 -0
  104. package/shared/lark-cli/lark-sheets/references/lark-sheets-search-replace.md +67 -0
  105. package/shared/lark-cli/lark-sheets/references/lark-sheets-sheet-structure.md +52 -0
  106. package/shared/lark-cli/lark-sheets/references/lark-sheets-sparkline.md +47 -0
  107. package/shared/lark-cli/lark-sheets/references/lark-sheets-workbook.md +69 -0
  108. package/shared/lark-cli/lark-sheets/scripts/sheets_df.py +32 -0
  109. package/shared/lark-cli/lark-slides/README.md +86 -0
  110. package/shared/lark-cli/lark-slides/references/lark-slides-history.md +105 -0
  111. package/shared/lark-cli/lark-slides/references/lark-slides-xml-presentation-slide-get.md +108 -0
  112. package/shared/lark-cli/lark-slides/references/lark-slides-xml-presentations-get.md +77 -0
  113. package/shared/lark-cli/lark-task/README.md +93 -0
  114. package/shared/lark-cli/lark-task/references/lark-task-get-my-tasks.md +57 -0
  115. package/shared/lark-cli/lark-task/references/lark-task-get-related-tasks.md +49 -0
  116. package/shared/lark-cli/lark-task/references/lark-task-search.md +36 -0
  117. package/shared/lark-cli/lark-task/references/lark-task-tasklist-search.md +35 -0
  118. package/shared/lark-cli/lark-vc/README.md +40 -0
  119. package/shared/lark-cli/lark-vc/references/lark-vc-recording.md +31 -0
  120. package/shared/lark-cli/lark-whiteboard/README.md +35 -0
  121. package/shared/lark-cli/lark-whiteboard/references/lark-whiteboard-export.md +59 -0
  122. package/shared/lark-cli/lark-wiki/README.md +50 -0
  123. package/shared/lark-cli/lark-wiki/references/lark-wiki-node-get.md +59 -0
  124. package/shared/lark-cli/lark-wiki/references/lark-wiki-node-list.md +95 -0
  125. package/shared/lark-cli/lark-wiki/references/lark-wiki-space-list.md +68 -0
  126. package/miaoda-design/attachment/SKILL.md +0 -58
  127. /package/{shared → miaoda}/memory/SKILL.md +0 -0
  128. /package/{shared → miaoda-modern}/animation-skill/SKILL.md +0 -0
  129. /package/{shared → miaoda-modern}/charts-skill/SKILL.md +0 -0
  130. /package/{shared → miaoda-modern}/data-analysis/SKILL.md +0 -0
  131. /package/{shared → miaoda-modern}/data-analysis/references/json-output-specification.md +0 -0
  132. /package/{shared → miaoda-modern}/data-analysis/references/post-analysis-guide.md +0 -0
  133. /package/{shared → miaoda-modern}/data-analysis/references/python-analysis-reference.md +0 -0
  134. /package/{shared → miaoda-modern}/data-analysis/references/tmp-file-management-guide.md +0 -0
  135. /package/{shared → miaoda-modern}/extract-json-schema/SKILL.md +0 -0
  136. /package/{shared → miaoda-modern}/performance-review/SKILL.md +0 -0
  137. /package/{shared → miaoda-modern}/performance-review/references/business-analyzer.md +0 -0
  138. /package/{shared → miaoda-modern}/performance-review/references/examples.md +0 -0
  139. /package/{shared → miaoda-modern}/reviewer-usage/SKILL.md +0 -0
  140. /package/{shared → miaoda-modern}/testing-guide/SKILL.md +0 -0
@@ -0,0 +1,292 @@
1
+ ---
2
+ name: lark-apps-authz
3
+ description: "Use when 在妙搭沙箱里用 `lark-cli apps +role-*` 管理【当前这个已存在的】妙搭应用的角色与角色成员、查询用户命中的角色,或用 `lark-cli apps +db-execute` 维护权限点位表(建表、预填、新增、更新、删除点位)。触发词:查询角色列表, 创建角色, 删除角色, 角色成员, 查询用户角色, 权限点位, 权限表, 新增点位, 更新点位, 删除点位, +role-, role-list, role-match-list. NOT for 编写权限控制代码——CanRole/@Can 编码用 authz-guide skill。"
4
+ metadata:
5
+ requires:
6
+ bins: ["lark-cli"]
7
+ cliHelp: "lark-cli apps --help; lark-cli apps +role-list --help(各 +role-* 子命令同理)"
8
+ control-by-feature-ab: true
9
+ unavailable-agents:
10
+ - AppInit
11
+ ---
12
+
13
+ # lark-apps-authz — 权限管理工具
14
+
15
+ Agent 在沙箱内直接执行的权限管理工具集,包含两部分能力:
16
+
17
+ - **角色管理**:通过 `lark-cli apps +role-*` 管理角色(查询、创建、更新、删除、成员管理、查询用户命中角色)。完整命令细节见 [references/role.md](references/role.md)
18
+ - **权限点位管理**:通过 `lark-cli apps +db-execute` 管理权限表和数据(建表、新增/更新/删除点位、管理映射)。SQL 执行通道与建表规范以 `lark-apps-db` skill 为准
19
+
20
+ ## 沙箱约定(先读)
21
+
22
+ - **命令名**:一律 `lark-cli apps +role-*` / `lark-cli apps +db-execute`;命令/flag 细节以 `--help` 为准。
23
+ - **应用已存在、app_id 走环境变量**:应用 id 在环境变量 `app_id` 里,命令需要 `--app-id` 时用 `--app-id "$app_id"`,不需要自行获取、解析或选择。
24
+ - **鉴权自动**:apps 域请求由运行环境自动打到 innerAPI 并注入鉴权头。**不要** `auth login` / `config init` / `--as`。
25
+ - **失败处理**:命令失败时把 `error.hint` 转述给用户,别原样甩 envelope JSON。
26
+
27
+ ### 高风险写操作审批(exit 10)
28
+
29
+ `+role-delete`、`+role-member-remove`(含 `--all`)等删除类操作属于高风险写:不带 `--yes` 会 **exit 10** 并返回 `confirmation_required`。处理:
30
+
31
+ 1. 识别 exit code=10 且 `error.type=="confirmation_required"`;
32
+ 2. 把 `error.risk.action` + 关键参数给用户,明确"高风险/不可逆",等显式同意;
33
+ 3. 同意 → 原始 argv 末尾加 `--yes` 重试;拒绝 → 终止;
34
+ 4. 想先看请求 → `--dry-run`(不触发门禁、不需 `--yes`)。
35
+
36
+ **绝不**看到 exit 10 就默认补 `--yes` 静默重试。
37
+
38
+ ## 工具边界
39
+
40
+ | 场景 | 正确做法 |
41
+ |------|----------|
42
+ | Agent 查询系统已有哪些角色 | `lark-cli apps +role-list --app-id "$app_id"` |
43
+ | Agent 创建/更新角色 | `lark-cli apps +role-create --app-id "$app_id" --name "<名称>"` / `+role-update --app-id "$app_id" --role-id <role_id>` |
44
+ | Agent 删除角色(高风险) | `lark-cli apps +role-delete --app-id "$app_id" --role-id <role_id> --yes`,执行前必须取得用户明确授权 |
45
+ | Agent 管理角色成员 | `lark-cli apps +role-member-list/add/remove --app-id "$app_id" --role-id <role_id>`(remove 为高风险,需授权) |
46
+ | 查询某用户命中哪些角色 | `lark-cli apps +role-match-list --app-id "$app_id" --user-id <ou_x>` |
47
+ | 创建 authz_permissions/authz_role_permissions 表 | `lark-cli apps +db-execute` 执行 DDL |
48
+ | 开发阶段新增/更新/删除权限点位 | `lark-cli apps +db-execute` 执行 INSERT/UPDATE/DELETE |
49
+ | 开发阶段初始化或调整角色-点位映射 | `lark-cli apps +db-execute` 执行 INSERT/DELETE |
50
+ | 运行态调整角色-点位映射(勾选/取消) | 由应用管理页面处理,**不属于** Agent 职责 |
51
+ | **应用前端**需要权限控制 | 使用 `<CanRole>` 或 `<Can>` 组件(参考 `authz-guide` skill) |
52
+ | **应用后端**需要权限控制 | 使用 `@CanRole` 或 `@Can` 装饰器(参考 `authz-guide` skill) |
53
+
54
+ > **禁止**在生成的应用代码(前端/后端)中调用 `lark-cli`。CLI 命令只在 Agent 对话终端中执行。
55
+
56
+ > 默认输出 JSON envelope,角色数据位于 `data.items` / `data.role` / `data.roles`。
57
+
58
+ ## Action 决策流程
59
+
60
+ ### Action 类型与触发场景
61
+
62
+ | Action | 触发场景 | 对应操作 |
63
+ | ------ | -------- |---------|
64
+ | QUERY | 需要了解当前系统已有哪些角色 | `lark-cli apps +role-list --app-id "$app_id"` |
65
+ | CREATE | 查询后发现所需角色不存在,需按设计方案批量创建 | `lark-cli apps +role-create --app-id "$app_id" --name "..." --description "..."` |
66
+ | UPDATE | 需要修改已有角色的名称或描述 | `lark-cli apps +role-update --app-id "$app_id" --role-id "..." --name "..."` |
67
+ | DELETE | 需要删除角色(高风险,不可逆) | 先 `+role-get` + `+role-member-list` 确认影响,取得授权后 `+role-delete --yes` |
68
+ | MEMBER | 需要查询/调整角色的用户、部门、群成员 | `+role-member-list/add/remove`(remove 高风险,需授权) |
69
+ | MATCH | 需要查询某用户命中哪些角色 | `lark-cli apps +role-match-list --app-id "$app_id" --user-id "<ou_x>"` |
70
+ | PERM_CREATE_TABLE | 首次启用动态权限:创建 authz_permissions/authz_role_permissions 表 | `lark-cli apps +db-execute` 执行 DDL |
71
+ | PERM_SEED | 初始化权限点位和角色-点位映射数据 | `lark-cli apps +db-execute` 执行 INSERT |
72
+ | PERM_ADD | 新增权限点位(新功能上线时) | `lark-cli apps +db-execute` 执行 INSERT + 同步更新 `@Can`/`<Can>` 代码 |
73
+ | PERM_UPDATE | 修改权限点位的 action/subject/description | `lark-cli apps +db-execute` 执行 UPDATE + 同步更新 `@Can`/`<Can>` 代码 |
74
+ | PERM_DELETE | 删除权限点位(功能下线时) | `lark-cli apps +db-execute` 执行 DELETE(级联删除映射)+ 移除 `@Can`/`<Can>` 代码 |
75
+
76
+ ### 决策流程图
77
+
78
+ ```text
79
+ 权限设计方案
80
+ │
81
+ ├─ 推荐模式:静态角色鉴权
82
+ │ └─ 新建 ──→ 按角色清单逐个 CREATE ──→ 编写 CanRole 代码(authz-guide)
83
+ │
84
+ ├─ 推荐模式:动态权限点位鉴权
85
+ │ ├─ 新建 ──→ CREATE 角色 → PERM_CREATE_TABLE → PERM_SEED → 编写 @Can 代码(authz-guide)
86
+ │ └─ 升级(仅限历史 CanRole 代码迁移)──→ PERM_CREATE_TABLE → PERM_SEED → CanRole 升级为 Can(authz-guide)
87
+ │
88
+ ├─ "给某功能加权限控制" / "新建某个角色"
89
+ │ └──→ QUERY(查询角色)
90
+ │ ├─ 角色存在 ──→ 编写鉴权代码(authz-guide)
91
+ │ └─ 角色不存在 ──→ CREATE ──→ 编写鉴权代码
92
+ │
93
+ ├─ "新功能上线,需要新增权限点位" ──→ PERM_ADD + 同步 @Can/<Can> 代码
94
+ │
95
+ ├─ "功能下线,删除权限点位" ──→ PERM_DELETE + 移除 @Can/<Can> 代码
96
+ │
97
+ ├─ "修改角色信息" ──→ UPDATE
98
+ │
99
+ └─ "查某用户有哪些角色" ──→ MATCH
100
+ ```
101
+
102
+ ### 关键约束
103
+
104
+ **角色设计由权限设计方案承载**,本 skill 负责角色 CLI 操作和权限点位管理。
105
+
106
+ **日常权限开发流程**:QUERY → 判断是否 CREATE → 编写鉴权代码(参考 `authz-guide`)。
107
+
108
+ **动态权限点位初始化流程**:CREATE 角色 → PERM_CREATE_TABLE → PERM_SEED → 编写鉴权代码。
109
+
110
+ **权限点位变更**:PERM_ADD / PERM_UPDATE / PERM_DELETE **必须同步更新** `@Can`/`<Can>` 代码,确保数据库点位定义与代码中的鉴权声明一致。
111
+
112
+ **角色标识**:角色名称不是 role_id。只有名称时先用 `+role-list --name '<exact_name>'` 精确解析;多条命中让用户消歧,唯一命中后才使用返回的真实 role_id。
113
+
114
+ **mock 能力差异**:authz-cli 的 `role mock`(为用户配置模拟角色集)在 lark-cli 通道无对应命令,已移除;只读查询用户命中的角色用 MATCH(`+role-match-list`)。
115
+
116
+ ---
117
+
118
+ ## 角色管理(`lark-cli apps +role-*`)
119
+
120
+ 完整命令约定见 [references/role.md](references/role.md)。高频用法:
121
+
122
+ ### 查询角色
123
+
124
+ ```bash
125
+ # 分页列出全部角色
126
+ lark-cli apps +role-list --app-id "$app_id" --page-size 100
127
+
128
+ # 按精确名称解析 role_id
129
+ lark-cli apps +role-list --app-id "$app_id" --name '管理员'
130
+
131
+ # 读取角色详情
132
+ lark-cli apps +role-get --app-id "$app_id" --role-id <role_id>
133
+
134
+ # 查询某用户命中的角色(user-id 只接受 ou_...)
135
+ lark-cli apps +role-match-list --app-id "$app_id" --user-id <ou_x>
136
+ ```
137
+
138
+ ### 创建角色
139
+
140
+ ```bash
141
+ lark-cli apps +role-create --app-id "$app_id" \
142
+ --name "管理员" \
143
+ --description "拥有全部管理权限" \
144
+ --role-id "admin"
145
+ ```
146
+
147
+ **参数:**
148
+
149
+ - `--name`(必需):角色名称
150
+ - `--description`(可选):角色描述
151
+ - `--role-id`(可选):角色 ID。仅在需要稳定业务标识(如 `admin`,供权限点位表 `role_key` 引用)时传入,创建后不能修改;不传由平台分配
152
+
153
+ ### 按设计方案批量创建
154
+
155
+ 当权限设计方案已输出角色清单(含 name、roleId、description)时,按清单顺序逐个创建:
156
+
157
+ ```bash
158
+ # 按角色清单顺序执行,每个角色一条命令
159
+ lark-cli apps +role-create --app-id "$app_id" --name "读者" --role-id "reader" --description "浏览图书与分类,发起借阅"
160
+ lark-cli apps +role-create --app-id "$app_id" --name "图书编辑" --role-id "editor" --description "负责图书内容的创建与维护"
161
+ lark-cli apps +role-create --app-id "$app_id" --name "管理员" --role-id "admin" --description "拥有所有业务管理权限"
162
+ ```
163
+
164
+ > 创建完所有角色后,按权限设计方案的功能权限映射表编写鉴权代码(参考 `authz-guide`)。
165
+
166
+ ### 更新角色
167
+
168
+ ```bash
169
+ # 只传需要变更的字段(--name 或 --description)
170
+ lark-cli apps +role-update --app-id "$app_id" --role-id "admin" --name "管理员(全局)"
171
+ ```
172
+
173
+ ### 删除角色(高风险)
174
+
175
+ ```bash
176
+ # 先确认影响范围,取得用户明确授权后再带 --yes 执行
177
+ lark-cli apps +role-get --app-id "$app_id" --role-id <role_id>
178
+ lark-cli apps +role-member-list --app-id "$app_id" --role-id <role_id>
179
+ lark-cli apps +role-delete --app-id "$app_id" --role-id <role_id> --yes
180
+ ```
181
+
182
+ ### 角色成员管理
183
+
184
+ ```bash
185
+ # 查询角色的用户、部门、群成员
186
+ lark-cli apps +role-member-list --app-id "$app_id" --role-id <role_id>
187
+
188
+ # 添加成员(open ID:用户 ou_...、部门 od-...、群 oc_...)
189
+ lark-cli apps +role-member-add --app-id "$app_id" --role-id <role_id> \
190
+ --users ou_x,ou_y --departments od-x --chats oc_x
191
+
192
+ # 定向移除成员(高风险,需授权)
193
+ lark-cli apps +role-member-remove --app-id "$app_id" --role-id <role_id> --users ou_x --yes
194
+
195
+ # 清空成员(不删除角色;高风险,需授权)
196
+ lark-cli apps +role-member-remove --app-id "$app_id" --role-id <role_id> --all --yes
197
+ ```
198
+
199
+ > **成员参数只接受飞书 open ID**:`--users` 收 `ou_`、`--departments` 收 `od-`、`--chats` 收 `oc_`。妙搭的数字 user_id(例如数据库 `user_profile` 列用的那组测试用户)**不能用**,CLI 会直接拒绝并提示 `--users must use ou_ IDs`。
200
+ > 沙箱内取 open ID 只有两条路:`lark-cli contact +search-user --query "<姓名或邮箱>"`(要求唯一精确命中)、`lark-cli contact +get-user`(当前登录用户自己)。**两条都拿不到就停下向用户要 open ID——禁止用数字 ID 兜底,禁止编造。**
201
+
202
+ ## 权限点位管理(`lark-cli apps +db-execute`)
203
+
204
+ > **SQL 执行通道**:所有 DDL/DML 只用 `lark-cli apps +db-execute --app-id "$app_id" --sql "<query>" --yes` 执行,不要调用其它 SQL 工具。建表规范(审计列、RLS、默认 policy、`IF NOT EXISTS`)、DML 规则与高风险授权要求**参阅 `lark-apps-db` skill**([../lark-apps-db/SKILL.md](../lark-apps-db/SKILL.md))。
205
+
206
+ > **职责边界**:
207
+ > - **开发阶段(Agent)**:通过 `+db-execute` 对 `authz_permissions`(点位定义)和 `authz_role_permissions`(角色-点位映射)两张表做 CURD,含建表、预填、点位增删改、初始映射调整。
208
+ > - **运行态(管理页面)**:只提供受限能力——角色-点位映射的勾选/取消。**禁止**管理页面提供权限点位本身的新增/删除功能(点位增删属于代码变更范畴,必须回到开发阶段走 `+db-execute` + 同步 `@Can`/`<Can>`)。
209
+
210
+ > **⚠️ 双表原则**:权限点位涉及 `authz_permissions`(点位定义)和 `authz_role_permissions`(角色-点位映射)两张表,初始化和变更时**必须同时处理两张表**,禁止只操作其中一张。
211
+
212
+ ### PERM_CREATE_TABLE — 建表
213
+
214
+ 首次启用动态权限点位时执行。两张表的完整建表 DDL、RLS/policy 补齐要求、`role_key` ↔ 角色 ID 的对应关系见 [references/permission-points.md](references/permission-points.md)。
215
+
216
+ ### PERM_SEED — 预填初始数据
217
+
218
+ 按权限设计方案的「权限点位定义」和「角色-点位初始映射」表预填:
219
+
220
+ ```sql
221
+ -- 按「权限点位定义」表
222
+ INSERT INTO authz_permissions (action, subject, description) VALUES
223
+ ('read', 'Task', '查看任务'),
224
+ ('create', 'Task', '创建任务'),
225
+ ('update', 'Task', '编辑任务'),
226
+ ('delete', 'Task', '删除任务');
227
+
228
+ -- 按「角色-点位初始映射」表
229
+ INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
230
+ ('admin', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task')),
231
+ ('admin', (SELECT id FROM authz_permissions WHERE action='create' AND subject='Task')),
232
+ ('member', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task'));
233
+ ```
234
+
235
+ > 以上 SQL 仅为示例,实际数据根据权限设计方案生成。
236
+
237
+ ### PERM_ADD — 新增权限点位
238
+
239
+ 新功能上线时,新增点位 + 初始映射 + 同步鉴权代码:
240
+
241
+ ```sql
242
+ -- 1. 新增点位定义(authz_permissions 表)
243
+ INSERT INTO authz_permissions (action, subject, description) VALUES
244
+ ('export', 'Task', '导出任务');
245
+
246
+ -- 2. 为需要该权限的角色添加映射(authz_role_permissions 表)
247
+ INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
248
+ ('admin', (SELECT id FROM authz_permissions WHERE action='export' AND subject='Task'));
249
+ ```
250
+
251
+ > **必须同步**:
252
+ > - 在后端对应的 Controller 方法上添加 `@Can('export', 'Task')`,前端添加 `<Can action="export" subject="Task">`
253
+ > - **禁止**只插入 authz_permissions 而不处理 authz_role_permissions,否则新点位无任何角色拥有
254
+
255
+ ### PERM_UPDATE — 修改权限点位
256
+
257
+ 修改已有点位的 action、subject 或 description:
258
+
259
+ ```sql
260
+ -- 修改 authz_permissions 表(authz_role_permissions 通过外键 permission_id 关联,无需修改)
261
+ UPDATE authz_permissions SET description = '导出任务列表为 Excel' WHERE action = 'export' AND subject = 'Task';
262
+ ```
263
+
264
+ > 如果修改了 action 或 subject,**必须同步更新**所有引用该点位的 `@Can`/`<Can>` 代码。authz_role_permissions 通过 `permission_id` 外键关联,不受 action/subject 变更影响。
265
+
266
+ ### PERM_DELETE — 删除权限点位
267
+
268
+ 功能下线时,删除点位 + 自动级联删除映射 + 移除鉴权代码:
269
+
270
+ ```sql
271
+ -- 删除 authz_permissions 记录,authz_role_permissions 中关联的映射会被 ON DELETE CASCADE 自动删除
272
+ DELETE FROM authz_permissions WHERE action = 'export' AND subject = 'Task';
273
+ ```
274
+
275
+ > **必须同步**:移除后端的 `@Can('export', 'Task')` 装饰器和前端的 `<Can action="export" subject="Task">` 组件。
276
+ > 虽然 authz_role_permissions 会自动级联删除,仍需**确认**不存在其他代码依赖被删除的点位。
277
+
278
+ ---
279
+
280
+ ## Common Mistakes
281
+
282
+ | 错误 | 正确做法 |
283
+ | ---- | -------- |
284
+ | 在应用代码中调用 `lark-cli` | CLI 仅供 Agent 终端执行;应用代码用 CanRole 组件/装饰器(参考 `authz-guide`) |
285
+ | 用角色名称当 role_id 直接更新/删除 | 先 `+role-list --name '<exact_name>'` 精确解析出 role_id,多条命中让用户消歧 |
286
+ | 未授权就执行 `+role-delete --yes` / `+role-member-remove --all --yes` | 删除类操作高风险不可逆,先展示影响范围取得明确授权;exit-10 按沙箱约定处理,绝不静默补 `--yes` |
287
+ | 只创建角色不编写鉴权代码 | 创建角色后必须编写鉴权代码(参考 `authz-guide`) |
288
+ | 没有设计方案就大批量创建角色 | 先确认是否有权限设计方案输出的角色清单,再按清单逐个 CREATE |
289
+ | 动态权限点位场景只创建角色不建表预填 | 需要执行 PERM_CREATE_TABLE + PERM_SEED |
290
+ | 在管理页面提供权限点位的增删改 | 权限点位的增删改由 Agent 通过 PERM_ADD/UPDATE/DELETE 操作,管理页面只做角色-点位映射 |
291
+ | 新增/修改/删除权限点位后不同步代码 | PERM_ADD/UPDATE/DELETE 后**必须同步**更新对应的 `@Can`/`<Can>` 代码 |
292
+ | PERM_ADD 只插入 authz_permissions 不插入 authz_role_permissions | 新增点位后必须同时为相关角色添加映射,否则无角色拥有该权限 |
@@ -0,0 +1,39 @@
1
+ # 权限点位表建表 DDL(PERM_CREATE_TABLE)
2
+
3
+ 首次启用动态权限点位时执行。通过 `lark-cli apps +db-execute --app-id "$app_id" --sql "<ddl>" --yes` 下发;
4
+ SQL 执行通道、建表规范与高风险授权要求以 `lark-apps-db` skill 为准。
5
+
6
+ ## 两张表
7
+
8
+ ```sql
9
+ CREATE TABLE IF NOT EXISTS authz_permissions (
10
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
11
+ action VARCHAR(100) NOT NULL,
12
+ subject VARCHAR(100) NOT NULL,
13
+ description TEXT DEFAULT '',
14
+ creator user_profile NOT NULL,
15
+ _created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL,
16
+ _created_by user_profile,
17
+ _updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL,
18
+ _updated_by user_profile,
19
+ UNIQUE(action, subject)
20
+ );
21
+
22
+ CREATE TABLE IF NOT EXISTS authz_role_permissions (
23
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
24
+ role_key VARCHAR(100) NOT NULL,
25
+ permission_id UUID NOT NULL REFERENCES authz_permissions(id) ON DELETE CASCADE,
26
+ creator user_profile NOT NULL,
27
+ _created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL,
28
+ _created_by user_profile,
29
+ _updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL,
30
+ _updated_by user_profile,
31
+ UNIQUE(role_key, permission_id)
32
+ );
33
+ ```
34
+
35
+ ## 两条必读约束
36
+
37
+ > **RLS 与默认 policy**:以上仅为业务列示意,实际建表必须按 `lark-apps-db` skill 的 CREATE TABLE Template 在**同一次 `+db-execute` 调用**中补齐 `ENABLE ROW LEVEL SECURITY` 和 4 条默认 policy(两张表都要),并在执行前取得用户授权。
38
+
39
+ > **`role_key` ↔ 角色 ID**:`authz_role_permissions.role_key` 存储的值必须等于角色的 role_id(`+role-create --role-id` 传入的值,或平台分配后从 `+role-list` 读到的值)。两者是同一个标识,INSERT 映射时 `role_key` 填 `'admin'`、`'editor'` 等角色 ID,运行时鉴权也用它匹配用户拥有的角色。
@@ -0,0 +1,122 @@
1
+ # apps role 域命令(应用角色)
2
+
3
+ 管理妙搭应用内的平台角色、角色成员,以及查询某个用户命中的角色。运行时命令事实以 `lark-cli apps +<cmd> --help` 为准;沙箱约定(`$app_id`、鉴权自动、exit-10 高风险确认)遵循本 skill [`SKILL.md`](../SKILL.md) 的沙箱约定段。
4
+
5
+ ## 何时用
6
+
7
+ 用户要列出、查看、创建、更新或删除某个妙搭应用内的平台角色,管理角色的用户、部门或群成员,或查询某个用户在应用中命中的角色时使用。多维表格 / Base 的角色与权限不走本命令域;设置谁能访问应用走 `+access-scope-*`,不要路由到本命令域。
8
+
9
+ ## 命令一览
10
+
11
+ | 命令 | 做什么 | 关键参数 |
12
+ |---|---|---|
13
+ | `+role-list` | 分页列出角色,或按名称筛选角色 | `--app-id`、`--name`、`--page-size`/`--page-token` |
14
+ | `+role-get` | 根据真实 `role_id` 读取角色详情 | `--app-id`、`--role-id` |
15
+ | `+role-match-list` | 查询指定用户命中的角色 | `--app-id`、`--user-id` |
16
+ | `+role-create` | 创建角色 | `--app-id`、`--name`、`--description`、`--role-id` |
17
+ | `+role-update` | 更新角色名称或描述 | `--app-id`、`--role-id`、`--name`/`--description` |
18
+ | `+role-delete` | 永久删除角色 | `--app-id`、`--role-id`、`--yes` |
19
+ | `+role-member-list` | 查询角色的用户、部门和群成员 | `--app-id`、`--role-id`、`--member-type` |
20
+ | `+role-member-add` | 向角色添加用户、部门或群成员 | `--app-id`、`--role-id`、`--users`/`--departments`/`--chats` |
21
+ | `+role-member-remove` | 定向移除或清空角色成员 | `--app-id`、`--role-id`、成员参数或 `--all`、`--yes` |
22
+
23
+ ## 约定(先读)
24
+
25
+ - 应用 id 在环境变量 `app_id` 里,所有命令用 `--app-id "$app_id"`;其角色和成员只使用 `apps +role-*` / `apps +role-member-*`,不要改走 Base 角色命令或裸 bitable API。
26
+ - 角色名称不是 `role_id`。只有名称时优先用 `+role-list --name` 精确解析;若已取得完整分页列表,也可从中证明精确名称唯一命中。0 条如实报告,多条让用户消歧,唯一命中后才使用返回的真实 ID。
27
+ - `+role-list` 返回 `has_more=true` 时,用本页 `page_token` 继续查询,直到 `has_more=false`;不要根据 `total` 补造条目。
28
+ - `+role-list`、`+role-get`、`+role-match-list` 的角色数据分别位于 `data.items`、`data.role`、`data.roles`,不要混用。
29
+ - 同一角色的写入及依赖该写入结果的操作必须串行。不同角色的独立操作只有在每次写入可单独追溯、失败不影响其它目标且分别验收时才可并行;否则保持串行。互不依赖的名称解析或只读查询可并行。
30
+
31
+ ## 各命令
32
+
33
+ ### 查询角色
34
+
35
+ ```bash
36
+ lark-cli apps +role-list --app-id "$app_id" --page-size 100
37
+ lark-cli apps +role-list --app-id "$app_id" --name '<exact_name>'
38
+ lark-cli apps +role-get --app-id "$app_id" --role-id <role_id>
39
+ lark-cli apps +role-match-list --app-id "$app_id" --user-id <ou_x>
40
+ ```
41
+
42
+ 整理角色列表时保留 `role_id`、`name` 和 `description`。不要猜测未知 `role_id`,也不要从同名候选中静默选择。
43
+ `items=[]` 时直接报告当前没有角色;不要为表格补造“无”或 `N/A` 占位行。
44
+ `+role-match-list --user-id` 只接受 `ou_...`;用户给的是姓名、邮箱或手机号时,先解析唯一 open ID(见「成员 ID 解析」),再查询命中角色。
45
+
46
+ ### 创建与更新
47
+
48
+ ```bash
49
+ lark-cli apps +role-create --app-id "$app_id" --name '<name>' \
50
+ --description '<description>'
51
+
52
+ # 只修改名称
53
+ lark-cli apps +role-update --app-id "$app_id" --role-id <role_id> \
54
+ --name '<new_name>' --format json
55
+
56
+ # 只修改描述
57
+ lark-cli apps +role-update --app-id "$app_id" --role-id <role_id> \
58
+ --description '<new_description>' --format json
59
+ ```
60
+
61
+ - `--description` 和创建时的 `--role-id` 可选;仅在确实需要稳定 ID 时传 `--role-id`,创建后不能修改。
62
+ - 更新时只传用户明确要求变更的字段。
63
+ - 成功响应中的角色位于 `data.role`。只有用户要求独立验证,或结果将用于后续高风险操作时,才额外执行 `+role-get`。
64
+
65
+ ### 删除角色
66
+
67
+ 普通“删除某角色”请求只说明目标,**不等于不可逆确认**。如果用户尚未明确确认删除后果,本轮只能定位角色、读取完整成员并说明影响,最后请求确认;不得在同一轮自动追加 `--yes`。用户已明确确认不可逆删除时才继续。
68
+
69
+ 只有名称时仍按上述规则唯一解析,优先使用 `+role-list --name`。目标写前已不存在时立即停止,如实说明本次是 no-op、没有执行删除,不能把“当前不存在”表述为“删除成功”。
70
+
71
+ 删除前读取准确角色和完整成员范围,向用户说明 app、role、`users` / `departments` / `chats` 影响;得到不可逆删除确认后才使用 `--yes`:
72
+
73
+ ```bash
74
+ lark-cli apps +role-get --app-id "$app_id" --role-id <role_id>
75
+ lark-cli apps +role-member-list --app-id "$app_id" --role-id <role_id>
76
+ lark-cli apps +role-delete --app-id "$app_id" --role-id <role_id> --yes
77
+ ```
78
+
79
+ 成功响应包含匹配的 `data.role_id` 和 `data.deleted=true`。只有用户明确要求独立验证删除结果时,才再用 `+role-list --name` 检查目标 ID 已不存在。
80
+
81
+ ### 成员 ID 解析
82
+
83
+ 成员 flags 只接受 open ID:用户 `ou_...`、部门 `od-...`、群 `oc_...`。用户已提供对应类型的合法 open ID 时直接使用;只有名称或邮箱时才解析。
84
+ 对象类型以用户语义为准,不能互换解析器:用户走通讯录用户搜索,群走群搜索;沙箱内没有可用的部门搜索命令,部门让用户直接提供 `od-...`。
85
+
86
+ ```bash
87
+ # 用户:每个姓名或邮箱单独查询。
88
+ lark-cli contact +search-user --query '<姓名或邮箱>' \
89
+ --exclude-external-users --page-size 30
90
+
91
+ # 群:拉完分页,只接受名称精确匹配的唯一 chat_id。
92
+ lark-cli im +chat-search --query '<群名称>' --page-size 50
93
+ ```
94
+
95
+ - 只接受与输入姓名、邮箱或群名精确匹配的唯一结果。0 条、多条或分页未完成时停止写入并让用户补充或消歧。
96
+ - 多个对象逐个解析。全部解析成功且总数不超过 100 后,按类型放入一次成员写入;任一对象失败时不要部分写入,也不要自动拆批。
97
+ - `lark-cli api` 不在沙箱命令白名单内,会被策略直接拒绝,**不要**用它解析部门或兜底其它对象;解析失败时让用户直接提供 open ID,不要改用猜测或模糊匹配。
98
+
99
+ ### 成员操作
100
+
101
+ ```bash
102
+ # 省略 --member-type,返回完整 users / departments / chats。
103
+ lark-cli apps +role-member-list --app-id "$app_id" --role-id <role_id>
104
+
105
+ lark-cli apps +role-member-add --app-id "$app_id" --role-id <role_id> \
106
+ --users ou_x,ou_y --departments od-x --chats oc_x
107
+
108
+ lark-cli apps +role-member-remove --app-id "$app_id" --role-id <role_id> \
109
+ --users ou_x --yes
110
+
111
+ # 清空成员,不删除角色。
112
+ lark-cli apps +role-member-remove --app-id "$app_id" --role-id <role_id> \
113
+ --all --yes
114
+ ```
115
+
116
+ - `+role-member-list` 不分页;`--member-type` 只返回选中类型的字段,未返回的成员字段表示“未查询”而不是空。影响确认或完整比较时必须省略它。
117
+ - 汇总 `--member-type` 结果时明确这是过滤投影,不得据此断言角色没有其它类型成员。
118
+ - 用户要求 CLI 原生 table 时,直接执行 `+role-member-list --format table`;可原样转发或做事实摘要,不要先取 JSON 再手工重建一张替代表格。
119
+ - 写入和依赖其结果的回读不得放进同一个并发批次;必须等待写入完整返回成功后,再单独发起回读。误并发时只能以写入完成后的新回读作为结果证据。
120
+ - 添加前仅在用户要求独立证明或确认其他成员类型未变化时读取完整基线,并在写后完整回读;否则成功响应即可作为结果。
121
+ - 定向移除前确认准确成员及影响。若需要证明结果,写后完整回读;不要把过滤结果当作完整成员集合。
122
+ - `--all` 前读取完整成员范围并确认;成功后执行一次无过滤 `+role-member-list`,确认三个成员数组均为空。