# SecScore 插件开发指南（V1）

## 1. 当前插件能力

当前版本支持：

- 在“插件管理”中安装、卸载、启用、禁用插件
- 启动时自动加载已启用插件
- 插件变更后自动热重载（安装/卸载/启用状态变化）
- 插件通过 `setup(ctx)` 运行，并可订阅应用事件

当前限制：

- `main` 入口建议使用单文件 ESM（不建议写相对 `import`）
- `permissions` 字段目前用于声明，不做强制拦截
- 插件运行在前端渲染层，属于“本机受信任代码”模型

## 2. 插件目录结构

```text
my-plugin/
  manifest.json
  main.js
```

`manifest.json` 最小示例：

```json
{
  "id": "demo.hello",
  "name": "Hello Plugin",
  "version": "0.1.0",
  "description": "我的第一个 SecScore 插件",
  "author": "YourName",
  "main": "main.js",
  "permissions": ["events.read"],
  "enabled": true
}
```

字段说明：

- `id`：插件唯一标识，仅允许字母/数字/`.`/`_`/`-`
- `name`：插件名称
- `version`：版本号
- `main`：入口脚本（相对路径）
- `enabled`：是否启用
- `permissions`：声明型权限数组（V1 不强制）

## 3. 入口脚本写法

`main.js` 示例：

```js
export default {
  setup(ctx) {
    ctx.log("插件已加载")

    const offRoute = ctx.on("route-changed", (detail) => {
      ctx.log("路由变化", detail)
    })

    const offData = ctx.on("data-updated", (detail) => {
      ctx.log("数据变化", detail)
    })

    // 示例：调用内置 API（仍受后端权限控制）
    ctx.api
      ?.queryStudents?.()
      .then((res) => ctx.log("学生数量", res?.data?.length ?? 0))
      .catch((err) => ctx.log("查询失败", String(err)))

    // 返回清理函数（可选）
    return () => {
      offRoute()
      offData()
      ctx.log("插件已卸载")
    }
  },
}
```

也支持：

```js
export default function setup(ctx) {
  ctx.log("以函数形式加载")
}
```

## 4. `ctx` 上下文

`setup(ctx)` 可用能力：

- `ctx.id` / `ctx.name` / `ctx.version`
- `ctx.permissions`：manifest 中的权限声明
- `ctx.api`：应用 `window.api`（可调用现有 IPC API）
- `ctx.log(message, meta?)`：插件日志输出
- `ctx.on(event, handler)`：订阅事件并返回取消订阅函数

可订阅事件：

- `data-updated`：对应 `ss:data-updated`
- `route-changed`：对应 `ss:route-changed`
- `plugins-updated`：对应 `ss:plugins-updated`

## 5. 安装与调试

1. 准备好插件目录（包含 `manifest.json` 与入口文件）
2. 打开 SecScore -> `插件管理` -> `安装插件`
3. 选择插件目录并确认安装
4. 查看日志：
   - 开发环境浏览器控制台
   - 或应用日志（设置页日志模块）

卸载行为说明：

- 卸载会删除安装到应用插件目录中的插件副本
- 源插件目录（你自己本地开发目录）不会被改动

## 6. 推荐开发流程

1. 先写最小插件（仅 `ctx.log`）
2. 再接入事件监听（`route-changed` / `data-updated`）
3. 最后增加 API 调用和容错处理（`try/catch`）
4. 升级版本时同步更新 `manifest.json` 的 `version`
