# 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 字段应用，请打断告诉我。
```
