飞书多维表格与代码双向生成AI Agent开发

写在前面:由于开发环境与飞书服务器存在网络隔离,因此常规的通过官方 MCP 调用 AI 工具实现的开发无法实现,因此选择使用飞书 api 作为替代,实现对飞书多维表格的读取和修改。

名词理解:

  1. 多维表格:即多维表格本身,在浏览器中打开的状态
  2. 数据表:对应多维表格侧边栏中的表格,可以理解为多维表格的子表
  3. 视图:对应多维表格上方横栏中的内容,属于子表下的等级
  4. 记录:多维表格中具体的每条数据
  5. 字段:每列内容,可以理解为记录的分类

飞书api:

在调用飞书api前需创建飞书企业应用,随后可以使用飞书 api 调试台进行开发以及测试。

多维表格:

Bitable app token: MDZswMqPTisKtUkGFpbcnX2dnQb

app_token: AstpbL3KDa1BBzsTeOtcx9PonJg

“获取多维表格元数据”中填写 bitable app token 获取

“获取多维表格元数据”中填写 bitable app token 获取

https://open.feishu.cn/api-explorer/cli_a9311278f5f99bc9?apiName=get&from=op_doc&project=bitable&resource=app&version=v1

数据表:

table_id: tblT8Q6Q1Su0i3h2

“列出数据表”中填写 app_token 获取

https://open.feishu.cn/api-explorer/cli_a9311278f5f99bc9?apiName=list&from=op_doc&project=bitable&resource=app.table&version=v1

视图:

view_id: vewRxBsbqK

“列出视图” 中填写 app_token 与 table_id 获取

https://open.feishu.cn/api-explorer/cli_a9311278f5f99bc9?apiName=list&from=op_doc&project=bitable&resource=app.table.view&version=v1

记录:

record_id: recve2xs2qra3F

“查询记录” 中填写 app_token , table_id 并构建请求体查询获取

https://open.feishu.cn/api-explorer/cli_a9311278f5f99bc9?apiName=search&from=op_doc&project=bitable&resource=app.table.record&version=v1

字段:

field_id:fld8c2pKZu

“列出字段” 中填写 app_token , table_id , view_id 获取

https://open.feishu.cn/api-explorer/cli_a9311278f5f99bc9?apiName=list&from=op_doc&project=bitable&resource=app.table.field&version=v1

Cursor Skills 编写提示词:

了解飞书api如何调用后,可以通过编写python脚本实现飞书多维表格数据的拉取和推送,再根据响应体的内容和代码仓库中的代码即可实现对代码内容的比较,通过编写Cursor Skills实现完整的工作流。

以下是对目前已有Cursor Skills 编写生成时用到的提示词:

提取功能 初步测试

我需要你帮我实现一个 skills , 该 skills 需要实现:

  1. 调用根目录中的 python 脚本 test2.py 生成输出 txt 文件,随后读取该 txt 文件中返回的业务数据。
  2. 根据每项模块和子模块的值,创建 模块_子模块.cpp 文件(如果没有就创建,如果有就不需要做操作)
  3. 在对应文件中新增函数声明,函数声明为 接口声明中的内容
  4. 为函数声明补全注释,包括
@brief 接口名称
@return 接口声明中获取的函数返回值类型+返回值的内容
@param 参数的内容
@par type 接口类型的内容

按照函数声明分类

为我实现一个cursor skills,需要实现以下功能:

读取 local_tmp.txt 文件,提取接口声明信息,接口声明的内容是函数的声明。

按照函数的声明,在 driving 目录下的 src 源码中,查找匹配项,确认是否有相同函数声明的函数,并存入 txt 文件

按照下面内容进行分类:

  1. 函数名相同且函数体相同;
  2. 函数名相同但函数体不同;
  3. 函数名不同(local_tmp.txt 中有但是代码中没找到);

按照要求分成三类,分别存入不同名称的 txt 文件,依次为:same_body.txt, diff_body.txt, diff_name.txt


进一步更新该 skills , 对于函数名的比对包括 函数定义与签名, 对于接口声明中没有函数体的情况,按照函数体为空处理,依然参与函数体比对。(即如果接口声明中没有函数体,但源码中找到了相同函数名且有函数体的情况,按照函数体不同处理)

生成的 diff_body.txt 和 diff_name.txt 文件应当包含完整函数信息。即包含完整的函数声明(函数名与函数体),在后续操作中需要使用。

每次运行 skills 结束后应回复数据统计,即共多少接口声明,每个txt 文件分别存储了多少。


进一步更新该 skills,存储的 txt 文件中每条额外存储 local_tmp 中的 record_id。


进一步更新该 skills,存储在 diff_name.txt 中的记录完整存储 local_tmp 中获取的所有信息。

same_body.txt 处理


diff_body.txt 处理

为我实现一个新的 cursor skills,需要实现以下功能:

读取 diff_body.txt 文件,对于每个函数体的不同,给用户提供选择,明确标识哪个属于接口声明,哪个属于源码(如果函数体为空,则体现函数体为空)。

用户可以在两者中二选一进行保留:

  1. 选择保留接口声明的函数定义,则使用接口声明的函数体对源码对应函数进行覆盖。
    1. 如果源码有多处相同函数定义,则允许用户进一步进行选择(多选)
    2. 否则直接进行覆盖
  2. 选择保留源码的函数定义,则将 record_id 与源码的函数定义一起存储到 feishu_tmp.txt文件中 (如果没有则新建)

更新飞书表格

为我实现一个新的 cursor skills,需要实现以下功能:

读取 feishu_tmp.txt 文件,根据其中每条内容,在 push.py 中按照下面的结构填写请求体,按照存储的数据填写 record_id ,将存储的完整签名与完整函数体内容以换行为间隔进行拼接,填入接口声明。

全部填写完成后运行 push.py ,并反馈更新了多少函数接口声明。

    {
      "record_id": "",
      "fields": {
        "接口声明": ""
      }
    }

diff_name.txt 处理

为我实现一个新的 cursor skills,需要实现以下功能:

读取 diff_name.txt 文件,对于其中的每条记录,根据完整数据中”子模块”内容,确定对应的文件,映射关系如下:

Common = driving_common_info.cpp

MOD建图、 MOD = driving_mod.cpp

NOHD = driving_nohd.cpp

NOCD = driving_nocd.cpp

ACC/D130 = driving_acc_tja_mode.cpp

HandsOff = driving_handsoff.cpp

Lane Change = lc_app.cpp

Override = driving_override.cpp

调速 = driving_speedset.cpp

确认对应文件后,向用户询问是否在该文件中新增函数的定义,给出完整文件地址,函数名与函数体,用户可以选择新增或跳过。

如果用户选择新增,则在对应文件中新增函数声明,函数声明为 接口声明中的内容,即完整的函数名与函数体(如果有)

并为函数声明补全注释,包括

@brief 接口名称
@return 接口声明中获取的函数返回值类型+返回值的内容
@param 参数的内容
@par type 接口类型的内容

修改skills逻辑,如果用户选择新增,则在对应的.h文件中同样进行新增


完整流程 skills

为我实现一个新的 cursor skills,需要实现以下功能:

  1. 调用 pull.py 自动拉去飞书表格信息,如果成功返回则继续,否则返回失败信息。
  2. 调用 driving-api-declaration-match(默认用户进行选择)
  3. 如果 diff_body.txt 有内容,调用 driving-diff-body-resolve skills (默认用户进行选择)
  4. 如果 diff_name.txt 有内容,调用 driving-diff-name-add (默认用户进行选择)
  5. 如果 feishu_tmp.txt 有内容,调用 driving-feishu-push-from-tmp

发表评论