@lark-project/cli
Version:
飞书项目插件开发工具
140 lines (103 loc) • 10.6 kB
Markdown
---
name: meegle-plugin-workflow
version: 2.0.0
description: |
Meegle 插件从零创建的完整编排(新插件全流程):创建工程 → 配点位 + 生成代码 → 本地调试确认 → 完善信息 → 发布上线 → 输出分享链接。
当用户说"从零做一个 xxx 插件"、"新建一个插件"、"我需要一个 xxx 插件"、"帮我做个 xxx 插件"、"飞书项目插件开发"、"Meegle 插件开发"等**整插件级别**的意图时触发。
**仅适用于新插件场景**:入口守卫会检查当前目录是否存在 `plugin.config.json`——已存在则说明是已有插件工程,应引导用户切换到 feature phase(功能迭代)。
存量插件加功能 → feature phase;只改插件元信息 → polish phase;只发布 → publish phase。
metadata:
requires:
bins: ["npx"]
cliHelp: "lpm --help"
---
# meegle-plugin-workflow Skill(新插件全流程)
## 入口守卫(MUST — 第一步,先于任何 Read)
> 本守卫**必须在读任何 reference 或 shared 规则之前**执行——只跑一条 bash 命令,不依赖任何 skill 知识。目的就是:如果当前目录已是插件工程,直接 bail,不继续加载 Phase 0/1/create 相关内容,省 token。
```bash
test -f ./plugin.config.json && echo "EXIST" || echo "NOT_EXIST"
```
| 检查结果 | 处理 |
|---------|------|
| `NOT_EXIST` | ✅ 继续下方"最少 Read 清单" → Phase 0 → Phase 1 → … |
| `EXIST` | ⛔ **立即停下**,不得 Read 本 skill 其它 reference、不得读 shared、不得进入 Phase 0。告知用户:"检测到当前目录已有插件工程(`plugin.config.json` 存在)。新插件全流程会与既有工程冲突。如果要在此插件上加功能请走 `feature phase`;如果只改元信息走 `polish phase`;如果只发布走 `publish phase`;如果确认要创建新插件请先切到空目录或删除 `plugin.config.json` 后重试。"等用户决策,不得继续 |
守卫设计理由:本 skill 的 Phase 1 会执行 `create` 创建工程,在已有 `plugin.config.json` 的目录跑会破坏既有状态。把守卫放到最前、先于任何 Read,可以避免 AI 路由误命中时仍加载一堆 create 相关 reference 浪费 token。
## 本 skill 的最少 Read 清单(守卫通过后再读)
**守卫返回 `NOT_EXIST` 之后再启动时只读 2 份**(把"立刻能跑 create 前"需要的规则读完即可):
- 本 SKILL.md(守卫、核心理念、checkpoint 机制,已在本次 Read 中覆盖)
- Phase 0 上下文采集 → Read [`workflow-phase-0-context.md`](workflow-phase-0-context.md)
**按需延后读**(进入对应阶段前再 Read):
- Phase 1 搭建工程 → `workflow-phase-1-scaffold.md`(Phase 0 结束、准备 create 时读)
- Phase 2 功能实现 → `workflow-phase-2-feature.md`(Phase 1 结束后读)
- Phase 3 发布上线 → `workflow-phase-3-release.md`(Phase 2 结束后读)
- 共享规则 [`shared.md`](shared.md):全量提交、删除点位前置检查等 **Phase 2 Stage Config 开始前**再读。Phase 1 create 阶段所需的"真实数据动作显式确认"(根原则 3)已直接内联到 `create phase` 的 `create-plan.md` P3,就地执行即可。
一次性预加载全部 phase reference 会浪费 context 且多数规则用不到。
## 核心理念
**用户不需要知道"插件开发"的分步概念。** 用户说"我要做一个在看板上显示燃尽图的插件",AI 识别这是新插件意图后,**自动跑完从创建到发布的全部流程**,把用户推到"拿到分享链接 / 可以给别人用"的完成态,不在中途停下让用户分步操作。
用户全程只在三个不可逆决策点做确认:
1. **Phase 2**:AI 推荐的点位方案是否符合预期(基于 schema 分析 + 用户原始需求)
2. **Phase 2 尾**:本地预览调试后,功能是否符合要求(不 OK 会回到 Phase 2 调点位或改代码)
3. **Phase 3**:发布前二次确认(`publish` 不可逆)
## 完整流程(Phase 0 → 3,线性执行)
```
入口守卫(无 plugin.config.json)
↓
Phase 0 — 上下文采集
钉死 siteDomain(CLI 硬前置;仅在对话上下文持有,不写盘)
↓
Phase 1 — 搭建工程,需用户确认是否新建
create phase(auth 由 CLI stderr 兜底,用户自跑 lpm login)
产出:plugin.config.json + 可运行骨架
↓
Phase 2 — 功能实现(绑定两步 + 本地调试确认)
feature phase(Stage Config 点位配置 → Stage Code 代码生成)
→ 本地调试:`lpm start --auto`
→ 用户确认功能 OK(不 OK 则回 Phase 2 迭代)
↓
Phase 3 — 发布上线
polish phase(AI 总结生成名称/描述/分类)
→ 向用户展示发布清单 → 等用户显式确认(不可逆护栏)
→ publish phase(update → release → publish)
→ 输出分享链接
```
**Phase 1.2 首次落盘,Phase 2 才理解**:Phase 0 / 1.1 仅在对话上下文持有 `siteDomain` / `pluginId` / `projectDir` / `projectRoot` / `originalRequirement`,**不落盘**;Phase 1.2(cd 到 plugin-dir 之后)一次性写入 `<plugin-dir>/.lpm-cache/state.json`,这是 state.json 的零号写入点。Phase 2 的 config.plan / code.plan 从该 state.json 读 originalRequirement。这样保证 state.json 永远只在 plugin-dir 一处、与 CLI 写的 `events.jsonl` / `schema/` / `config/` / `mcp/` 同栖一个 `.lpm-cache/`,不会出现 parent / plugin-dir 两份分裂。编排层不对原话做任何解析、不推导默认值;各 Phase 的校验在自己真正需要的数据源(schema / point-type doc / MCP)到位时才做。
> 插件形态(`app_type=normal` / `ai_node` / `ai_field`)由 create skill plan 阶段决策、`lpm create --app-type` 写入 plugin.config.json;workflow 不再中转——Phase 2/3 的子 skill 与 CLI 都直接以 plugin.config.json 为权威源读取,避免 state.json 与 plugin.config.json 双源不一致。
**Phase 2 内部委托**:config + code 的细节全在 feature phase 里,workflow 只负责触发和 checkpoint;feature phase 内部自成闭环(Stage Config → Stage Code),执行失败时回报给 workflow。
> **命名空间约定**:workflow 用 `Phase 0/1/2/3`,feature 用 `Stage Config / Stage Code`。两套命名故意不重叠,便于 checkpoint `step` 字段拼接(如 `2.config.apply` 表示 workflow Phase 2 委托给 feature 的 config.apply 子步骤)。
**Phase 3 发布护栏**:publish 是不可逆外部动作——即使在新插件全流程里,进入 publish 前也 MUST 向用户展示"即将发布到 Meegle 市场,发布后所有人可见"的确认提示,等用户显式说"确认发布"才执行。
## 各阶段详细流程
- Phase 0 → 读取 `workflow-phase-0-context.md`
- Phase 1 → 读取 `workflow-phase-1-scaffold.md`
- Phase 2 → 读取 `workflow-phase-2-feature.md`
- Phase 3 → 读取 `workflow-phase-3-release.md`
## 使用方式
本 phase 通常由 meegle-plugin 的 router 自动路由进入(见上层 [`../SKILL.md`](../SKILL.md) §1 入口 SOP)。触发本 skill 时用自然语言描述意图即可,router 会按 cwd context + 意图路由到本 phase。
**显式入口**(高级用法 / 调试 / 断点续跑):触发本 skill 时显式说 `phase=workflow` 或 `phase=workflow phase=<N>`,可跳过 router 的 phase 选择,直接进入指定 step。
可用 phase:
- 默认:新插件端到端全流程(推荐,默认跑到发布)
- `phase=1` — 仅 Phase 1(搭建工程)
- `phase=2` — 仅 Phase 2(功能实现 + 本地调试)
- `phase=3` — 仅 Phase 3(发布上线)
## 进度追踪(Checkpoint 机制)
读写命令 / 更新协议(执行前后字段写法)/ 恢复语义(success 跳过 · failed 重试 · running 重跑)见 [`checkpoint.md`](checkpoint.md)(权威源)。workflow 在协议之外的特有约定:
- **首次写入时机**:Phase 0 / 1.1 不写盘(plugin-dir 未创建 / cwd 未切到位);首次写入在 Phase 1.2(PHASE1_CWD_OK 通过后),把 `siteDomain` / `pluginId` / `projectDir` / `projectRoot` / `originalRequirement` 一次性落盘(详见 [`workflow-phase-1-scaffold.md`](workflow-phase-1-scaffold.md) 1.2)。create skill 不写 state.json,状态归属 workflow。
- **Phase 3 发布成功** → 删除 `.lpm-cache/state.json`(流程已完成)。
- **恢复摘要**:workflow 启动时读 checkpoint,有内容则先向用户展示摘要再续跑:
```
📍 上次执行到 Phase {phase} — {stepName}
最后完成:`{lastCommand}`({lastCommandStatus})
下一步:{nextStep} → `{nextCommand}`
继续吗?
```
- 被 workflow 调用的子 skill(feature / publish 等)同样更新此文件;独立调用时不强制。`.lpm-cache/` 应进 `.gitignore`(git 化指引见 [`publish-verify.md`](publish-verify.md) V3)。
## cwd 锚定规则
`context.projectRoot`(Phase 1.2 落盘的绝对路径)是插件工程目录的唯一权威锚点。Phase 1/2/3 全程每条 `lpm` 命令都带 `--cwd "<context.projectRoot>"` 前缀([`shared.md` 执行约定](shared.md) 是唯一权威源)——CLI 执行前 chdir 到插件根,`plugin.config.json` 与 `.lpm-cache` 都按它解析,下游 dispatcher 子进程继承该 cwd。不依赖 shell 跨命令保留 cwd,也不依赖"上次 cd 进去了"。
- lpm 报"非插件目录"等错 → 当前命令漏了 `--cwd`,补上 `--cwd "<context.projectRoot>"` 重跑(`projectRoot` 在对话上下文里,断点恢复时用 `lpm --cwd "<projectRoot>" ai state get` 拿)
- 写 / 读 checkpoint 走 `lpm ai state set` / `get`(路径由 CLI 锚定,见 [`checkpoint.md`](checkpoint.md))
## 关键设计原则
1. **新插件推到底**:默认跑到发布完成、输出分享链接——用户进来时的心智是"我要一个能用的 xxx 插件",不中途停下让用户手动进下一步
2. **不可逆动作显式确认**:Phase 3 publish 前必须用户显式同意,这是唯一不可省略的护栏
3. **延迟填充**:插件名称/描述/分类在发布前(Phase 3 polish)由 AI 基于实际功能总结生成,不在 Phase 1 创建时问用户
4. **快速到调试**:Phase 2 尾部强制引导本地调试,让用户在发布前通过真实预览确认功能
5. **容错兜底**:每个 Phase 失败不影响已完成的步骤,可从 `.lpm-cache/state.json` 断点继续
6. **精确恢复**:checkpoint 文件记录每一步 CLI 操作状态,中断后能告知用户确切进度