@lark-project/cli
Version:
飞书项目插件开发工具
109 lines (79 loc) • 11.4 kB
Markdown
---
name: meegle-plugin
description: |
Meegle / 飞书项目插件开发的统一入口,覆盖插件全生命周期——创建工程、加/做/改/实现 feature、接住后端那一半的诉求(实现/补/改某点位服务端代码 → 申请 scope + 产交接包甩给后端会话)、完善信息、发布——进入后由内部 SOP 路由到对应 phase:
- 从零做/新建一个插件/飞书项目插件开发/Meegle 插件开发(创建工程 → 配点位+写代码 → 调试 → 完善信息 → 发布上线)
- 在已有工程上加/做/改/实现工作项 UI 元素(轻应用组件/按钮/Tab/视图/看板卡片/字段类型/表格列控件/详情页区块/排期组件 等)或它消费的平台数据;改点位展示逻辑/重新生成代码
- 只建空壳工程/只完善插件名称描述分类/只发布上线(发布/上线/部署/release/publish)
- 后端那一半——实现/补/改某点位服务端代码:收并验签 webhook 回调、调 Meegle OpenAPI 拿/写飞项数据、写回工作项/AI 节点/AI 字段、给前端提供 /api/proxy/* 代理、用 lpm perm 申请 OpenAPI scope;本 skill 做前置编排(申请 scope+汇总契约+产交接包甩给后端会话),「怎么写」由 meegle-plugin-backend skill 负责
也含咨询/规划口吻——理一下流程/理一下后端流程、怎么配/怎么写/怎么实现、用哪些接口(webhook 怎么收、怎么验签、OpenAPI 用哪些)、什么时候调、能加吗/能不能开、权限怎么开通、帮我看下服务端那一半、我想搞清楚 xxx 怎么落地——落到本仓即"实现"路径,应触发本 skill 走 lpm 工具链而非通用文档查询。
单条 CLI 命令查询/诊断走 meegle-plugin-cli;后端怎么写走 meegle-plugin-backend;业务数据(工作项/视图/需求/缺陷)走 meegle / lark-project。
metadata:
requires:
bins: ["npx"]
cliHelp: "lpm --help"
---
# Meegle Plugin
> **本 skill 一次加载即完整。** phase 之间、step 之间通过 `Read references/<file>.md` 推进,
> **不要再次 `Skill(meegle-plugin)`**。被异步中断(如询问用户)后,直接从中断点继续即可。
>
> **本 skill 不主动 `task_create` / TodoWrite。** 状态追踪走 `lpm ai state get/set`(CLI 把
> `.lpm-cache/state.json` 锚定到插件根;协议见 [`references/checkpoint.md`](references/checkpoint.md))。已有 todo 列表时只更新、不新建。
>
> 本 SKILL.md 负责 **phase 选择**(判用户意图 → 走哪个 phase)。`references/*-overview.md` 是各 phase 的理念 / 流程 / 守卫 + **该 phase 内部的 step/mode 序列**;
> 选定 phase 后 Read 对应 overview、按其序列执行——**phase 内部序列以 overview 为准,本文件 §3 只做 phase 选择 + 入口约束**。
## 0 · Always Read First
进入任何 phase 前先 Read 这两份(互不依赖,可并行 Read):
- [`references/shared.md`](references/shared.md) — 共享规则:认证、权限不足处理、安全规则、三条根原则、全量提交约束、删除点位 gate、MCP 检索 / 缓存协议
- [`references/checkpoint.md`](references/checkpoint.md) — `.lpm-cache/state.json` 断点协议(被 workflow 编排、或需要断点续跑时遵守)
## 1 · 入口 SOP(路由)
### Step 1.1 — 断点续跑检查
跑 `lpm ai state get`(读当前目录的 checkpoint;空输出则跳过):
- 有输出且含 `phase` / `step` → 向用户展示恢复摘要(上次到哪个 phase / step、`lastCommand` 状态、`nextStep`),等用户确认后**直接跳到该 phase**,跳过 Step 1.2 / 1.3。`lastCommandStatus="failed"` 时提示是否重试。
- 空输出 → 继续 Step 1.2。
### Step 1.2 — context 探测(确定性)
跑一条命令,按它输出的**单 token** 路由(判定逻辑在 CLI 里,这里只 pattern-match):
```bash
lpm check context
```
| token | 动作 |
|------|------|
| `PLUGIN_PROJECT` | `context = plugin-project`(cwd 是已存在插件工程),`PLUGIN_DIR=cwd`,进 Step 1.3 |
| `BACKEND_HANDLE_CWD` | `context = external-backend`(cwd 是后端向工程——`plugin.config.json` 标了 `backendOnly`,与目录名无关),`PLUGIN_DIR=cwd`。按意图分流:**只写 / 改 handler 代码(点位已配全)→ 进 `meegle-plugin-backend` skill**(跳过 Step 1.3);**要配 / 改点位配置 → 走 feature `stage=config`**(改点位即改数据,必经 Stage Config 护栏)|
| `NONE` | 先用一句话**复述你从用户原话里读到的需求**,再先问一个强感知问题——**这个插件要不要你自己写、自己迭代的前端界面(按钮 / Tab / 视图 / 看板卡片 / 详情页区块 / 自定义字段类型控件 等自定义界面)?** 按答案落点:<br>**① 要页面**:前端源码只活在你自管的 git 仓里,`lpm init` 只按模板 + 远端点位重建骨架、**拉不回你迭代过的前端代码**——从零新建 → `context = new-plugin`(空目录脚手架);迭代**已有**前端插件 → **必须 `cd` 回管理该前端代码的原仓库**(`context = plugin-project`);不在原仓就让用户切回去。<br>**② 纯服务端、不涉及页面**(webhook / OpenAPI / 写回 / AI 节点字段逻辑):config 可从远端 `get --remote` 重建、身份锚可临时建,**任何位置可干** → `context = external-backend`,给 pluginId+secret+siteDomain 就地干:纯查 / 申请 OpenAPI scope 用 perm(token-only、不建目录);点位已配全、只写 handler 代码 → 进 `meegle-plugin-backend` skill;**要配 / 改点位配置 → 建 config-only 工作区当身份锚(建法 + secret 见 [`feature-backend-handoff.md`](references/feature-backend-handoff.md) B2)→ `cd` 进去走 feature `stage=config`**(改数据必经 Stage Config 护栏)。⚠️ `ai_node` / `ai_field` / `listen_event` / `intercept` 整份配置都是后端用的、纯后端默认要配点位 → 默认 config-only;该纯后端插件**还没建** → 才回 `new-plugin` 用 `lpm create --app-type <无页面类型>` 建壳 |
### Step 1.3 — phase 选择
按 `context` + 用户原话查下表,**优先级从上到下、命中即停**。关键词是提示不是判定——用户措辞落在哪一行靠你在完整上下文里判断;**无把握时把这 5 个 phase 列给用户选**,不要猜。
| context | 用户意图信号 | phase |
|---------|-------------|-------|
| `plugin-project` | 在已有工程目录里又说"从零做 / 新建一个插件" | ⚠️ **拦截**:告知"当前目录已是插件工程,新插件全流程会破坏它;要在此工程上加功能用 feature,要新建请切到空目录",等用户决定 |
| `plugin-project` | 加 / 改功能、加点位 / 按钮 / Tab / 视图 / 字段 / 控件、改现有点位逻辑 / 重新生成代码 | `feature` |
| `plugin-project` | 只补 / 改服务端那一半、纯 webhook / OpenAPI / 写回、不碰前端 | `feature`(内部走 stage=backend 产交接包)|
| `plugin-project` | 完善插件信息 / 改名称 / 改描述 / 改分类 | `polish` |
| `plugin-project` | 发布 / 上线 / 部署 / release / publish | `publish` |
| `new-plugin` | 从零做一个完整可用的插件(典型:用户描述一个功能需求) | `workflow` |
| `new-plugin` | 明确只要一个空壳工程骨架("初始化插件项目骨架") | `create` |
> `external-backend` context:只写 / 改 handler 代码时 Step 1.2 已进 `meegle-plugin-backend` skill(跳过本表);要配 / 改点位配置则走 feature `stage=config`(直接进 Stage Config,同样不经本表的 phase 选择)。
**plugin-project 一律走 `feature`**:feature 内部按"碰不碰前端产物(`plugin.config.json` 的 `resources` / 点位 `entry`)"决定跑哪些 stage——
碰前端(要按钮 / 视图 / 卡片等 UI,哪怕同时要调 OpenAPI)→ 配点位 + 写前端,需要时末尾产后端交接包。
只动服务端、前端不变 → feature 直接走 `stage=backend` 产交接包(跳过 config / code)。"调 OpenAPI / webhook"措辞再强也先进 feature。
无命中 / 用户意图模糊 → 列出 `workflow / create / feature / polish / publish` 让用户选,不要默认。
### Step 1.4 — 进入 phase
按选定 phase 进入下方对应章节,先 Read 该 phase 的 `*-overview.md`(理念 / 流程 / phase 专属守卫),再按其 reference 序列执行。
显式入口:用户也可直接指定 phase(如发布场景),等价于跳过 Step 1.3 直接进对应 phase。
## 2 · 安全总纲(不可逆 / 真实数据动作——MUST 显式确认)
这些确认点贯穿所有 phase,**不可省略、不可被"看起来已确认"绕过**(详见 `references/shared.md` 根原则 3 的五类动作清单):
- **创建插件**(`lpm create`,app_type 不可逆)→ create phase 的 plan 步骤向用户确认后才 apply。
- **推送配置到后台**(`lpm local-config set` / `update --source-type=local`)→ feature 的 config.apply A0 展示 ADDED/MODIFIED/DELETED 清单、等用户明示。
- **开通 OpenAPI scope**(`lpm perm apply`)→ feature「→ 后端那一半」的 `lpm perm` 步骤列出 scope 清单、等用户点头(仅 normal 插件;AI 应用工程不 apply)。
- **发布插件**(`lpm publish`,发布到 Meegle 市场、所有人可见、不可逆)→ publish / workflow Phase 3 / 后端那一半单独跑到 `lpm publish` 前 MUST 展示"即将发布"提示、等用户显式说"确认发布"。
- workflow 路径有**三个**独立确认点:①Phase 2 点位方案 ②Phase 2 尾本地调试确认 ③Phase 3 发布前确认。"开始 Phase 3"≠"确认发布"——是两次独立确认。从 checkpoint 恢复到发布步骤时,**仍须重新走发布前确认**,不能因 `step` 已记录就跳过。
## 3 · 各 phase
判定走哪个 phase 后 Read 对应 overview、按其序列执行(进每步前 Read 对应 reference,不预加载)。**phase 内部的 step 序列 / 守卫 / 执行细节都在 overview**;不可逆确认点见 §2。
| phase | 何时 | 入口 |
|---|---|---|
| `create` | 只建空壳工程骨架(不配点位、不写代码)| Read [`create-overview.md`](references/create-overview.md) |
| `feature` | 已有工程上加 / 改 feature(前端 / 后端 / 点位)| Read [`feature-overview.md`](references/feature-overview.md) |
| `polish` | 完善名称 / 描述 / 分类 | Read [`polish-overview.md`](references/polish-overview.md) |
| `publish` | 同步配置 + 构建 + 发布 | Read [`publish-overview.md`](references/publish-overview.md) |
| `workflow` | 从零端到端做完整插件 | Read [`workflow-overview.md`](references/workflow-overview.md) |
> **没有独立的 `backend` phase**:后端那一半不是平级 phase,只是 feature / workflow 末尾「需要后端时产交接包甩给后端会话」的一步——编排是一次 relay(A 后端就绪在 [`feature-overview.md`](references/feature-overview.md)、B 后端交接在 [`feature-backend-handoff.md`](references/feature-backend-handoff.md));服务端「怎么写」由接手会话召回 `meegle-plugin-backend` skill,本 skill 不 Read。坐自己后端仓直接问后端写法 → Step 1.2 的 `external-backend` 直接进 `meegle-plugin-backend` skill。