@dev-workflow/skill 0.1.0
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/LICENSE +21 -0
- package/README.md +80 -0
- package/bin/cli.mjs +9 -0
- package/package.json +39 -0
- package/skills/artifact/README.md +23 -0
- package/skills/execution/devFlow/SKILL.md +341 -0
- package/skills/execution/devFlow/agents/openai.yaml +7 -0
- package/skills/execution/devFlow/domains/backend/references/api-tech.md +173 -0
- package/skills/execution/devFlow/domains/backend/scripts/check_api_tech_doc.mjs +170 -0
- package/skills/execution/devFlow/domains/backend/scripts/check_api_tech_doc.test.mjs +89 -0
- package/skills/execution/devFlow/domains/backend/templates/api-tech.md +164 -0
- package/skills/execution/devFlow/domains/frontend/references/contract-check.md +270 -0
- package/skills/execution/devFlow/domains/frontend/references/foundation-freeze.md +92 -0
- package/skills/execution/devFlow/domains/frontend/references/lightweight-flow.md +55 -0
- package/skills/execution/devFlow/domains/frontend/references/page-build.md +268 -0
- package/skills/execution/devFlow/domains/frontend/references/page-tech.md +414 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/field-common.md +69 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/fields-complex.md +105 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/fields-id-code.md +44 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/fields-number-date.md +106 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/fields-relation.md +144 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/fields-selectors.md +102 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/fields-text.md +130 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/index.md +42 -0
- package/skills/execution/devFlow/domains/frontend/references/product-design-specs/interaction.md +61 -0
- package/skills/execution/devFlow/domains/frontend/scripts/check_page_tech_doc.mjs +82 -0
- package/skills/execution/devFlow/domains/frontend/scripts/contract_check_static.mjs +145 -0
- package/skills/execution/devFlow/domains/frontend/scripts/generate_foundation_summary.mjs +224 -0
- package/skills/execution/devFlow/domains/frontend/templates/contract-report.md +66 -0
- package/skills/execution/devFlow/domains/frontend/templates/mini-plan-l0.md +7 -0
- package/skills/execution/devFlow/domains/frontend/templates/mini-plan-l1.md +9 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-build/component.tsx.tpl +8 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-build/constants.ts.tpl +5 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-build/index.ts.tpl +1 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-build/route.tsx.tpl +11 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-build/service.ts.tpl +17 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-build/types.ts.tpl +11 -0
- package/skills/execution/devFlow/domains/frontend/templates/page-tech.md +103 -0
- package/skills/execution/devFlow/domains/requirement/references/prd-review.md +129 -0
- package/skills/execution/devFlow/domains/requirement/templates/prd-review.md +57 -0
- package/skills/execution/figmaSync/SKILL.md +349 -0
- package/skills/execution/figmaSync/chapters/apply.md +177 -0
- package/skills/execution/figmaSync/chapters/plan.md +359 -0
- package/skills/execution/figmaSync/chapters/prepare.md +47 -0
- package/skills/execution/figmaSync/examples/native-css.md +129 -0
- package/skills/execution/figmaSync/examples/plan-doc-sample.md +39 -0
- package/skills/execution/figmaSync/scripts/_shared/session-log.mjs +82 -0
- package/skills/execution/figmaSync/scripts/_shared/token-resolver.mjs +132 -0
- package/skills/execution/figmaSync/scripts/_shared/token-source.mjs +145 -0
- package/skills/execution/figmaSync/scripts/figma-sync-report.mjs +448 -0
- package/skills/execution/figmaSync/scripts/icon-inventory.mjs +165 -0
- package/skills/execution/figmaSync/scripts/lookup-var.mjs +184 -0
- package/skills/execution/figmaSync/scripts/match-token.mjs +210 -0
- package/skills/execution/figmaSync/scripts/prepare-check.mjs +290 -0
- package/skills/execution/figmaSync/scripts/verify-plan.mjs +458 -0
- package/skills/execution/figmaSync/snapshots/README.md +13 -0
- package/skills/execution/figmaSync/snapshots/last-sync.md +1538 -0
- package/skills/execution/figmaSync/templates/PLAN.md.tpl +227 -0
- package/skills/review/consistency-checker/SKILL.md +112 -0
- package/skills/review/consistency-checker/rules/README.md +16 -0
- package/src/cli/agents.mjs +16 -0
- package/src/cli/copy.mjs +95 -0
- package/src/cli/install.mjs +131 -0
- package/src/cli/prompts.mjs +66 -0
- package/tools/lark/README.md +78 -0
- package/tools/lark/references/lark-doc.md +156 -0
- package/tools/lark/references/lark-read.md +235 -0
- package/tools/lark/references/prepare.md +147 -0
- package/tools/lark/scripts/lark_api.mjs +404 -0
- package/tools/lark/scripts/lark_api.test.mjs +63 -0
- package/tools/lark/scripts/lark_check_permissions.mjs +52 -0
- package/tools/lark/scripts/lark_publish_doc.mjs +299 -0
- package/tools/lark/scripts/lark_read_docx.mjs +328 -0
- package/tools/lark/scripts/markdown_to_lark_blocks.mjs +397 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# tools/lark
|
|
2
|
+
|
|
3
|
+
飞书能力共享工具。为 devFlow 及后续 skill(如 consistency-checker 读飞书 PRD)提供飞书 Open API 封装。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
tools/lark/
|
|
9
|
+
├── README.md
|
|
10
|
+
├── scripts/
|
|
11
|
+
│ ├── lark_api.mjs # 核心 Open API 封装(token / request)
|
|
12
|
+
│ ├── lark_api.test.mjs
|
|
13
|
+
│ ├── lark_read_docx.mjs # 读 Wiki / Docx,支持章节抽取和缓存
|
|
14
|
+
│ ├── lark_publish_doc.mjs # 发布 Markdown 到 Wiki 子文档
|
|
15
|
+
│ ├── lark_check_permissions.mjs # 检查目标文档 / 父节点访问权限
|
|
16
|
+
│ └── markdown_to_lark_blocks.mjs # Markdown → Docx blocks JSON
|
|
17
|
+
└── references/
|
|
18
|
+
├── prepare.md # 环境变量配置说明
|
|
19
|
+
├── lark-read.md # 读飞书文档规则
|
|
20
|
+
└── lark-doc.md # 写飞书文档规则
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 部署路径约定
|
|
24
|
+
|
|
25
|
+
skill / tool 打包部署时保持仓库路径:`.agent/tools/lark/scripts/`。
|
|
26
|
+
|
|
27
|
+
## 输入输出
|
|
28
|
+
|
|
29
|
+
### `lark_read_docx.mjs`
|
|
30
|
+
```
|
|
31
|
+
node .agent/tools/lark/scripts/lark_read_docx.mjs --url <飞书链接> [--section <标题>] [--level <层级>]
|
|
32
|
+
```
|
|
33
|
+
输出:文档全文或指定章节内容。
|
|
34
|
+
|
|
35
|
+
### `lark_publish_doc.mjs`
|
|
36
|
+
```
|
|
37
|
+
node .agent/tools/lark/scripts/lark_publish_doc.mjs --title <标题> --file <path>
|
|
38
|
+
node .agent/tools/lark/scripts/lark_publish_doc.mjs --title <标题> < document.md
|
|
39
|
+
```
|
|
40
|
+
输出:新建文档链接、node token、doc token、写入 block 数。
|
|
41
|
+
|
|
42
|
+
### `lark_check_permissions.mjs`
|
|
43
|
+
```
|
|
44
|
+
node .agent/tools/lark/scripts/lark_check_permissions.mjs [--url <飞书链接>]
|
|
45
|
+
```
|
|
46
|
+
输出:canRead / canWrite / 错误信息。
|
|
47
|
+
|
|
48
|
+
### `markdown_to_lark_blocks.mjs`
|
|
49
|
+
```
|
|
50
|
+
node .agent/tools/lark/scripts/markdown_to_lark_blocks.mjs --file <path>
|
|
51
|
+
```
|
|
52
|
+
输出:飞书 Docx blocks JSON。
|
|
53
|
+
|
|
54
|
+
## 环境变量
|
|
55
|
+
|
|
56
|
+
- `FEISHU_APP_ID` — 飞书应用 ID
|
|
57
|
+
- `FEISHU_APP_SECRET` — 飞书应用密钥
|
|
58
|
+
- `FEISHU_WIKI_PARENT_NODE_TOKEN` — Wiki 父节点 token(发布必需)
|
|
59
|
+
|
|
60
|
+
详见 [references/prepare.md](./references/prepare.md)。
|
|
61
|
+
|
|
62
|
+
## 自检
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
node --test tools/lark/scripts/lark_api.test.mjs
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 消费者
|
|
69
|
+
|
|
70
|
+
- `skills/execution/devFlow/` — `prepare` / `lark-read` / `lark-doc` 子命令
|
|
71
|
+
- `skills/review/consistency-checker/`(规划中)— 读飞书 PRD
|
|
72
|
+
- 未来其他需要飞书读写的 skill
|
|
73
|
+
|
|
74
|
+
## 安全约束
|
|
75
|
+
|
|
76
|
+
- 所有密钥只从环境变量读,不写死
|
|
77
|
+
- 脚本 stdout 不输出密钥
|
|
78
|
+
- 错误信息不泄露内部路径
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# lark-doc 子命令
|
|
2
|
+
|
|
3
|
+
`lark-doc`
|
|
4
|
+
用于把技术文档落地到飞书 Wiki 父节点下。它负责发布流程,不负责生成页面技术方案正文;正文生成应由
|
|
5
|
+
`page-tech` 等子命令完成。
|
|
6
|
+
|
|
7
|
+
## 定位
|
|
8
|
+
|
|
9
|
+
- 输入:Markdown 文档、已生成的技术方案正文,或用户要求先生成再发布的文档内容。
|
|
10
|
+
- 输出:飞书 Wiki 子文档链接。
|
|
11
|
+
- 默认目标:环境变量 `FEISHU_WIKI_PARENT_NODE_TOKEN` 指向的 Wiki 父节点。
|
|
12
|
+
|
|
13
|
+
## 环境变量
|
|
14
|
+
|
|
15
|
+
必须从环境变量读取配置:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
FEISHU_APP_ID
|
|
19
|
+
FEISHU_APP_SECRET
|
|
20
|
+
FEISHU_WIKI_PARENT_NODE_TOKEN
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
规则:
|
|
24
|
+
|
|
25
|
+
- 不要把 app secret 写入 Skill、仓库文件、技术方案正文或日志。
|
|
26
|
+
- 不要在最终回复中回显 secret。
|
|
27
|
+
- 如果任一变量缺失,停止发布并告诉用户缺少哪个变量。
|
|
28
|
+
- 飞书发布默认走 Open API(应用身份),不需要初始化 `lark-cli`;设 `FEISHU_BACKEND=larkcli` 可改用 lark-cli 用户身份,`auto` 自动择优。仅 larkcli 模式需先 `lark-cli auth login`;该模式下发布到 Wiki 需用户具备 Wiki 节点创建 scope,缺失时按 `prepare` 回退 openapi。
|
|
29
|
+
|
|
30
|
+
## 发布流程
|
|
31
|
+
|
|
32
|
+
优先使用脚本,不要现场重写发布逻辑。
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
node .agent/tools/lark/scripts/lark_publish_doc.mjs \
|
|
36
|
+
--title "客户管理页面开发技术方案" \
|
|
37
|
+
--file /path/to/document.md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
也可以通过 stdin 传入 Markdown:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
node .agent/tools/lark/scripts/lark_publish_doc.mjs --title "标题" < document.md
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
脚本固定处理:
|
|
47
|
+
|
|
48
|
+
1. 获取 `tenant_access_token`。
|
|
49
|
+
2. 使用 `FEISHU_WIKI_PARENT_NODE_TOKEN` 获取 Wiki 父节点信息。
|
|
50
|
+
3. 在 Wiki 父节点下创建新的 Docx 子文档。
|
|
51
|
+
4. 将 Markdown 转换为飞书 Docx blocks。
|
|
52
|
+
5. 按 40 个 blocks 一批写入,规避飞书单次 `children` 最大 50 的限制。
|
|
53
|
+
6. 写入后读取文档前部 blocks 校验。
|
|
54
|
+
7. 输出标题、链接、node token、doc token、写入 block 数。
|
|
55
|
+
|
|
56
|
+
发布前需要单独检查父节点权限时运行:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
node .agent/tools/lark/scripts/lark_check_permissions.mjs
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Wiki 节点规则
|
|
63
|
+
|
|
64
|
+
- 用户提供的 `/wiki/{token}`
|
|
65
|
+
链接中的 token 应视为 Wiki 节点 token,不要当作普通云盘 `folder_token`。
|
|
66
|
+
- 默认父节点 token 来自 `FEISHU_WIKI_PARENT_NODE_TOKEN`。
|
|
67
|
+
- 如果用户提供了新的 Wiki 链接,本次发布优先使用用户提供的 token。
|
|
68
|
+
- 如果应用身份没有权限访问父节点,不要绕过;提示用户需要给应用授权该 Wiki 节点,或改用用户身份授权。
|
|
69
|
+
|
|
70
|
+
## 文档标题规则
|
|
71
|
+
|
|
72
|
+
标题优先级:
|
|
73
|
+
|
|
74
|
+
1. 用户明确给出的标题。
|
|
75
|
+
2. 技术方案中的一级标题。
|
|
76
|
+
3. 根据页面名称生成,例如 `{页面名称} 页面开发技术方案`。
|
|
77
|
+
4. 如果仍无法确定,向用户确认标题。
|
|
78
|
+
|
|
79
|
+
标题要求:
|
|
80
|
+
|
|
81
|
+
- 简短、可搜索。
|
|
82
|
+
- 不包含密钥、token 或临时调试信息。
|
|
83
|
+
|
|
84
|
+
## Markdown 转 Docx blocks 规则
|
|
85
|
+
|
|
86
|
+
`scripts/markdown_to_lark_blocks.mjs` 必须支持:
|
|
87
|
+
|
|
88
|
+
- 一级到三级标题。
|
|
89
|
+
- 普通段落。
|
|
90
|
+
- 无序列表。
|
|
91
|
+
- 有序列表。
|
|
92
|
+
- 表格。
|
|
93
|
+
- 代码块。
|
|
94
|
+
- 引用 Mermaid 源码的代码块。
|
|
95
|
+
|
|
96
|
+
处理规则:
|
|
97
|
+
|
|
98
|
+
- Mermaid 代码块必须保留源码,便于后续修改。
|
|
99
|
+
- 页面结构和组件拆分图推荐使用 `flowchart LR`,发布时保留 Mermaid 源码。
|
|
100
|
+
- `mindmap` 只作为纯概念层级图的可选语法,不作为页面技术方案默认图。
|
|
101
|
+
- 如果文档包含由 `design-lark-chart`
|
|
102
|
+
生成的飞书画板链接,应在对应位置插入链接说明。
|
|
103
|
+
- 暂不支持的复杂 Markdown 语法不要丢弃,保留为普通文本或代码块,并在发布结果中说明。
|
|
104
|
+
- Markdown 表格可先降级为普通文本,除非用户明确要求飞书原生表格。
|
|
105
|
+
|
|
106
|
+
## 排版与飞书呈现规范(定稿模板)
|
|
107
|
+
|
|
108
|
+
这是经过真实评审打磨的定稿格式,所有经 `lark-doc` 发布的技术方案默认按此排版;各领域子命令(`api-tech`、`page-tech` 等)可在此基础上追加自己的硬规则。对应的 Markdown→飞书块语法由
|
|
109
|
+
`markdown_to_lark_blocks` + `lark_publish_doc` 支持:
|
|
110
|
+
|
|
111
|
+
- **引用块**:实体说明、接口「统一约定」等用 `> 文本` → 飞书引用块(左侧竖线),增强层次。
|
|
112
|
+
- **高亮块 callout**:`> [!WARNING] …`(⚠️)/ `> [!TIP] …`(💡)/ `> [!NOTE] …`(📝)→ 飞书高亮块。
|
|
113
|
+
只在 mock / 风险 / 重要提示处用,不滥用。
|
|
114
|
+
- **粗体 label**:`**用途**`、`**入参**`、`**出参**`、`**说明**`、`**错误码**` 等标签用 `**…**` 加粗。具体 label 集合由各领域子命令的呈现规则定义。
|
|
115
|
+
- **分隔线**:接口 / 大条目之间用 `---` → 飞书分割线,增加留白。
|
|
116
|
+
- **表格**:发布时自动设 `header_row`(灰底表头)+ 按内容自适应满宽列宽,单元格只含内容(行高紧凑)。
|
|
117
|
+
- **状态流转 / 流程**:用 ` ```mermaid ` 代码块(源码)。`lark-doc` 不渲染 Mermaid 成图,需要真图请走 `design-lark-chart` 生成飞书画板后在文档中引用(见「图表规则」)。
|
|
118
|
+
|
|
119
|
+
## 图表规则
|
|
120
|
+
|
|
121
|
+
- `lark-doc` 不负责渲染 Mermaid。
|
|
122
|
+
- 需要图形化落地到飞书时,先使用 `design-lark-chart` 生成图形产物,再由
|
|
123
|
+
`lark-doc` 在文档中引用。
|
|
124
|
+
- 如果只有 Mermaid 源码,可以直接写入代码块。
|
|
125
|
+
- 如果 `design-lark-chart` 或飞书画板链路提示需要
|
|
126
|
+
`lark-cli`,再按该 Skill 的要求初始化;不要为了普通文档读写提前初始化。
|
|
127
|
+
|
|
128
|
+
## 权限失败处理
|
|
129
|
+
|
|
130
|
+
常见失败原因:
|
|
131
|
+
|
|
132
|
+
- 应用没有 Wiki 父节点访问权限。
|
|
133
|
+
- 应用缺少云文档或 Wiki 相关 API 权限。
|
|
134
|
+
- 父节点 token 不是 Wiki 节点 token。
|
|
135
|
+
- 使用了应用身份,但目标空间只允许用户身份写入。
|
|
136
|
+
- 单次写入 children 超过 50。发布脚本已按 40 分批,手工调用时必须遵守。
|
|
137
|
+
|
|
138
|
+
处理规则:
|
|
139
|
+
|
|
140
|
+
- 明确说明失败原因和下一步处理建议。
|
|
141
|
+
- 不要改用其他未知目录。
|
|
142
|
+
- 不要创建到默认根目录。
|
|
143
|
+
|
|
144
|
+
## 标题与编号规则
|
|
145
|
+
|
|
146
|
+
- 分节使用原生 Markdown 标题层级(`#`/`##`/`###`),最多三级,对应飞书
|
|
147
|
+
heading1/2/3。
|
|
148
|
+
- 不在标题文本中手写序号(写 `## 接口设计`,不写 `## 2. 接口设计`);序号交给飞书文档的「标题自动编号」显示能力。
|
|
149
|
+
- 若发布后未显示蓝色序号,提示用户在飞书文档设置中开启「标题自动编号」,不通过手写序号绕过。
|
|
150
|
+
|
|
151
|
+
## 安全规则
|
|
152
|
+
|
|
153
|
+
- 不打印 `FEISHU_APP_SECRET`。
|
|
154
|
+
- 不把 access token 写入文件。
|
|
155
|
+
- 不把飞书 API 响应中的敏感字段完整贴入最终回复。
|
|
156
|
+
- 最终只返回文档链接、标题和必要的发布状态。
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# lark-read 子命令
|
|
2
|
+
|
|
3
|
+
`lark-read`
|
|
4
|
+
用于读取飞书云文档、Wiki 文档或文档链接,并将内容转换为后续研发工作流可用的上下文。它只负责读取和整理上下文,不负责生成最终技术方案,也不负责发布文档。
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- 输入:飞书文档链接、Wiki 链接、Docx 链接或用户指定的飞书文档 token。
|
|
9
|
+
- 输出:结构化上下文摘要。
|
|
10
|
+
- 用途:供 `page-tech`、后续技术方案子命令或人工审核使用。
|
|
11
|
+
|
|
12
|
+
## 环境变量
|
|
13
|
+
|
|
14
|
+
必须从环境变量读取配置:
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
FEISHU_APP_ID
|
|
18
|
+
FEISHU_APP_SECRET
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
规则:
|
|
22
|
+
|
|
23
|
+
- 不要把 app secret 写入 Skill、仓库文件、技术方案正文或日志。
|
|
24
|
+
- 不要在最终回复中回显 secret。
|
|
25
|
+
- 如果任一变量缺失,停止读取并告诉用户缺少哪个变量。
|
|
26
|
+
- 飞书读取默认走 Open API(应用身份),不需要初始化 `lark-cli`;设 `FEISHU_BACKEND=larkcli` 可改用 lark-cli 用户身份,`auto` 自动择优。仅 larkcli 模式需先 `lark-cli auth login`,配置见 `prepare`。
|
|
27
|
+
|
|
28
|
+
## 链接类型识别
|
|
29
|
+
|
|
30
|
+
根据 URL 路径判断类型:
|
|
31
|
+
|
|
32
|
+
| 链接形态 | 识别结果 | 处理方式 |
|
|
33
|
+
| ----------------------- | -------------------- | ------------------------------------------ |
|
|
34
|
+
| `/wiki/{token}` | Wiki 节点 token | 先获取 Wiki 节点信息,再取得真实文档 token |
|
|
35
|
+
| `/docx/{token}` | 新版 Docx 文档 token | 直接读取 Docx 文档 |
|
|
36
|
+
| `/docs/{token}` | 旧版 Docs 文档 token | 走旧版文档读取能力,或提示需要转换 |
|
|
37
|
+
| `/drive/folder/{token}` | 云盘文件夹 token | 不直接作为文档读取,需要用户指定具体文档 |
|
|
38
|
+
| 其他飞书链接 | 未知类型 | 不猜测,要求用户提供可读文档链接 |
|
|
39
|
+
|
|
40
|
+
规则:
|
|
41
|
+
|
|
42
|
+
- `/wiki/{token}` 不是普通文件夹 token。
|
|
43
|
+
- 不要把 Wiki token 当作 Docx token 直接读取。
|
|
44
|
+
- 如果链接类型不明确,必须向用户确认。
|
|
45
|
+
|
|
46
|
+
## 读取流程
|
|
47
|
+
|
|
48
|
+
优先使用脚本,不要现场重写飞书读取逻辑。
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
node .agent/tools/lark/scripts/lark_read_docx.mjs \
|
|
52
|
+
--url "https://example.feishu.cn/wiki/xxxx" \
|
|
53
|
+
--section "客户管理" \
|
|
54
|
+
--level 3
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
同一个文档需要读取多个章节时,必须一次性使用
|
|
58
|
+
`--sections`,不要对同一个飞书文档并发执行多个读取命令:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
node .agent/tools/lark/scripts/lark_read_docx.mjs \
|
|
62
|
+
--url "https://example.feishu.cn/wiki/xxxx" \
|
|
63
|
+
--sections "客户管理,新增客户(create-client),客户列表查询(client-list)"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
脚本固定处理:
|
|
67
|
+
|
|
68
|
+
- 获取 `tenant_access_token`。
|
|
69
|
+
- 识别 Wiki / Docx 链接。
|
|
70
|
+
- Wiki 节点自动解析真实 Docx token。
|
|
71
|
+
- 分页读取 Docx blocks。
|
|
72
|
+
- 解析飞书数字枚举 block type。
|
|
73
|
+
- 输出标题、block 数、标题目录和可选章节 Markdown。
|
|
74
|
+
- 支持 `--sections` 一次抽取多个章节,避免重复拉取同一篇文档。
|
|
75
|
+
- 支持 5 分钟本地临时缓存;同一轮写作中重复读取相同文档会复用缓存。需要强制刷新时传
|
|
76
|
+
`--no-cache`。
|
|
77
|
+
- 如果 `--level`
|
|
78
|
+
未命中,会自动按标题文本在所有层级中查找;唯一命中时直接返回,多个命中时返回候选项。
|
|
79
|
+
- 遇到飞书频控会在脚本内部重试;调用方不要手动并发读取同一文档或反复 sleep 重跑。
|
|
80
|
+
|
|
81
|
+
需要预检查权限时,先运行:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
node .agent/tools/lark/scripts/lark_check_permissions.mjs --url "飞书链接"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
只有脚本不满足任务时,才临时补充读取逻辑,并把可复用能力沉淀回脚本。
|
|
88
|
+
|
|
89
|
+
## 输出格式
|
|
90
|
+
|
|
91
|
+
读取后输出:
|
|
92
|
+
|
|
93
|
+
- 文档标题
|
|
94
|
+
- 文档链接
|
|
95
|
+
- 文档类型
|
|
96
|
+
- 主要章节
|
|
97
|
+
- 原始内容摘要
|
|
98
|
+
- 结构化信息
|
|
99
|
+
- 待确认项
|
|
100
|
+
|
|
101
|
+
## 给下游子命令的上下文格式
|
|
102
|
+
|
|
103
|
+
读取结果按下游子命令选择输出结构。触发场景默认对应关系:`page-tech` /
|
|
104
|
+
`page-build` / `contract-check` 用「前端上下文」;`api-tech` 用「后端上下文」。
|
|
105
|
+
如果同一文档同时供前后端使用,分别输出两份,不合并成一份。
|
|
106
|
+
|
|
107
|
+
### 前端上下文(page-tech 等前端子命令)
|
|
108
|
+
|
|
109
|
+
```md
|
|
110
|
+
## 飞书文档上下文
|
|
111
|
+
|
|
112
|
+
### 文档信息
|
|
113
|
+
|
|
114
|
+
- 标题:
|
|
115
|
+
- 链接:
|
|
116
|
+
- 类型:
|
|
117
|
+
|
|
118
|
+
### 页面基础信息
|
|
119
|
+
|
|
120
|
+
- 页面名称:
|
|
121
|
+
- 所属模块:
|
|
122
|
+
- 页面类型:
|
|
123
|
+
|
|
124
|
+
### 页面目标
|
|
125
|
+
|
|
126
|
+
### 页面范围
|
|
127
|
+
|
|
128
|
+
- 页面入口:
|
|
129
|
+
- 页面结构:
|
|
130
|
+
- 页面状态:
|
|
131
|
+
- 非目标范围:
|
|
132
|
+
|
|
133
|
+
### 功能需求
|
|
134
|
+
|
|
135
|
+
### 字段清单
|
|
136
|
+
|
|
137
|
+
### 接口信息
|
|
138
|
+
|
|
139
|
+
### 交互规则
|
|
140
|
+
|
|
141
|
+
### 权限要求
|
|
142
|
+
|
|
143
|
+
### 非功能要求
|
|
144
|
+
|
|
145
|
+
### 待确认项
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 后端上下文(api-tech 子命令)
|
|
149
|
+
|
|
150
|
+
```md
|
|
151
|
+
## 飞书文档上下文
|
|
152
|
+
|
|
153
|
+
### 文档信息
|
|
154
|
+
|
|
155
|
+
- 标题:
|
|
156
|
+
- 链接:
|
|
157
|
+
- 类型:
|
|
158
|
+
|
|
159
|
+
### 服务 / 模块目标
|
|
160
|
+
|
|
161
|
+
### 接口需求
|
|
162
|
+
|
|
163
|
+
### 字段 / 数据结构
|
|
164
|
+
|
|
165
|
+
### 业务流程
|
|
166
|
+
|
|
167
|
+
### 错误与边界
|
|
168
|
+
|
|
169
|
+
### 待确认项
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
规则:
|
|
173
|
+
|
|
174
|
+
- 没有在文档中出现的信息不要补全。
|
|
175
|
+
- 可以做结构化归纳,但不能改变原文含义。
|
|
176
|
+
- 如果原文存在冲突,保留冲突并写入待确认项。
|
|
177
|
+
- 如果同一文档要抽取 PRD 多个页面或接口多个小节,先用 `--sections`
|
|
178
|
+
一次读取;只有不同飞书文档之间才可以并行读取。
|
|
179
|
+
|
|
180
|
+
## Markdown 转换规则
|
|
181
|
+
|
|
182
|
+
脚本读取飞书 blocks 后,优先转换为 Markdown 风格文本:
|
|
183
|
+
|
|
184
|
+
- 标题保留层级。
|
|
185
|
+
- 段落保留原文。
|
|
186
|
+
- 列表保留顺序。
|
|
187
|
+
- 表格尽量转成 Markdown 表格。
|
|
188
|
+
- 代码块保留语言标识。
|
|
189
|
+
- 图片、附件、链接保留名称和 URL。
|
|
190
|
+
- 无法解析的 block 类型保留为占位说明。
|
|
191
|
+
|
|
192
|
+
### 行内样式对齐
|
|
193
|
+
|
|
194
|
+
飞书 `text_run.text_element_style` 与 Markdown 语义按下表对齐,嵌套顺序固定为
|
|
195
|
+
`link > strikethrough > bold > italic > inline_code`(从外到内)。`inline_code`
|
|
196
|
+
必须在最内层:Markdown 反引号内的内容不会被解析,若把 `~~x~~` 反过来包裹会渲染成字面横线而非删除线。
|
|
197
|
+
|
|
198
|
+
| 飞书样式 | Markdown 输出 | 备注 |
|
|
199
|
+
| ------------------------------- | ----------------------- | --------------------------------- |
|
|
200
|
+
| `bold` | `**text**` | |
|
|
201
|
+
| `italic` | `*text*` | |
|
|
202
|
+
| `strikethrough` | `~~text~~` | 文档中间的横线 = 删除语义 |
|
|
203
|
+
| `inline_code` | `` `text` `` | |
|
|
204
|
+
| `link.url` | `[text](url)` | URL 尝试 `decodeURIComponent` |
|
|
205
|
+
| `underline` | 忽略 | Markdown 无原生语法 |
|
|
206
|
+
| `text_color` / `background_color` | 忽略 | 同上 |
|
|
207
|
+
|
|
208
|
+
区分:
|
|
209
|
+
|
|
210
|
+
- 章节匹配(`--section` / `--sections`)用纯文本比较,不会因标题带样式而失配。
|
|
211
|
+
- 输出到下游子命令的 markdown 保留上述行内样式。
|
|
212
|
+
|
|
213
|
+
## 失败处理
|
|
214
|
+
|
|
215
|
+
常见失败原因:
|
|
216
|
+
|
|
217
|
+
- 应用没有文档查看权限。
|
|
218
|
+
- 应用没有 Wiki 节点访问权限。
|
|
219
|
+
- 应用缺少 `docx:document:readonly`。
|
|
220
|
+
- 链接不是文档链接。
|
|
221
|
+
- Wiki 节点下不是 Docx 文档。
|
|
222
|
+
- 文档使用了当前读取逻辑不支持的旧格式。
|
|
223
|
+
|
|
224
|
+
处理规则:
|
|
225
|
+
|
|
226
|
+
- 明确说明失败原因和下一步建议。
|
|
227
|
+
- 不要根据链接标题或 URL 猜测文档内容。
|
|
228
|
+
- 不要继续生成依赖该文档内容的技术方案。
|
|
229
|
+
|
|
230
|
+
## 安全规则
|
|
231
|
+
|
|
232
|
+
- 不打印 `FEISHU_APP_SECRET`。
|
|
233
|
+
- 不把 access token 写入文件。
|
|
234
|
+
- 不把飞书 API 响应中的敏感字段完整贴入最终回复。
|
|
235
|
+
- 最终只输出文档内容摘要、结构化上下文和必要的读取状态。
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# prepare 子命令
|
|
2
|
+
|
|
3
|
+
`prepare`
|
|
4
|
+
用于说明 `devFlow` 使用飞书读写能力前需要配置的环境变量和权限准备。它只负责给用户清晰的准备清单,不负责读取或发布飞书文档。
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- 输入:用户要求初始化、准备环境,或询问飞书配置。
|
|
9
|
+
- 输出:环境变量清单、变量用途、配置建议和后续检查方式。
|
|
10
|
+
- 目标:让用户在使用 `lark-read`、`lark-doc` 前知道必须准备什么。
|
|
11
|
+
|
|
12
|
+
## 后端选择(FEISHU_BACKEND)
|
|
13
|
+
|
|
14
|
+
飞书读写有两个后端,用环境变量 `FEISHU_BACKEND` 选择,下面的变量需求按后端区分:
|
|
15
|
+
|
|
16
|
+
- 缺省 / `openapi`:应用身份 + 飞书 Open API(现状)。需要 `FEISHU_APP_ID` /
|
|
17
|
+
`FEISHU_APP_SECRET`,且目标文档 / Wiki 节点要逐一授权给应用。
|
|
18
|
+
- `larkcli`:通过 `lark-cli` 以**用户身份**调用同样的 Open API,免去逐篇授权。不使用
|
|
19
|
+
`FEISHU_APP_ID/SECRET`,改由 `lark-cli auth login` 登录授权。可选 `FEISHU_LARKCLI_AS`(默认
|
|
20
|
+
`user`)切换 user / bot 身份,`FEISHU_LARKCLI_BIN` 覆盖 lark-cli 路径。
|
|
21
|
+
- `auto`:`lark-cli` 已登录则用 larkcli,否则回退 openapi;两者都不可用时报清晰错误。
|
|
22
|
+
|
|
23
|
+
## openapi 模式必需环境变量
|
|
24
|
+
|
|
25
|
+
openapi(或 auto 回退到 openapi)时必须配置:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
FEISHU_APP_ID
|
|
29
|
+
FEISHU_APP_SECRET
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
用途:
|
|
33
|
+
|
|
34
|
+
- `FEISHU_APP_ID`:飞书自建应用的 app id。
|
|
35
|
+
- `FEISHU_APP_SECRET`:飞书自建应用的 app secret,用于换取 tenant access token。
|
|
36
|
+
|
|
37
|
+
规则:
|
|
38
|
+
|
|
39
|
+
- 不要把 `FEISHU_APP_SECRET` 写入 Skill、仓库文件、技术方案正文或日志。
|
|
40
|
+
- 不要在最终回复中回显 `FEISHU_APP_SECRET`。
|
|
41
|
+
- openapi 模式缺少任一变量时,`lark-read` 和 `lark-doc` 都不能继续执行。
|
|
42
|
+
- openapi 模式直接使用飞书 Open API,不需要初始化 `lark-cli`;larkcli 模式不需要 app secret。
|
|
43
|
+
|
|
44
|
+
## larkcli 模式准备
|
|
45
|
+
|
|
46
|
+
设 `FEISHU_BACKEND=larkcli`(或 `auto` 且已登录)时:
|
|
47
|
+
|
|
48
|
+
1. 安装 `lark-cli`(`@larksuite/cli`),确保它在 `PATH` 中(或用 `FEISHU_LARKCLI_BIN` 指定)。
|
|
49
|
+
2. 运行 `lark-cli auth login` 完成用户身份授权,`lark-cli auth status` 确认对应身份为 `ready`。
|
|
50
|
+
3. 用户需具备所需 scope:读取需要 docx / wiki 读取相关 scope;**发布到 Wiki 还需要 Wiki 节点创建
|
|
51
|
+
scope**。若发布因缺 scope 失败,lark-cli 会返回清晰错误;此时重新 `lark-cli auth login` 扩展
|
|
52
|
+
scope,或本次改用 openapi 应用身份发布。
|
|
53
|
+
4. larkcli 模式不需要 `FEISHU_APP_ID/SECRET`;`FEISHU_WIKI_PARENT_NODE_TOKEN` 仍是发布所需的目标参数。
|
|
54
|
+
|
|
55
|
+
## 发布 Wiki 文档所需变量
|
|
56
|
+
|
|
57
|
+
发布到飞书 Wiki 父节点时,还必须配置:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
FEISHU_WIKI_PARENT_NODE_TOKEN
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
用途:
|
|
64
|
+
|
|
65
|
+
- `FEISHU_WIKI_PARENT_NODE_TOKEN`:默认发布目标的 Wiki 父节点 token。
|
|
66
|
+
|
|
67
|
+
规则:
|
|
68
|
+
|
|
69
|
+
- 只读取飞书文档时不需要该变量。
|
|
70
|
+
- 使用 `lark-doc` 发布文档时需要该变量,除非用户本次明确提供其他 Wiki 父节点链接。
|
|
71
|
+
- `/wiki/{token}` 中的 token 是 Wiki 节点 token,不是云盘文件夹 token。
|
|
72
|
+
- 如果应用身份没有父节点权限,不要改用未知目录;提示用户给应用授权该 Wiki 节点。
|
|
73
|
+
|
|
74
|
+
## 建议配置方式
|
|
75
|
+
|
|
76
|
+
建议把变量配置在本机 shell 环境、CI secret 或 Codex 运行环境中,不要提交到仓库。
|
|
77
|
+
|
|
78
|
+
本机全局配置优先写入:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
/Users/wenjin/.zshenv
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`.zshenv` 会在 zsh 启动时读取,适合给本机终端、Codex 运行环境和 Node 脚本提供全局环境变量。
|
|
85
|
+
|
|
86
|
+
示例:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# /Users/wenjin/.zshenv
|
|
90
|
+
export FEISHU_APP_ID="cli_xxx"
|
|
91
|
+
export FEISHU_APP_SECRET="***"
|
|
92
|
+
export FEISHU_WIKI_PARENT_NODE_TOKEN="xxx"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
如果只读取飞书文档:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# /Users/wenjin/.zshenv
|
|
99
|
+
export FEISHU_APP_ID="cli_xxx"
|
|
100
|
+
export FEISHU_APP_SECRET="***"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
修改后,新启动的 zsh 会自动读取;当前终端如需立即生效,可以执行:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
source /Users/wenjin/.zshenv
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 权限准备
|
|
110
|
+
|
|
111
|
+
飞书自建应用需要具备对应权限,并且目标文档或 Wiki 节点需要授权给该应用。
|
|
112
|
+
|
|
113
|
+
读取文档通常需要:
|
|
114
|
+
|
|
115
|
+
- 文档查看权限。
|
|
116
|
+
- Docx 文档读取相关 API 权限。
|
|
117
|
+
- 如果读取 Wiki 链接,还需要 Wiki 节点访问权限。
|
|
118
|
+
|
|
119
|
+
发布文档通常需要:
|
|
120
|
+
|
|
121
|
+
- Wiki 父节点访问权限。
|
|
122
|
+
- 创建 Wiki 子文档权限。
|
|
123
|
+
- Docx 文档写入相关 API 权限。
|
|
124
|
+
|
|
125
|
+
## 可选检查
|
|
126
|
+
|
|
127
|
+
检查目标文档或 Wiki 父节点权限时,优先使用脚本:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
node .agent/tools/lark/scripts/lark_check_permissions.mjs --url "飞书链接"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
检查默认 Wiki 父节点权限时:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
node .agent/tools/lark/scripts/lark_check_permissions.mjs
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## 输出要求
|
|
140
|
+
|
|
141
|
+
执行 `prepare` 时,回复用户:
|
|
142
|
+
|
|
143
|
+
1. 读取和发布分别需要哪些变量。
|
|
144
|
+
2. 哪些变量是必需,哪些只在发布 Wiki 时需要。
|
|
145
|
+
3. 如何配置变量,不要求写入仓库。
|
|
146
|
+
4. 普通飞书文档读写不需要初始化 `lark-cli`。
|
|
147
|
+
5. 如果后续要读文档或发布文档,应先确认应用权限和文档授权。
|