待办事项 demo(todo-skill)
这是匠厂
skill-template的教学型 demo,复刻模板的分层与 Action 契约, 自带一份最小 mock 平台库,可以脱离宿主在本机直接跑通。 真实业务技能不要 vendorjiangchang_skill_core(见模板SKILL.md)。
这个 demo 演示什么
- 四层架构
cli → service → db → util(与 ../../scripts/ 一致) - CLI 入口:
scripts/main.py子命令分发(argparse + 中文错误) - 业务表 + 数据管理元数据:
todos表 +_jiangchang_tables/_jiangchang_columns - Action 契约: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
快速开始
# 用独立的数据目录跑(避免污染默认位置)
# 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)
固定子命令:init-db / todo add|list|done|delete|stats / remind / health / version / config-path。
2. Actions 契约(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)
- 业务表:
todos(id/title/status/priority/due_at/created_at/updated_at,字段顺序即列展示顺序) - 元数据表:
_jiangchang_tables+_jiangchang_columns todos表readonly=1:增删改通过技能 Action 走,宿主不直写
冒烟测试
cd examples/todo_skill
python -m unittest discover -s tests