Files
add-todo-all/examples/todo_skill/README.md
2026-09-09 10:29:02 +08:00

127 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 待办事项 demo(todo-skill)
> 这是匠厂 `skill-template` 的**教学型 demo**,复刻模板的分层与 Action 契约,
> 自带一份最小 mock 平台库,可以脱离宿主在本机直接跑通。
> 真实业务技能**不要** vendor `jiangchang_skill_core`(见模板 `SKILL.md`)。
## 这个 demo 演示什么
- **四层架构** `cli → service → db → util`(与 [../../scripts/](../../scripts) 一致)
- **CLI 入口**:`scripts/main.py` 子命令分发(argparse + 中文错误)
- **业务表 + 数据管理元数据**:`todos` 表 + `_jiangchang_tables` / `_jiangchang_columns`
- **Action 契约**:[assets/actions.json](assets/actions.json) 覆盖 `toolbar`/`row`/`batch`/`cron`/`agent`/`skill-detail` 六个 placement
- **sync / async 双形态**:CRUD 是 sync(当场返回);`remind` 是 async(演示 `job_context` / `emit` / `finish` 任务流)
- **mock 平台库**:`scripts/_mock_platform/jiangchang_skill_core/`,在没有宿主时自动注入 sys.path
## 快速开始
```bash
# 用独立的数据目录跑(避免污染默认位置)
# Windows PowerShell
$env:JIANGCHANG_USER_ID="demo_test"
$env:JIANGCHANG_DATA_ROOT="$env:TEMP\jc_demo_run"
# 1. 初始化数据库(幂等创建 todos 表 + 展示元数据)
python examples/todo_skill/scripts/main.py init-db
# 2. 新增三条待办
python examples/todo_skill/scripts/main.py todo add "写文档" -p high
python examples/todo_skill/scripts/main.py todo add "回邮件" -p normal
python examples/todo_skill/scripts/main.py todo add "买咖啡" -p low
# 3. 列出 / 按状态过滤
python examples/todo_skill/scripts/main.py todo list
python examples/todo_skill/scripts/main.py todo list -s pending
# 4. 批量标记完成(演示逗号分隔 ids,对应 actions.json 的 batch 入口)
python examples/todo_skill/scripts/main.py todo done 1,2
# 5. 统计
python examples/todo_skill/scripts/main.py todo stats
# 6. async 提醒任务(演示 job_context/emit/finish 任务流)
python examples/todo_skill/scripts/main.py remind -s 2
# 7. 删除 / 健康检查 / 版本
python examples/todo_skill/scripts/main.py todo delete 3
python examples/todo_skill/scripts/main.py health
python examples/todo_skill/scripts/main.py version
python examples/todo_skill/scripts/main.py config-path
```
数据落在 `{JIANGCHANG_DATA_ROOT}/{JIANGCHANG_USER_ID}/todo-skill/todo-skill.db`,
不设环境变量时回退到 `{系统临时目录}/jiangchang_demo_cache/demo_user/todo-skill/`。
## 目录结构
```
examples/todo_skill/
├── README.md # 本文(用户说明)
├── SKILL.md # 技能入口(Agent / LLM 读,对齐模板 frontmatter)
├── assets/
│ └── actions.json # Action 清单(6 placements × sync/async)
└── scripts/
├── main.py # CLI 入口;含 mock 平台库回退注入
├── _mock_platform/ # mock jiangchang_skill_core(仅 demo 独立运行用)
│ └── jiangchang_skill_core/
│ ├── __init__.py
│ ├── runtime_env.py # 数据根 / 用户 ID / apply_cli_local_defaults
│ ├── config.py # .env 加载与合并
│ ├── activity.py # job_context / emit / finish
│ └── diagnostics.py # health 体检
├── cli/
│ └── app.py # argparse 子命令分发
├── service/
│ ├── task_service.py # 标准命令 + remind async 编排
│ └── todo_service.py # 待办 CRUD 业务内核(多入口复用)
├── db/
│ ├── connection.py # SQLite 连接 + init_db(todos 表 + 元数据)
│ └── display_metadata.py # _jiangchang_tables/_columns 元数据 DDL
└── util/
├── constants.py # SKILL_SLUG / SKILL_VERSION
├── runtime_paths.py # 数据目录与 DB 路径
├── argparse_zh.py # 中文 argparse 错误
├── logging_config.py # stdlib logging 薄封装
└── config_bootstrap.py # .env.example → 用户 .env 合并
```
## 与真实模板的差异
| 维度 | 真实模板 | 本 demo |
|------|----------|----------|
| `jiangchang_skill_core` 来源 | 宿主共享 Python runtime(`jiangchang-platform-kit`) | 自带 mock(`scripts/_mock_platform/`) |
| RPA / 视频录制 | `RpaVideoSession` 完整链路 | 未实现(remind 仅模拟进度,不开浏览器) |
| 任务中心 UI | 宿主「Run Journal」推送 + 进度面板 | stdout 打印 JSON Lines 模拟 |
| 鉴权 | `entitlement_service` 调宿主接口 | 完全省略 |
| HTML 报告 | `render-html` action + `html/*.html` | 未实现(教学范围外) |
| 日志 | `jiangchang_skill_core.unified_logging` 统一文件日志 | stdlib logging,仅 stdout |
## 三大契约在 demo 中的对应
### 1. CLI 契约([scripts/cli/app.py](scripts/cli/app.py))
固定子命令:`init-db` / `todo add|list|done|delete|stats` / `remind` / `health` / `version` / `config-path`。
### 2. Actions 契约([assets/actions.json](assets/actions.json))
| action id | executionProfile | placements | 说明 |
|-----------|------------------|------------|------|
| `health` / `version` | sync | skill-detail | 标准 |
| `todo-add` | sync | toolbar, agent, skill-detail | 表单新增 |
| `todo-list` | sync | skill-detail, agent | 只读查询 |
| `todo-done` | sync | row, batch, agent | 行级 / 批量,含 `confirmation` |
| `todo-delete` | sync | row, batch | 行级 / 批量删除 |
| `todo-stats` | sync | skill-detail, agent | 只读统计 |
| `remind` | **async** | toolbar, cron, agent, skill-detail | 演示任务中心入口 |
### 3. 数据管理元数据([scripts/db/connection.py](scripts/db/connection.py))
- 业务表:`todos`(id/title/status/priority/due_at/created_at/updated_at,字段顺序即列展示顺序)
- 元数据表:`_jiangchang_tables` + `_jiangchang_columns`
- `todos` 表 `readonly=1`:增删改通过技能 Action 走,宿主不直写
## 冒烟测试
```bash
cd examples/todo_skill
python -m unittest discover -s tests
```