# lzwcai-agile-db Skill 实现计划

## 目标
创建一个 Kilo skill 文件，为 AI Agent 提供 AgileDB 数据库操作的场景化工作流指导。

## Skill 文件路径
`.kilo/skills/lzwcai-agile-db/SKILL.md`

## Skill 内容

以下为完整的 SKILL.md 内容：

```markdown
# lzwcai-agile-db

AgileDB 数据库操作技能。为 AI Agent 提供数据源浏览、表数据 CRUD、SQL 执行和 AI 生成表结构的场景化工作流。

## 可用 MCP 工具

本 skill 基于 `lzwcai_mcp_agile_db` MCP Server，提供以下工具：

### 数据源管理
| 工具 | 功能 |
|------|------|
| `list_datasources` | 获取数据源列表 |
| `get_datasource_detail` | 获取数据源详情（含数据库、表结构） |
| `create_datasource` | 创建外部数据源 |
| `update_datasource` | 更新数据源 |
| `toggle_datasource_status` | 启用/停用数据源 |
| `delete_datasource` | 删除数据源 |

### 数据库与表管理
| 工具 | 功能 |
|------|------|
| `list_databases` | 获取数据源下的数据库列表 |
| `list_tables` | 获取数据库下的表列表 |
| `get_table_detail` | 获取表结构详情（字段、类型、主键） |
| `create_table` | 创建新表 |
| `alter_table` | 修改表结构 |
| `generate_table_by_description` | AI 根据自然语言生成表结构 |

### 表数据操作
| 工具 | 功能 |
|------|------|
| `query_table_data` | 查询表数据（分页） |
| `insert_table_row` | 插入一行数据 |
| `update_table_row` | 更新一行数据 |
| `delete_table_rows` | 删除数据行（按主键） |
| `export_table_excel` | 导出表数据为 Excel |

### SQL 执行
| 工具 | 功能 |
|------|------|
| `execute_sql` | 执行原生 SQL 查询 |

---

## 场景 1：浏览数据源

当用户想要了解有哪些数据源、数据库或表时，使用此流程。

### 工作流程

```
用户请求: "有哪些数据源？" / "看看 XX 数据源有哪些表？"
    ↓
1. 调用 list_datasources()
    ↓
2. 展示数据源列表（名称、类型、状态、数据库数、表数）
    ↓
3. 用户选择数据源后，调用 get_datasource_detail(datasourceId="xx")
    ↓
4. 展示数据库列表和实时表结构
```

### 示例

**用户**: "帮我看看有哪些数据源"

```
调用: list_datasources()
返回: [{id: "1", name: "订单系统", type: "builtin", status: 0, databases: 3, tables: 12}, ...]
回复: 共找到 3 个数据源：
      - 订单系统（内置，运行中，3 个库，12 张表）
      - 用户中心（外部 MySQL，运行中，1 个库，5 张表）
      - 报表系统（外部 PostgreSQL，已停止）
```

**用户**: "看看订单系统有哪些表"

```
调用: get_datasource_detail(datasourceId="1")
返回: {datasource: {...}, databases: [{name: "order_db", tables: [...]}]}
回复: 订单系统包含以下数据库：
      order_db:
        - orders (订单表, 15 个字段)
        - order_items (订单明细, 10 个字段)
        - users (用户表, 8 个字段)
```

### 注意事项
- 数据源状态：`0`=运行中，`1`=已停止
- 数据源类型：`builtin`=内置，`external`=外部
- 如果用户只说"查一下数据库"，先调用 `list_datasources()` 再引导选择

---

## 场景 2：查询表数据

当用户想要查看某张表的具体数据记录时，使用此流程。

### 工作流程

```
用户请求: "查一下 users 表的数据" / "看看前 20 条订单"
    ↓
1. 如果不知道 tableId，先浏览数据源找到目标表
    ↓
2. 调用 query_table_data(tableId="xx", pageNum=1, pageSize=10, target="prod")
    ↓
3. 展示数据（表格形式，包含字段名和值）
    ↓
4. 如果数据量大，提示用户可翻页或调整 pageSize
```

### 示例

**用户**: "查一下 users 表前 10 条数据"

```
调用: query_table_data(tableId="5", pageNum=1, pageSize=10)
返回: {
  columns: [{name: "id", type: "INTEGER"}, {name: "username", type: "VARCHAR"}, ...],
  data: [{id: 1, username: "admin", email: "admin@test.com"}, ...],
  total: 156
}
回复: users 表共 156 条记录，当前显示第 1-10 条：
      | id | username | email           | created_at          |
      |----|----------|-----------------|---------------------|
      | 1  | admin    | admin@test.com  | 2024-01-15 10:30:00 |
      | 2  | user1    | user1@test.com  | 2024-01-16 14:20:00 |
      ...
```

### 注意事项
- `target` 参数：`prod`=生产环境，`test`=测试环境，默认 `prod`
- 如果用户未指定数量，默认 `pageSize=10`
- 数据返回格式为对象数组（已自动转换表头）
- 如果用户说"翻页"，增加 `pageNum` 参数

---

## 场景 3：执行 SQL

当用户需要执行自定义 SQL 查询时，使用此流程。

### 工作流程

```
用户请求: "帮我执行 SQL..." / "查一下订单数大于 100 的用户"
    ↓
1. 如果用户直接提供 SQL，直接使用
   如果用户提供自然语言需求，先转换为 SQL
    ↓
2. 调用 execute_sql(datasourceId="xx", executableSql="SELECT ...")
    ↓
3. 展示查询结果
    ↓
4. 如果 SQL 执行失败，展示错误信息并建议修正
```

### 示例

**用户**: "统计每个地区的订单数量"

```
转换为 SQL: SELECT region, COUNT(*) as order_count FROM orders GROUP BY region ORDER BY order_count DESC

调用: execute_sql(
  datasourceId="1",
  executableSql="SELECT region, COUNT(*) as order_count FROM orders GROUP BY region ORDER BY order_count DESC"
)
返回: {
  columns: [{name: "region"}, {name: "order_count"}],
  data: [{region: "华东", order_count: 1250}, {region: "华南", order_count: 980}, ...]
}
回复: 各地区订单统计：
      | 地区 | 订单数 |
      |------|--------|
      | 华东 | 1,250  |
      | 华南 | 980    |
      | 华北 | 756    |
```

### 注意事项
- `datasourceId` 必须提供，如果用户未指定，先询问或使用最近使用的数据源
- `sqlTemplate` 可选，用于模板化查询
- `parameters` 可选，用于参数化查询（防止 SQL 注入）
- 执行危险操作（DELETE/DROP/UPDATE）前，**必须**向用户确认
- 如果查询结果超过 100 行，建议用户使用 `query_table_data` 代替

---

## 场景 4：增删改数据

当用户需要修改表中的数据时，使用此流程。

### 4.1 插入数据

```
用户请求: "新增一个用户，用户名是 test_user"
    ↓
1. 先调用 get_table_detail(tableId="xx") 了解表结构
    ↓
2. 确认必填字段（非空字段、无默认值字段）
    ↓
3. 调用 insert_table_row(tableId="xx", data={...})
    ↓
4. 确认插入成功
```

**示例**:

**用户**: "新增一个用户，用户名 test_user，邮箱 test@test.com"

```
调用: get_table_detail(tableId="5")
返回: {columns: [{name: "id", isPrimaryKey: true, isAutoIncrement: true}, {name: "username", isNullable: false}, ...]}

调用: insert_table_row(
  tableId="5",
  data={"username": "test_user", "email": "test@test.com"}
)
回复: 已成功插入用户 test_user (ID 自动生成)
```

### 4.2 更新数据

```
用户请求: "把用户 test_user 的邮箱改成 new@test.com"
    ↓
1. 确认主键字段和要更新的值
    ↓
2. 调用 update_table_row(tableId="xx", primaryKey={主键}, data={要更新的字段})
    ↓
3. 确认更新成功
```

**示例**:

**用户**: "把 ID 为 5 的用户邮箱改成 new@test.com"

```
调用: update_table_row(
  tableId="5",
  primaryKey={"id": 5},
  data={"email": "new@test.com"}
)
回复: 已更新用户 ID=5 的邮箱为 new@test.com
```

### 4.3 删除数据

```
用户请求: "删除用户 test_user"
    ↓
1. ⚠️ 危险操作！先确认删除范围和影响
    ↓
2. 向用户展示将要删除的数据，请求确认
    ↓
3. 用户确认后，调用 delete_table_rows(tableId="xx", primaryKeys=[{主键}])
    ↓
4. 确认删除成功
```

**示例**:

**用户**: "删除 ID 为 10 的订单"

```
回复: ⚠️ 确认要删除以下记录吗？
      订单 ID=10, 订单号=ORD-2024-0010, 金额=¥1,250.00
      此操作不可恢复。请回复"确认删除"继续。

用户: "确认删除"

调用: delete_table_rows(
  tableId="3",
  primaryKeys=[{"id": 10}]
)
回复: 已成功删除订单 ID=10
```

### 注意事项
- **删除操作必须二次确认**
- `primaryKey` 必须是对象格式，如 `{"id": 1}`
- `data` 只包含要更新的字段，不需要提供全部字段
- 插入数据时，自增主键不需要提供
- 如果操作涉及多行，使用批量操作或循环调用

---

## 场景 5：AI 生成表结构

当用户需要创建新表但不知道如何设计表结构时，使用 AI 辅助生成。

### 工作流程

```
用户请求: "我需要一个用户表" / "帮我设计一个订单系统的表结构"
    ↓
1. 调用 generate_table_by_description(requirement="用户描述")
    ↓
2. 展示 AI 生成的表结构（表名、字段、类型、注释）
    ↓
3. 用户确认后，调用 create_table(connectionId="xx", databaseName="xx", tableName="xx", columns=[...])
    ↓
4. 确认创建成功
```

### 示例

**用户**: "帮我设计一个商品表，包含名称、价格、库存、分类"

```
调用: generate_table_by_description(
  requirement="我需要一个商品表，包含商品名称、价格、库存、分类，用于电商系统"
)
返回: {
  tableName: "products",
  tableComment: "商品表",
  columns: [
    {columnName: "id", columnType: "SERIAL", isPrimaryKey: true, isAutoIncrement: true, columnComment: "主键ID"},
    {columnName: "name", columnType: "VARCHAR", columnLength: 200, isNullable: false, columnComment: "商品名称"},
    {columnName: "price", columnType: "DECIMAL", columnLength: 10, columnComment: "价格"},
    {columnName: "stock", columnType: "INTEGER", columnComment: "库存数量"},
    {columnName: "category_id", columnType: "INTEGER", columnComment: "分类ID"},
    {columnName: "created_at", columnType: "TIMESTAMP", defaultValue: "NOW()", columnComment: "创建时间"}
  ]
}

回复: AI 已生成表结构设计：
      表名: products (商品表)
      字段:
        - id (SERIAL, 主键, 自增) - 主键ID
        - name (VARCHAR(200), 非空) - 商品名称
        - price (DECIMAL(10)) - 价格
        - stock (INTEGER) - 库存数量
        - category_id (INTEGER) - 分类ID
        - created_at (TIMESTAMP, 默认NOW()) - 创建时间
      
      是否需要在此基础上修改或直接创建？

用户: "直接创建到 order_db 数据库"

调用: create_table(
  connectionId="1",
  databaseName="order_db",
  tableName="products",
  tableComment="商品表",
  columns=[...]  // 使用 AI 生成的 columns
)
回复: 已成功创建表 products (商品表)
```

### 注意事项
- `requirement` 参数应尽可能详细，包含业务场景和字段需求
- AI 生成的表结构可能需要用户调整（如字段长度、类型）
- 创建表前需要确认 `connectionId` 和 `databaseName`
- 常用字段类型：`VARCHAR`, `INTEGER`, `SERIAL`(自增主键), `DECIMAL`, `TIMESTAMP`, `TEXT`, `BOOLEAN`
- 如果用户描述模糊，先引导用户补充细节

---

## 最佳实践

### 1. 始终确认环境
- 默认使用 `prod`（生产环境）
- 如果用户提到"测试"或"测试环境"，使用 `target="test"`
- 执行危险操作前，明确告知用户当前环境

### 2. 提供上下文
- 展示数据时，包含字段名和类型
- 执行操作后，告知影响的行数或具体变化
- 错误时，提供清晰的错误信息和建议

### 3. 分步引导
- 如果用户请求不完整（如未指定数据源），先引导补充信息
- 复杂操作分步执行，每步确认后继续
- 对于多表操作，先展示整体计划

### 4. 数据展示
- 表格数据使用 Markdown 表格格式
- 长文本截断显示（最多 100 字符）
- 数字格式化（千位分隔符、货币符号）
- 时间格式化为可读格式

### 5. 错误处理
- API 错误：展示错误信息，建议重试或检查参数
- SQL 错误：展示 SQL 错误位置，建议修正
- 连接错误：检查数据源状态，建议启用或重新配置

---

## 常用参数参考

### 数据源类型
- `builtin` - 内置 PostgreSQL
- `external` - 外部数据库（MySQL/PostgreSQL/Oracle/SQL Server 等）

### 数据源状态
- `0` - 运行中
- `1` - 已停止

### 环境
- `prod` - 生产环境（默认）
- `test` - 测试环境

### 常用字段类型
| 类型 | 用途 | 示例 |
|------|------|------|
| `SERIAL` | 自增主键 | `id SERIAL PRIMARY KEY` |
| `VARCHAR(n)` | 短文本 | `username VARCHAR(50)` |
| `TEXT` | 长文本 | `description TEXT` |
| `INTEGER` | 整数 | `stock INTEGER` |
| `DECIMAL(m,n)` | 精确小数 | `price DECIMAL(10,2)` |
| `TIMESTAMP` | 时间戳 | `created_at TIMESTAMP` |
| `BOOLEAN` | 布尔值 | `is_active BOOLEAN` |

---

## 快速开始

如果用户说"帮我查一下数据库"，按以下步骤操作：

1. 调用 `list_datasources()` 获取数据源列表
2. 展示列表，让用户选择或默认第一个运行中的数据源
3. 调用 `get_datasource_detail(datasourceId="xx")` 获取数据库和表信息
4. 引导用户选择要操作的表
5. 根据用户意图调用相应的工具（查询/执行 SQL/增删改）
```

## 实施步骤

1. 创建目录 `.kilo/skills/lzwcai-agile-db/`
2. 创建文件 `SKILL.md` 并写入上述内容
3. 验证 skill 文件格式正确

## 验证

创建完成后，skill 应该可以被 Kilo 自动识别和加载。
