diff --git a/SKILL.md b/SKILL.md index 50e7ab7..5f5d017 100644 --- a/SKILL.md +++ b/SKILL.md @@ -61,11 +61,8 @@ python3 scripts/wiki_write.py --node "NODE_TOKEN" --file content.md ``` 支持 Markdown 转换。 -> ⚠️ **已知限制**:`md_to_blocks.py` 不支持 Markdown 表格语法(`| ... |`),会被转为纯文本而非飞书原生表格 block。如需表格,改用列表 + 加粗键名的格式,例如: -> ```markdown -> - **项目**:说明 -> - **模型**:DeepSeek V4 Pro -> ``` +> ✅ **表格支持**:`md_to_blocks.py` **完整支持 Markdown 表格语法**(`| ... |`),会转换为飞书原生表格 block(31)+ 单元格 block(32),由 `wiki_write.py` 自动走 descendant API 创建。直接写表格即可,无需改用列表。 +> (2026-08-11 更正:旧版文档误写「不支持表格」,已核实源码 `parse_table()` 完整实现表头/分隔线/行列构建,特此修正。) ### 删除页面 @@ -83,6 +80,13 @@ python3 scripts/create_digest.py --title "07.21 周二 早报" --content content ``` 自动挂到 `FEISHU_DIGEST_PARENT` 按周分组下。 +### 创建方案(方案库) + +```bash +python3 scripts/create_plan.py --title "方案标题" --content plan.md +``` +自动挂到「📋 方案库」节点(`LjXOwVZkriKmQwkjoixcnrSbnhd`);同名节点已存在则跳过不重复创建。 + ### 记录踩坑 ```bash diff --git a/scripts/create_plan.py b/scripts/create_plan.py new file mode 100644 index 0000000..51a0e04 --- /dev/null +++ b/scripts/create_plan.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""创建方案页面,挂到「📋 方案库」目录下""" +import json, sys, os, argparse +import subprocess + +SCRIPTS_DIR = os.path.dirname(os.path.abspath(__file__)) +SPACE_ID = os.environ.get('FEISHU_SPACE_ID', '7664817589230570761') +PLAN_PARENT = os.environ.get('FEISHU_PLAN_PARENT', 'LjXOwVZkriKmQwkjoixcnrSbnhd') # 📋 方案库 + +def get_token(): + r = subprocess.run(['python3', os.path.join(SCRIPTS_DIR, 'init_token.py')], + capture_output=True, text=True) + return json.loads(r.stdout)['token'] + +def create_plan(title, content_file=None, parent=None): + import requests + token = get_token() + h = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'} + parent = parent or PLAN_PARENT + + # 检查同名节点是否已存在(避免重复创建) + r = requests.get( + f'https://open.feishu.cn/open-apis/wiki/v2/spaces/{SPACE_ID}/nodes', + params={'parent_node_token': parent}, headers=h + ) + kids = r.json().get('data', {}).get('items', []) + for k in kids: + if k.get('title') == title: + print(json.dumps({'node_token': k['node_token'], 'obj_token': k.get('obj_token'), 'exists': True})) + return k + + # 创建新节点 + r = requests.post( + f'https://open.feishu.cn/open-apis/wiki/v2/spaces/{SPACE_ID}/nodes', + headers=h, + json={'obj_type': 'docx', 'node_type': 'origin', 'parent_node_token': parent, 'title': title} + ) + data = r.json() + if data.get('code') != 0: + raise Exception(f"Create plan node failed: {data.get('msg')}") + + node = data['data']['node'] + print(json.dumps({'node_token': node['node_token'], 'obj_token': node['obj_token'], 'exists': False})) + + # 写入内容 + if content_file: + subprocess.run( + ['python3', os.path.join(SCRIPTS_DIR, 'wiki_write.py'), '--node', node['node_token'], '--file', content_file], + check=True + ) + return node + +if __name__ == '__main__': + p = argparse.ArgumentParser(description='创建飞书方案库页面') + p.add_argument('--title', required=True, help='方案标题') + p.add_argument('--content', default=None, help='内容 markdown 文件路径') + p.add_argument('--parent', default=None, help='父节点 token(默认方案库)') + args = p.parse_args() + + try: + create_plan(args.title, args.content, args.parent) + except Exception as e: + print(f'Error: {e}', file=sys.stderr) + sys.exit(1)