UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

122 lines (81 loc) 7.14 kB
# mode=plan:从功能需求提取工作名称 + 决定 app_type ## P1:理解功能需求 若用户尚未描述功能需求,询问: ``` 你想实现什么功能?描述一下使用场景就行。 ``` **若用户已在消息中描述了需求(如"我需要一个看板上的燃尽图"),直接使用,不再追问。** 同时确认 siteDomain(应在 setup 阶段已获取)。 ## P1.5:决定 app_type(**HARD GATE — 创建后不可转**) > **关键不可逆**:`app_type``lpm create` 时锁死,**之后任何命令都不能转**——选错就只能 `lpm workspace clean` 删工程从头来。所以必须 plan 阶段定型,并在 P3 确认前向用户复述。 三档形态(与 `lpm create --app-type` 一一对应): | app_type | 适用场景 | 可配点位 | |---|---|---| | `normal` | 普通插件(看板 / 视图 / 按钮 / 控件 / 字段类型 / 拦截 / 监听 / 轻应用组件 ……) | page / view / dashboard / control / button / customField / liteAppComponent 等任意组合 | | `ai_node` | **工作流推进到某节点时自动跑 AI 任务** —— 节点完成后写回结果 | 单一 ai_node 点位 | | `ai_field` | **工作项视图里某字段值由 AI 算出** —— 用户填属性 → AI 写回字段值 | 单一 ai_field 点位 | ### 先记牢一个概念:ai_node / ai_field 的 properties 都是「输入」 ai_node 和 ai_field 的 `properties[]` **都是「输入」**——管理员或最终用户提供给 AI 任务的入参(一个「输出语言」单选也是输入)。两者**都没有「输出属性」**(「输出属性」是 liteAppComponent 专有概念);AI 的「输出」指**写回**:ai_node 走完成节点、ai_field 写字段值。 所以"需求里要一个可配置的参数 / 选项"——ai_node 和 ai_field **都能做**,拿它分不出档。判 ai_node↔ai_field 只看下面三条「决定轴」。 | 决定轴(判档只看这三条) | ai_node | ai_field | |---|---|---| | **谁填 property(输入)** | 管理员在【AI 配置】页预设 / 映射字段 | 最终用户在工作项视图给该字段填值 / 选值 | | **何时触发 AI** | 工作流推进到该节点时自动跑 | 用户给该字段填值 / 选值时即时触发 | | **AI 输出(写回)落点** | 节点(完成 AI 节点) | 字段值 | > 附带差异(是结果、不参与判档):ai_node 多了一个流程节点、可选节点卡片(前端代码);ai_field 多了一种字段类型、无前端产物(发布 frontVersion='0')。 ### 决策树(逐条匹配,第一条命中即停) **第一步:用户原话是否含 AI 信号**(任一命中即含): > AI / 大模型 / LLM / GPT / Claude / Prompt / 提示词 / 智能 / 自动生成 / 自动填充 / 自动分类 / 自动总结 - [ ] **不含 AI 信号 + 含"看板 / 图表 / 按钮 / 控件 / 字段类型 / 表单 / 导航 / 拦截 / 监听 / 统计 / 轻应用组件"任一** → `app_type=normal`,跳到 P2,不打扰用户 - [ ] **完全模糊**(既不含 AI 信号、也没具体点位词,如"我想做点东西") → 默认 `app_type=normal`,但 P3 确认时显式告知"默认按普通插件创建,要做 AI 节点 / AI 字段请打断" - [ ] **含 AI 信号** → 判 ai_node / ai_field。**默认问用户二选一**(把上面的决定轴表附给用户让他选),不替用户定这一不可逆选择。仅当用户原话已**不可两解地点明触发模型**才免问直接判: - 用户明说"工作流 / 流程推进到某节点(步骤)时自动执行" / "到 X 步自动跑",且无"用户手动给某字段填 / 选值"语义 → `app_type=ai_node`,跳到 P2(P3 复述确认) - 用户明说"在工作项 / 视图里给某字段填 / 选值后由 AI 算出该字段值" / "加一种 AI 字段类型"`app_type=ai_field`,跳到 P2 - 两边信号都沾、都不沾、或只说"要个可配置参数 + AI 出结果" → **问用户**(决定轴表二选一) > 决策完成后把判定结果记到对话上下文的 `appType` 变量上(`normal` / `ai_node` / `ai_field`),P3 复述 + apply 阶段都要用。 > **app_type 与后端可行性**:选 AI 应用(`ai_node` / `ai_field`)意味着 OpenAPI scope 是创建时的**固定集、之后不能扩**。若需求的后端要调的 OpenAPI 可能超出 AI 应用固定集,把这点纳入这次不可逆的 app_type 选择——真实可调清单在创建后第一次 `lpm perm list` 才能确认(feature 流程的后端可行性早检会做,见 [`feature-config-plan.md`](feature-config-plan.md) P5.1)。`normal` 工程的 scope 可按需 `perm apply`,无此约束。 ## P2:生成工作名称 从用户的功能描述中提取一个简短的**工作名称**: - 中文 ≤15 字,简洁有辨识度 - 只是开发阶段的标识,发布前会由 polish phase 重新生成正式名称 - 示例: - normal:"燃尽图看板""工时汇总""需求评审拦截" - ai_node:"PRD 自动生成节点""需求 AI 分类节点" - ai_field:"文档摘要 AI 字段""缺陷分类 AI 字段" **不需要**在此阶段收集:短描述、详情描述、分类。这些信息在功能实现后由 AI 自动总结更准确。 ## P3:向用户确认(不可省 — 真实数据动作护栏) > 真实数据写入护栏:见 [`shared.md`](shared.md) 根原则 3。本步是该原则在 create 场景的具体落地——用户未明确回复"确认创建"前,**不得进入 mode=apply**。 按 P1.5 判定的 `appType` 变量,**逐字输出**下面**对应一条**模板(占位符 `[站点域名]` / `[工作名称]` 各替换成实际值,其余文字原样): ### 当 `appType=normal` 时输出: ``` 即将创建插件工程: • 站点域名:[站点域名] • 工作名称:[工作名称] • 应用类型:普通插件(可任意组合点位) ← 创建后不可转,请核对 这只是开发阶段的标识,发布前会自动生成正式的插件名称和描述。 确认创建? ``` ### 当 `appType=ai_node` 时输出: ``` 即将创建插件工程: • 站点域名:[站点域名] • 工作名称:[工作名称] • 应用类型:AI 节点应用(工作流节点;只能配 1 个 ai_node 点位) ← 创建后不可转,请核对 这只是开发阶段的标识,发布前会自动生成正式的插件名称和描述。 确认创建? ``` ### 当 `appType=ai_field` 时输出: ``` 即将创建插件工程: • 站点域名:[站点域名] • 工作名称:[工作名称] • 应用类型:AI 字段应用(工作项字段;只能配 1 个 ai_field 点位) ← 创建后不可转,请核对 这只是开发阶段的标识,发布前会自动生成正式的插件名称和描述。 确认创建? ``` ### 仅当 P1.5 走的是"完全模糊→默认 normal"那条(既无 AI 信号又无点位词)时,在上面 normal 模板**之后**追加一行: ``` ⚠️ 你的需求里没明确说是 AI 应用,默认按普通插件创建。如果你想做 AI 节点 / AI 字段应用,请打断告诉我。 ```