Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 20e89774ca | |||
| 4ed49495cf | |||
| 8101b5ac01 |
@@ -1,5 +1,5 @@
|
|||||||
# 运行模式:决定本技能用模拟数据还是真实浏览器/接口去执行
|
# 运行模式:决定本技能用模拟数据还是真实浏览器/接口去执行
|
||||||
OPENCLAW_TEST_TARGET=mock # 可选:mock=本地模拟,simulator_rpa=仿真站点,real_api=真实接口,real_rpa=真实浏览器;模板默认 mock,日常正式使用请改为 real_rpa
|
OPENCLAW_TEST_TARGET=real_rpa # 可选:mock=本地模拟,simulator_rpa=仿真站点,real_api=真实接口,real_rpa=真实浏览器;模板默认真实浏览器;本地单测/CI 请用 mock
|
||||||
|
|
||||||
# 目标网站地址:技能要访问的网站或服务地址
|
# 目标网站地址:技能要访问的网站或服务地址
|
||||||
TARGET_BASE_URL=https://sandbox.jc2009.com # 填写完整网址(含 https://);换环境时再改,一般保持默认即可
|
TARGET_BASE_URL=https://sandbox.jc2009.com # 填写完整网址(含 https://);换环境时再改,一般保持默认即可
|
||||||
|
|||||||
15
CHANGELOG.md
15
CHANGELOG.md
@@ -9,6 +9,21 @@
|
|||||||
- 小节正文写用户能看懂的变化(新能力、修复、注意事项),避免堆砌内部实现细节
|
- 小节正文写用户能看懂的变化(新能力、修复、注意事项),避免堆砌内部实现细节
|
||||||
- 打 tag 前**必须**为即将发布的版本新增一节;找不到匹配小节时,本次发布不会更新 changelog 字段
|
- 打 tag 前**必须**为即将发布的版本新增一节;找不到匹配小节时,本次发布不会更新 changelog 字段
|
||||||
|
|
||||||
|
## 1.0.56
|
||||||
|
|
||||||
|
- 新增第三方交活验收清单 `development/CHECKLIST.md`(观察结果、不重复开发规范)
|
||||||
|
- 验收报告强制写入仓库根目录 `acceptance-reports/YYYYMMDD-HHMMSS-acceptance.md`,便于技术人员按 FAIL 项整改
|
||||||
|
|
||||||
|
## 1.0.55
|
||||||
|
|
||||||
|
- 模板 `.env.example` 默认 `OPENCLAW_TEST_TARGET=real_rpa`;四档保留;明确 mock 只保单测/CI,mock 通 ≠ 交活
|
||||||
|
- 验收要求 release 到匠厂并看用户体验(进度、失败提示、有头 RPA 等)
|
||||||
|
|
||||||
|
## 1.0.54
|
||||||
|
|
||||||
|
- 新增 `development/SHARED_REPOS.md`:可扩展的公开公共仓目录(skill-template / account-manager / jiangchang-platform-kit),含类型、Gitea 地址、clone 与红线
|
||||||
|
- 开发入口与 RUNTIME / RPA / tools 文档挂接该目录,便于技术人员与 AI 定位公共依赖
|
||||||
|
|
||||||
## 1.0.53
|
## 1.0.53
|
||||||
|
|
||||||
- 宿主入口对齐:`row` / `batch` 升格为正式 placements;支持 `bind.inputMapping` 与 `readOnly`;已声明入口均须自测(含技能详情直调)
|
- 宿主入口对齐:`row` / `batch` 升格为正式 placements;支持 `bind.inputMapping` 与 `readOnly`;已声明入口均须自测(含技能详情直调)
|
||||||
|
|||||||
2
SKILL.md
2
SKILL.md
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: 技能开发模板(通用业务版)
|
name: 技能开发模板(通用业务版)
|
||||||
description: "OpenClaw 通用业务技能开发模板,供复制后定制新业务 skill。定制步骤见 development/DEVELOPMENT.md。"
|
description: "OpenClaw 通用业务技能开发模板,供复制后定制新业务 skill。定制步骤见 development/DEVELOPMENT.md。"
|
||||||
version: 1.0.53
|
version: 1.0.56
|
||||||
author: 深圳匠厂科技有限公司
|
author: 深圳匠厂科技有限公司
|
||||||
metadata:
|
metadata:
|
||||||
openclaw:
|
openclaw:
|
||||||
|
|||||||
30
acceptance-reports/README.md
Normal file
30
acceptance-reports/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 验收报告目录(acceptance-reports)
|
||||||
|
|
||||||
|
本目录存放**技能交活验收报告**,供技术人员查看并按未通过项整改。
|
||||||
|
|
||||||
|
## 谁写、写什么
|
||||||
|
|
||||||
|
- 验收人(或 AI 编程工具)对照 `development/CHECKLIST.md` 执行验收后,**必须**在本目录落盘报告。
|
||||||
|
- 标准与条目定义见:`development/CHECKLIST.md`(含强制输出规则)。
|
||||||
|
|
||||||
|
## 命名(强制)
|
||||||
|
|
||||||
|
```text
|
||||||
|
YYYYMMDD-HHMMSS-acceptance.md
|
||||||
|
```
|
||||||
|
|
||||||
|
示例:`20260722-175000-acceptance.md`
|
||||||
|
|
||||||
|
- 使用验收执行时的本地时间
|
||||||
|
- 不要覆盖旧报告;保留历史便于对比是否修好
|
||||||
|
|
||||||
|
## 技术人员怎么用
|
||||||
|
|
||||||
|
1. `git pull` 拉取含报告的最新代码(或验收人推送后的提交)
|
||||||
|
2. 打开本目录中**时间戳最新**的一份 `*-acceptance.md`
|
||||||
|
3. 只看文末「给技术人员的修改清单」及所有 `FAIL` / 未通过的 `NEED_MANUAL`
|
||||||
|
4. 改完后告知验收人复验;新一轮会再生成一份新时间戳报告
|
||||||
|
|
||||||
|
## 模板仓说明
|
||||||
|
|
||||||
|
本 `skill-template` 仓库通常不产生业务验收报告;此目录随模板复制到新技能后使用。
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# 适配器标准:真实/仿真 × API/RPA 四档模式
|
# 适配器标准:真实/仿真 × API/RPA 四档模式
|
||||||
|
|
||||||
> 凡是"连接三方系统"(ERP、CRM、SaaS、银行等)的 skill,都应采用本文的 **adapter 四档模式**。这样同一套业务逻辑可以在不同档位间切换:开发用 mock、半集成用 simulator、上线用真实,互不影响。
|
> 凡是"连接三方系统"(ERP、CRM、SaaS、银行等)的 skill,都应采用本文的 **adapter 四档模式**。同一套业务逻辑可在不同档位间切换;**四档都保留**。
|
||||||
|
|
||||||
## 为什么要分档
|
## 为什么要分档
|
||||||
|
|
||||||
@@ -15,17 +15,17 @@
|
|||||||
|
|
||||||
| 档位 | 含义 | 默认策略 |
|
| 档位 | 含义 | 默认策略 |
|
||||||
|------|------|----------|
|
|------|------|----------|
|
||||||
| **`mock`** | 纯内存或 fixture,**默认单测/CI** | 模板 `.env.example` 默认 `OPENCLAW_TEST_TARGET=mock` |
|
| **`mock`** | 纯内存或 fixture,离线 | **单测 / CI 必过**;mock 不通不要往下走 |
|
||||||
| **`simulator_rpa`** | 仿真站点或桌面仿真,可半集成 | 开发联调可选 |
|
| **`simulator_rpa`** | 仿真站点或桌面仿真,可半集成 | 按业务场景选用 |
|
||||||
| **`real_api`** | 真实 API | 生产 / 集成测试显式设 `OPENCLAW_TEST_TARGET=real_api` |
|
| **`real_api`** | 真实 API | 按业务场景选用(有官方接口时) |
|
||||||
| **`real_rpa`** | 真实浏览器/真实系统 | 生产 / 集成测试显式设 `OPENCLAW_TEST_TARGET=real_rpa` |
|
| **`real_rpa`** | 真实浏览器/真实系统 | **模板 `.env.example` 默认**;业务自测与交活用此档 |
|
||||||
|
|
||||||
- **mock**:纯离线、不联网,给单测 / CI / 开发自测,**保证可重复**。
|
- **mock**:纯离线、不联网,给单测 / CI,**保证可重复**。**mock 通 ≠ 开发完成**。
|
||||||
- **simulator_rpa**:操作仿真平台(如 `sandbox.jc2009.com`),跑端到端流程但不碰生产。
|
- **simulator_rpa**:操作仿真平台(如 `sandbox.jc2009.com`),按场景选用。
|
||||||
- **real_api**:有官方接口时**首选**(最稳、最快、最易维护)。
|
- **real_api**:有官方接口时按场景选用。
|
||||||
- **real_rpa**:没有 API 只能操作生产界面,**风险最高、放最后**。
|
- **real_rpa**:真实浏览器路径;模板默认,须真实跑通后再交活。
|
||||||
|
|
||||||
> 推荐优先级:**real_api > simulator_rpa > real_rpa**,mock 永远保留做 CI。
|
> **口径**:业务配置默认 `real_rpa`;单测/CI 用 `mock`。不得只 mock 通就交活;须 release 到匠厂宿主验收(含用户体验)。
|
||||||
|
|
||||||
配置读取见 `CONFIG.md`:**bootstrap 之后业务代码只通过 `config.get*()` 读 `OPENCLAW_TEST_TARGET` 等项**(进程 env > 用户 `.env` > `.env.example`)。
|
配置读取见 `CONFIG.md`:**bootstrap 之后业务代码只通过 `config.get*()` 读 `OPENCLAW_TEST_TARGET` 等项**(进程 env > 用户 `.env` > `.env.example`)。
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ scripts/service/
|
|||||||
from jiangchang_skill_core import config
|
from jiangchang_skill_core import config
|
||||||
|
|
||||||
def get_adapter():
|
def get_adapter():
|
||||||
target = (config.get("OPENCLAW_TEST_TARGET") or "mock").lower()
|
target = (config.get("OPENCLAW_TEST_TARGET") or "real_rpa").lower()
|
||||||
if target in ("unit", "mock"):
|
if target in ("unit", "mock"):
|
||||||
return MockAdapter()
|
return MockAdapter()
|
||||||
if target == "real_api":
|
if target == "real_api":
|
||||||
|
|||||||
146
development/CHECKLIST.md
Normal file
146
development/CHECKLIST.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# 技能交活验收 Checklist(第三方视角)
|
||||||
|
|
||||||
|
checklist_version: 1.0
|
||||||
|
|
||||||
|
本清单用于**旁人 / 测试 / AI 编程工具**对任意业务技能做交活验收。
|
||||||
|
它描述的是「验什么、怎样算过」,**不是**开发规范摘要。写法与实现约束见同目录其他文档。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 验收输出强制规则(凡执行本清单必须遵守)
|
||||||
|
|
||||||
|
> 面向 AI 与人工验收员:只要开始按本 Checklist 验收,下列规则**全部强制**,无需用户在提示词里再重复。
|
||||||
|
|
||||||
|
1. **必须落盘报告**,禁止只在对话里给出口头结论。
|
||||||
|
2. **报告目录(唯一合法位置)**:技能仓库**根目录**下的 `acceptance-reports/`
|
||||||
|
(与 `development/`、`scripts/` 平级;**禁止**写到 `development/`、`tests/`、临时目录或其他路径。)
|
||||||
|
3. **报告文件名(唯一合法格式)**:`YYYYMMDD-HHMMSS-acceptance.md`
|
||||||
|
示例:`20260722-175000-acceptance.md`
|
||||||
|
时间取验收执行时的本地时间;**禁止**使用 `report.md`、`验收.md`、无时间戳的文件名。
|
||||||
|
4. 若 `acceptance-reports/` 不存在,**先创建该目录再写入**。
|
||||||
|
5. 报告**开头**必须写明:
|
||||||
|
- 完整相对路径:`acceptance-reports/YYYYMMDD-HHMMSS-acceptance.md`
|
||||||
|
- 技能 slug、当前 git 提交短哈希(若可得)、`checklist_version`
|
||||||
|
6. 报告正文必须**逐条**对应下方条目,每条给出:`PASS` / `FAIL` / `N/A` / `NEED_MANUAL`,并附简短证据(文件路径、命令、观察结果)。
|
||||||
|
7. 报告末尾必须有「给技术人员的修改清单」:只列出未通过项(`FAIL` 与未通过的 `NEED_MANUAL`),按 P0 → P1 → P2 排序。
|
||||||
|
8. **禁止修改业务代码**来“凑”验收通过;本清单的执行结果是报告,不是改代码。
|
||||||
|
9. 若用户只说「按 Checklist 验收」而未指定路径:仍必须遵守本节省略规则,不得省略落盘。
|
||||||
|
|
||||||
|
**结果取值**
|
||||||
|
|
||||||
|
| 值 | 含义 |
|
||||||
|
|----|------|
|
||||||
|
| PASS | 已满足 |
|
||||||
|
| FAIL | 不满足 |
|
||||||
|
| N/A | 本技能不适用(须说明原因) |
|
||||||
|
| NEED_MANUAL | 须人工点选/真机;报告中写清已做或未做 |
|
||||||
|
|
||||||
|
**级别**
|
||||||
|
|
||||||
|
| 级别 | 含义 |
|
||||||
|
|------|------|
|
||||||
|
| P0 | 不通过不可交活 |
|
||||||
|
| P1 | 限期整改 |
|
||||||
|
| P2 | 体验建议 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. 技能画像(验收前先填,用于裁剪)
|
||||||
|
|
||||||
|
先根据技能实际情况勾选;后续章节不适用则整项标 `N/A` 并注明原因。
|
||||||
|
|
||||||
|
- [ ] S0-1 交互形态:纯本地 / API / 网页RPA / 桌面RPA / 手机RPA / 编排(调兄弟技能)
|
||||||
|
- [ ] S0-2 目标站登录策略:required / optional / not_needed / 不适用
|
||||||
|
- [ ] S0-3 是否依赖账号会话(account-manager 或等价 Profile):是 / 否
|
||||||
|
- [ ] S0-4 持久化:无 / 仅任务日志 / 另有业务表
|
||||||
|
- [ ] S0-5 Skill Action:无 / 仅同步短任务 / 含异步长任务
|
||||||
|
- [ ] S0-6 是否需要在任务中心查看进度或结果:是 / 否
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 安装与可运行(所有技能)
|
||||||
|
|
||||||
|
- [ ] A1-1 **P0** 按平台方式加载/安装后,技能可被识别(有名称,能打开详情或执行入口)
|
||||||
|
- [ ] A1-2 **P0** 健康检查(如 `health`)能跑完且结果可读;缺关键条件时有明确失败提示,而非空白崩溃
|
||||||
|
- [ ] A1-3 **P0** 版本查询(如 `version`)返回的版本与对外宣称一致
|
||||||
|
- [ ] A1-4 **P1** 若有用户可见配置:说明可读;按说明改关键项后行为符合说明
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 对外说明是否自洽(所有技能)
|
||||||
|
|
||||||
|
- [ ] A2-1 **P0** 市场「说明」能让非开发者理解:做什么、给谁用、开始前准备什么
|
||||||
|
- [ ] A2-2 **P0** 「说明/教程」不以开发目录、内部实现细节作为用户主路径
|
||||||
|
- [ ] A2-3 **P1** 「教程」可按真实顺序跟做(准备 → 步骤 → 失败怎么办)
|
||||||
|
- [ ] A2-4 **P1** 「演示」结构完整(有演示信息位;无视频则标明暂无,不假装有)
|
||||||
|
- [ ] A2-5 **P0** 「更新日志」能对应到当前交付版本
|
||||||
|
- [ ] A2-6 **P0** 平台/Agent 侧说明中,常见用户意图的触发方式与真实能力一致(短操作 vs 长任务不混淆)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 主能力行为(所有技能)
|
||||||
|
|
||||||
|
- [ ] A3-1 **P0** 主成功路径能按宣称完成核心动作(至少 1 次完整闭环)
|
||||||
|
- [ ] A3-2 **P0** 缺参或非法输入时稳定失败(可读错误,不假成功)
|
||||||
|
- [ ] A3-3 **P1** 失败可诊断:能从任务记录/提示判断失败阶段,而非只有“失败了”
|
||||||
|
- [ ] A3-4 **P0** 同一能力从已声明的不同入口触发时,业务结果一致(不出现入口分叉成两套逻辑)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 调度与长任务(有 Action 或长任务时适用)
|
||||||
|
|
||||||
|
- [ ] A4-1 **P0** 秒级只读/短操作:不进入任务中心也能完成(若技能提供此类能力)
|
||||||
|
- [ ] A4-2 **P0** 长耗时/浏览器/需进度或取消的能力:经 Agent 或技能动作触发后进入任务中心(或平台等价异步队列)
|
||||||
|
- [ ] A4-3 **P0** 异步任务在任务中心能看到进行中与结束状态;结束有成功或失败结论
|
||||||
|
- [ ] A4-4 **P1** 进行中的进度/步骤信息对用户可理解
|
||||||
|
- [ ] A4-5 **P1** 已对外暴露的动作参数覆盖主路径关键输入(无“命令行能做、动作入口不能做”的关键缺口)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 账号与浏览器会话(网页 RPA 适用;其他形态标 N/A 或改测等价项)
|
||||||
|
|
||||||
|
- [ ] A5-1 **P0** 未准备好账号/浏览器档案时,主路径失败并提示,不会默默用本机默认浏览器身份跑起来
|
||||||
|
- [ ] A5-2 **P0** 登录策略为 required 时:未登录不能把做不成的事当成成功
|
||||||
|
- [ ] A5-3 **P0** 交付联调默认能看见浏览器窗口(有头);不能把无头当作唯一可验收形态
|
||||||
|
- [ ] A5-4 **P1** 浏览器窗口启动形态满足交付约定(如最大化或可视区域足够操作与人工介入)
|
||||||
|
- [ ] A5-5 **P1** 验证码或人工确认:有等待与超时;超时后任务失败可理解,不无限挂死或假成功
|
||||||
|
- [ ] A5-6 **P0** **NEED_MANUAL** 真实站或约定仿真站主路径至少完整跑通 1 次;仅模拟数据通过不算交活
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 结果落点(按画像裁剪)
|
||||||
|
|
||||||
|
- [ ] A6-1 **P0** 宣称可追溯时:跑完后任务记录中有对应条目(成功/失败均有)
|
||||||
|
- [ ] A6-2 **P0** 宣称写入业务数据或可在数据管理查看时:成功跑完后能看到新业务数据;仅有任务摘要、业务侧仍空 → **FAIL**
|
||||||
|
- [ ] A6-3 **P1** 重复执行同一业务键时,结果符合宣称(更新/去重/追加),无莫名脏数据或静默丢数据
|
||||||
|
- [ ] A6-4 **P1** 「零结果成功」与「失败」可区分
|
||||||
|
- [ ] A6-5 **P1** 若产出文件:落在约定数据位置且可找到,不丢在不明临时路径
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 可观测与安全观感(所有技能)
|
||||||
|
|
||||||
|
- [ ] A7-1 **P0** 失败提示或任务结论不泄露密码、完整 Cookie、明文 token 等敏感信息
|
||||||
|
- [ ] A7-2 **P1** 关键步骤有据可查(能对应到开始/关键节点/结束)
|
||||||
|
- [ ] A7-3 **P1** 若宣称支持录屏或截图存证:打开开关后关键步骤或失败能留下可查看产物;宣称支持却完全无产物 → **FAIL**
|
||||||
|
- [ ] A7-4 **P2** 用户可见文案偏业务语言,而非大段开发黑话
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 质量门禁与交活底线(所有技能)
|
||||||
|
|
||||||
|
- [ ] A8-1 **P0** 仓库默认测试套件通过(执行技能约定的一键测试命令,如 `python tests/run_tests.py -v`)
|
||||||
|
- [ ] A8-2 **P0** 不以「仅模拟档通过」作为交活依据(有真实档要求时必须真实跑通或书面阶段性豁免)
|
||||||
|
- [ ] A8-3 **P0** **NEED_MANUAL** 已声明的宿主入口(详情/Agent/工具栏/定时等)按声明抽测可通过
|
||||||
|
- [ ] A8-4 **P1** 对外版本一致:详情、version、更新日志、发布标签能对上
|
||||||
|
- [ ] A8-5 **P1** 开发者按平台规则能安装并测到该技能(若平台有开发者可见性要求)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 报告结尾必填
|
||||||
|
|
||||||
|
报告末尾固定三块:
|
||||||
|
|
||||||
|
1. **结论**:通过 / 不通过(任意 P0 为 FAIL 或不通过的 NEED_MANUAL → 不通过)
|
||||||
|
2. **统计**:PASS / FAIL / N/A / NEED_MANUAL 数量;P0 FAIL 列表
|
||||||
|
3. **给技术人员的修改清单**:仅未通过项,带条目 ID 与期望现象
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
```ini
|
```ini
|
||||||
# 运行模式:决定本技能用模拟数据还是真实浏览器/接口去执行
|
# 运行模式:决定本技能用模拟数据还是真实浏览器/接口去执行
|
||||||
OPENCLAW_TEST_TARGET=mock # 可选:mock=本地模拟,simulator_rpa=仿真站点,real_api=真实接口,real_rpa=真实浏览器;模板默认 mock,日常正式使用请改为 real_rpa
|
OPENCLAW_TEST_TARGET=real_rpa # 可选:mock=本地模拟,simulator_rpa=仿真站点,real_api=真实接口,real_rpa=真实浏览器;模板默认真实浏览器;本地单测/CI 请用 mock
|
||||||
|
|
||||||
# 是否显示浏览器窗口:网页自动化时是否弹出可见浏览器
|
# 是否显示浏览器窗口:网页自动化时是否弹出可见浏览器
|
||||||
OPENCLAW_BROWSER_HEADLESS=0 # 0=显示窗口(必须,便于介入与排查);1=后台静默(勿作日常用法)
|
OPENCLAW_BROWSER_HEADLESS=0 # 0=显示窗口(必须,便于介入与排查);1=后台静默(勿作日常用法)
|
||||||
@@ -58,7 +58,7 @@ OPENCLAW_BROWSER_HEADLESS=0 # 0=显示窗口(必须,便于介入与排查
|
|||||||
|
|
||||||
```ini
|
```ini
|
||||||
# ── 运行模式 / adapter 档位(见 development/ADAPTER.md)──
|
# ── 运行模式 / adapter 档位(见 development/ADAPTER.md)──
|
||||||
OPENCLAW_TEST_TARGET=real_rpa # 生产默认真实 RPA;单测/CI 可改为 mock
|
OPENCLAW_TEST_TARGET=mock # 见 development/ADAPTER.md;单测用 mock
|
||||||
|
|
||||||
# ── 好看视频 / 百度账号(须与 account-manager 平台 key 一致)──
|
# ── 好看视频 / 百度账号(须与 account-manager 平台 key 一致)──
|
||||||
TARGET_PLATFORM=baidu
|
TARGET_PLATFORM=baidu
|
||||||
@@ -73,7 +73,7 @@ HAOKAN_VIDEO_SELECTOR=video.art-video
|
|||||||
|
|
||||||
```ini
|
```ini
|
||||||
# 运行模式:决定本技能用模拟数据还是真实浏览器/接口去执行
|
# 运行模式:决定本技能用模拟数据还是真实浏览器/接口去执行
|
||||||
OPENCLAW_TEST_TARGET=mock # 可选:mock=本地模拟,simulator_rpa=仿真站点,real_api=真实接口,real_rpa=真实浏览器;模板默认 mock,日常正式使用请改为 real_rpa
|
OPENCLAW_TEST_TARGET=real_rpa # 可选:mock=本地模拟,simulator_rpa=仿真站点,real_api=真实接口,real_rpa=真实浏览器;模板默认真实浏览器;本地单测/CI 请用 mock
|
||||||
|
|
||||||
# 目标网站地址:技能要访问的网站或服务地址
|
# 目标网站地址:技能要访问的网站或服务地址
|
||||||
TARGET_BASE_URL=https://sandbox.jc2009.com # 填写完整网址(含 https://);换环境时再改,一般保持默认即可
|
TARGET_BASE_URL=https://sandbox.jc2009.com # 填写完整网址(含 https://);换环境时再改,一般保持默认即可
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
官方下载与文档以各产品站点为准;技能开发步骤以本文与同目录规范为准,不依赖某一家工具的专有流程。
|
官方下载与文档以各产品站点为准;技能开发步骤以本文与同目录规范为准,不依赖某一家工具的专有流程。
|
||||||
|
|
||||||
|
开发中常用的**公开公共仓**(skill-template / account-manager / jiangchang-platform-kit 等,可 `git clone` 学习,目录可扩展)见 [`SHARED_REPOS.md`](SHARED_REPOS.md)。
|
||||||
|
|
||||||
## 1. 先理解模板的定位
|
## 1. 先理解模板的定位
|
||||||
|
|
||||||
`skill-template` 不是业务 skill,它只是一个**新 skill 仓库模板**。
|
`skill-template` 不是业务 skill,它只是一个**新 skill 仓库模板**。
|
||||||
@@ -151,7 +153,7 @@ scripts/
|
|||||||
from jiangchang_skill_core.rpa import launch_persistent_browser, anti_detect, wait_for_captcha_pass
|
from jiangchang_skill_core.rpa import launch_persistent_browser, anti_detect, wait_for_captcha_pass
|
||||||
```
|
```
|
||||||
上述 import 来自宿主共享 runtime 安装的 `jiangchang-platform-kit`,不是技能目录副本。
|
上述 import 来自宿主共享 runtime 安装的 `jiangchang-platform-kit`,不是技能目录副本。
|
||||||
4. **mock 档必须离线可跑**(`OPENCLAW_TEST_TARGET=mock`);sim_rpa / real_* 按需单独测。
|
4. **单测/CI 须 mock 离线可过**;业务 `.env` 默认 `real_rpa`,须真实跑通。**不得只 mock 通就交活**;须 release 到匠厂宿主验收(见 §15,含用户体验)。
|
||||||
5. **桌面/手机**:本期标准见 RPA.md 第 2/3 节,复用 `jiangchang_desktop_sdk` / `screencast`,**不要在新 skill 里重复造包**(尚待实战验证)。
|
5. **桌面/手机**:本期标准见 RPA.md 第 2/3 节,复用 `jiangchang_desktop_sdk` / `screencast`,**不要在新 skill 里重复造包**(尚待实战验证)。
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -816,9 +818,17 @@ uses: client-jiangchang/jiangchang-platform-kit/.github/workflows/reusable-relea
|
|||||||
- 安装后状态正常
|
- 安装后状态正常
|
||||||
- 不会出现缺文件、缺入口或安装失败的问题
|
- 不会出现缺文件、缺入口或安装失败的问题
|
||||||
|
|
||||||
### 第七步:按声明做宿主多入口验收(已声明的入口都要测)
|
### 第七步:按声明做宿主多入口验收(已声明的入口都要测;须看用户体验)
|
||||||
|
|
||||||
安装完成后,不要只停留在“已安装”状态。宿主侧栏有多条与技能相关的入口;**按本技能 `assets/actions.json` 的 `placements` / `executionProfile` 声明逐项自测**(契约见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md)、[`../references/ACTIONS.md`](../references/ACTIONS.md))。未声明的入口可以跳过;**已声明却测不到,视为验收失败**。不要只测对话、忽略其它入口。
|
安装完成后,不要只停留在“已安装”状态,也**不要**只在本地 mock 通就认为完成。宿主侧栏有多条与技能相关的入口;**按本技能 `assets/actions.json` 的 `placements` / `executionProfile` 声明逐项自测**(契约见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md)、[`../references/ACTIONS.md`](../references/ACTIONS.md))。未声明的入口可以跳过;**已声明却测不到,视为验收失败**。不要只测对话、忽略其它入口。
|
||||||
|
|
||||||
|
**用户体验(与功能入口并列,后台通了不算完):**
|
||||||
|
|
||||||
|
- 失败时用户能否看懂原因(对话 / 任务中心 / 提示),不是只有技术日志
|
||||||
|
- 长任务(async)是否有可见进度,能否取消或等待说明
|
||||||
|
- 网页 RPA 是否有头运行;需登录/验证码时是否停下等人,而不是静默失败
|
||||||
|
- 数据管理:表名/字段中文、按钮文案是否清楚;结果是否写回用户看得见的地方
|
||||||
|
- 市场说明 / 教程是否与真实行为一致
|
||||||
|
|
||||||
| 宿主入口(侧栏 / 界面) | 技能侧如何挂上 | 建议验收什么 |
|
| 宿主入口(侧栏 / 界面) | 技能侧如何挂上 | 建议验收什么 |
|
||||||
|-------------------------|----------------|--------------|
|
|-------------------------|----------------|--------------|
|
||||||
@@ -878,7 +888,8 @@ uses: client-jiangchang/jiangchang-platform-kit/.github/workflows/reusable-relea
|
|||||||
- [ ] 本仓库**不是** skill-template 的误复制(根目录**无** `.openclaw-skill-template`)
|
- [ ] 本仓库**不是** skill-template 的误复制(根目录**无** `.openclaw-skill-template`)
|
||||||
- [ ] `git remote -v` 指向**本技能**远端,URL 不含 skill-template 仓库名
|
- [ ] `git remote -v` 指向**本技能**远端,URL 不含 skill-template 仓库名
|
||||||
- [ ] `git log` 首条提交属于本技能(非模板历史)(来源 A 从 Gitea 克隆的已有业务仓,以该仓历史为准)
|
- [ ] `git log` 首条提交属于本技能(非模板历史)(来源 A 从 Gitea 克隆的已有业务仓,以该仓历史为准)
|
||||||
- [ ] 发布后计划在宿主按 §15 第七步验收:已声明的 **新建任务 / 数据管理(toolbar|row|batch) / 定时任务 / 任务中心(async) / 技能详情** 均已覆盖
|
- [ ] 业务 `.env` / `.env.example` 默认 `OPENCLAW_TEST_TARGET=real_rpa`(单测/CI 仍用 mock);**未只靠 mock 交活**
|
||||||
|
- [ ] 发布后计划在宿主按 §15 第七步验收:已声明入口 + **用户体验**(进度、失败提示、有头 RPA、文案一致等)
|
||||||
- [ ] 网页 RPA:`ensure-web` 取得 `profile_dir` 再开浏览器;`.env` 默认有头;REQUIREMENTS 写明登录策略(required/optional/not_needed,会话依赖型勿抄 optional);用户 README/TUTORIAL 区分「登记账号」与「站点登录」(`RPA.md` §0.2 / `POLICY-RPA-004`);依赖 kit 空值解析等修复时上调 `platform_kit_min_version`
|
- [ ] 网页 RPA:`ensure-web` 取得 `profile_dir` 再开浏览器;`.env` 默认有头;REQUIREMENTS 写明登录策略(required/optional/not_needed,会话依赖型勿抄 optional);用户 README/TUTORIAL 区分「登记账号」与「站点登录」(`RPA.md` §0.2 / `POLICY-RPA-004`);依赖 kit 空值解析等修复时上调 `platform_kit_min_version`
|
||||||
|
|
||||||
## 17. 常见错误
|
## 17. 常见错误
|
||||||
|
|||||||
@@ -12,26 +12,31 @@
|
|||||||
| 2 | 按 [`NAMING.md`](NAMING.md) 确认 slug;**先填** [`REQUIREMENTS.md`](REQUIREMENTS.md),再写业务代码 | [`REQUIREMENTS.md`](REQUIREMENTS.md)、[`NAMING.md`](NAMING.md) |
|
| 2 | 按 [`NAMING.md`](NAMING.md) 确认 slug;**先填** [`REQUIREMENTS.md`](REQUIREMENTS.md),再写业务代码 | [`REQUIREMENTS.md`](REQUIREMENTS.md)、[`NAMING.md`](NAMING.md) |
|
||||||
| 3 | 替换标识与占位,按四象限 / examples 实现 `scripts/service/` | [`DEVELOPMENT.md`](DEVELOPMENT.md) §4~§14 |
|
| 3 | 替换标识与占位,按四象限 / examples 实现 `scripts/service/` | [`DEVELOPMENT.md`](DEVELOPMENT.md) §4~§14 |
|
||||||
| 4 | **配置 `developer_ids`(开发自测必做)**:开发期技能在匠厂默认不公开;不加则开发者自己也装测不了。从宿主设置复制用户 ID 写入 `SKILL.md` | [`DEVELOPMENT.md`](DEVELOPMENT.md) §6「关于 developer_ids」 |
|
| 4 | **配置 `developer_ids`(开发自测必做)**:开发期技能在匠厂默认不公开;不加则开发者自己也装测不了。从宿主设置复制用户 ID 写入 `SKILL.md` | [`DEVELOPMENT.md`](DEVELOPMENT.md) §6「关于 developer_ids」 |
|
||||||
| 5 | 本地 `python tests/run_tests.py -v` 通过后执行 `release.ps1`;看 Gitea CI | [`DEVELOPMENT.md`](DEVELOPMENT.md) §15 |
|
| 5 | 本地单测(mock)通过后,按业务默认 **`real_rpa`** 真实跑通;再 `release.ps1`;看 Gitea CI。**mock 通 ≠ 完成** | [`ADAPTER.md`](ADAPTER.md);[`DEVELOPMENT.md`](DEVELOPMENT.md) §15 |
|
||||||
| 6 | 匠厂安装后,按 `actions.json` **已声明的全部入口**自测(新建任务、数据管理含 toolbar/row/batch、定时任务、任务中心、技能详情等) | [`DEVELOPMENT.md`](DEVELOPMENT.md) §15;[`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) |
|
| 6 | 匠厂安装后,按已声明入口自测,并看**用户体验**(进度、失败提示、有头 RPA 等) | [`DEVELOPMENT.md`](DEVELOPMENT.md) §15;[`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) |
|
||||||
|
| 7 | **交活验收(第三方)**:对照 [`CHECKLIST.md`](CHECKLIST.md) 验收;报告写入仓库根目录 [`acceptance-reports/`](../acceptance-reports/) | [`CHECKLIST.md`](CHECKLIST.md) |
|
||||||
|
|
||||||
脚手架与 Git 防串库:[`../tools/README.md`](../tools/README.md)(`scaffold_skill.ps1`)。业务仓也可直接从自建 Gitea clone,见 [`DEVELOPMENT.md`](DEVELOPMENT.md) §4 来源 A。
|
脚手架与 Git 防串库:[`../tools/README.md`](../tools/README.md)(`scaffold_skill.ps1`)。业务仓也可直接从自建 Gitea clone,见 [`DEVELOPMENT.md`](DEVELOPMENT.md) §4 来源 A。
|
||||||
|
|
||||||
|
**公开公共仓(可 clone 学习,可扩展登记):** [`SHARED_REPOS.md`](SHARED_REPOS.md) — 当前含 skill-template、account-manager、jiangchang-platform-kit。
|
||||||
|
|
||||||
## 深度规范阅读顺序
|
## 深度规范阅读顺序
|
||||||
|
|
||||||
开始定制 skill 前,建议按以下顺序阅读:
|
开始定制 skill 前,建议按以下顺序阅读:
|
||||||
|
|
||||||
1. [`REQUIREMENTS.md`](REQUIREMENTS.md) — 需求文档模板与验收标准
|
1. [`SHARED_REPOS.md`](SHARED_REPOS.md) — **公共仓库目录**(模板 / 账号管理 / platform-kit 等,可扩展)
|
||||||
2. [`NAMING.md`](NAMING.md) — slug / 仓库名命名规范(复制模板前必读)
|
2. [`REQUIREMENTS.md`](REQUIREMENTS.md) — 需求文档模板与验收标准
|
||||||
3. [`DEVELOPMENT.md`](DEVELOPMENT.md) — 完整开发步骤与目录规范
|
3. [`NAMING.md`](NAMING.md) — slug / 仓库名命名规范(复制模板前必读)
|
||||||
4. [`TESTING.md`](TESTING.md) — 测试分层、隔离数据根与档位开关
|
4. [`DEVELOPMENT.md`](DEVELOPMENT.md) — 完整开发步骤与目录规范
|
||||||
5. [`LOGGING.md`](LOGGING.md) — 日志分层、必打节点、敏感信息红线(**涉及长任务、RPA、外部系统时必读**)
|
5. [`TESTING.md`](TESTING.md) — 测试分层、隔离数据根与档位开关
|
||||||
6. [`ADAPTER.md`](ADAPTER.md) — 涉及外部系统对接时
|
6. [`LOGGING.md`](LOGGING.md) — 日志分层、必打节点、敏感信息红线(**涉及长任务、RPA、外部系统时必读**)
|
||||||
7. [`RPA.md`](RPA.md) — 涉及浏览器 / 桌面 / 手机自动化时
|
7. [`ADAPTER.md`](ADAPTER.md) — 涉及外部系统对接时
|
||||||
8. [`CONFIG.md`](CONFIG.md) — `.env` 规范与 bootstrap 机制
|
8. [`RPA.md`](RPA.md) — 涉及浏览器 / 桌面 / 手机自动化时
|
||||||
9. [`DATA_PATHS.md`](DATA_PATHS.md) — 下载/导入/导出等本地文件路径标准(涉及文件读写时必读)
|
9. [`CONFIG.md`](CONFIG.md) — `.env` 规范与 bootstrap 机制
|
||||||
10. [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) — Skill Action sync/async、任务中心、Agent 禁令、队列 pick(涉及 RPA / 长任务 / 数据管理按钮 / Cron / Agent 时必读)
|
10. [`DATA_PATHS.md`](DATA_PATHS.md) — 下载/导入/导出等本地文件路径标准(涉及文件读写时必读)
|
||||||
11. [`RUNTIME.md`](RUNTIME.md) — 共享 runtime、数据路径、发布打包与编码约定
|
11. [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) — Skill Action sync/async、任务中心、Agent 禁令、队列 pick(涉及 RPA / 长任务 / 数据管理按钮 / Cron / Agent 时必读)
|
||||||
|
12. [`RUNTIME.md`](RUNTIME.md) — 共享 runtime、数据路径、发布打包与编码约定
|
||||||
|
13. [`CHECKLIST.md`](CHECKLIST.md) — **交活验收清单(第三方视角)**;报告输出到 [`../acceptance-reports/`](../acceptance-reports/)
|
||||||
|
|
||||||
Agent 调用契约见 [`../references/CLI.md`](../references/CLI.md)、[`../references/SCHEMA.md`](../references/SCHEMA.md)、[`../references/ACTIONS.md`](../references/ACTIONS.md)。
|
Agent 调用契约见 [`../references/CLI.md`](../references/CLI.md)、[`../references/SCHEMA.md`](../references/SCHEMA.md)、[`../references/ACTIONS.md`](../references/ACTIONS.md)。
|
||||||
用户市场四 Tab 见根目录 [`README.md`](../README.md) / [`TUTORIAL.md`](../TUTORIAL.md) / [`DEMO.md`](../DEMO.md) / [`CHANGELOG.md`](../CHANGELOG.md),不要写进本目录。
|
用户市场四 Tab 见根目录 [`README.md`](../README.md) / [`TUTORIAL.md`](../TUTORIAL.md) / [`DEMO.md`](../DEMO.md) / [`CHANGELOG.md`](../CHANGELOG.md),不要写进本目录。
|
||||||
|
|||||||
@@ -164,16 +164,16 @@
|
|||||||
|
|
||||||
- 代码结构符合模板规范;`SKILL.md` slug 与 `constants.SKILL_SLUG` 一致
|
- 代码结构符合模板规范;`SKILL.md` slug 与 `constants.SKILL_SLUG` 一致
|
||||||
- `health`、`version`、`init-db` 命令执行正常
|
- `health`、`version`、`init-db` 命令执行正常
|
||||||
- 主命令(如 `run`)在 mock / simulator 档位可重复验证
|
- `python tests/run_tests.py -v` 必跑测试全部通过(mock / 离线门禁;**mock 通 ≠ 完成**)
|
||||||
- `python tests/run_tests.py -v` 必跑测试全部通过
|
- 主命令在业务默认档(模板为 `real_rpa`)真实跑通;不得只 mock 通就交活
|
||||||
- `task_logs` 写入和查询符合 `references/SCHEMA.md`(含 `created_at` / `updated_at` Unix 秒级规范)
|
- `task_logs` 写入和查询符合 `references/SCHEMA.md`(含 `created_at` / `updated_at` Unix 秒级规范)
|
||||||
- `init_db()` 已写入 `_jiangchang_tables` / `_jiangchang_columns`;用户可见表/字段具备中文 `display_name`
|
- `init_db()` 已写入 `_jiangchang_tables` / `_jiangchang_columns`;用户可见表/字段具备中文 `display_name`
|
||||||
- 字段展示顺序与 `PRAGMA table_info(task_logs)` 的 cid 一致;不依赖 `display_order`
|
- 字段展示顺序与 `PRAGMA table_info(task_logs)` 的 cid 一致;不依赖 `display_order`
|
||||||
- `tests/test_display_metadata.py` 通过
|
- `tests/test_display_metadata.py` 通过
|
||||||
- 真实联调(如有)放在 `tests/integration/`,且默认套件不包含真实外联
|
- 真实联调样例仍放 `tests/integration/`,默认套件不包含真实外联(与业务 `.env` 默认 `real_rpa` 不冲突)
|
||||||
- `SKILL.md` 的 `developer_ids` 已配置为开发者本人匠厂用户 ID(开发期不公开时,否则本人无法在市场安装自测;取 ID 步骤见 `development/DEVELOPMENT.md` §6)
|
- `SKILL.md` 的 `developer_ids` 已配置为开发者本人匠厂用户 ID(开发期不公开时,否则本人无法在市场安装自测;取 ID 步骤见 `development/DEVELOPMENT.md` §6)
|
||||||
- 发布后 Gitea 工作流成功;匠厂技能市场对开发者账号可见最新版本并可安装
|
- 发布后 Gitea 工作流成功;匠厂技能市场对开发者账号可见最新版本并可安装
|
||||||
- 安装后按本技能 `actions.json` 声明完成宿主多入口验收:至少覆盖已声明的「新建任务(Agent)」;若声明了 `toolbar` / `cron` / `async`,还须分别验收数据管理、定时任务、任务中心(见 `development/DEVELOPMENT.md` §15 第七步)
|
- 安装后按本技能 `actions.json` 声明完成宿主多入口验收(见 `development/DEVELOPMENT.md` §15);**须看用户体验**(进度可见、失败可读、RPA 有头、文案与真实行为一致等),后台通了不算完
|
||||||
|
|
||||||
## 10. 开发注意事项
|
## 10. 开发注意事项
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
> 本文是团队 RPA 开发的**统一标准**。任何需要"自动操作软件界面"的 skill,都应先读这份文档,按这里的选型和范式落地,不要每个项目重新踩坑。
|
> 本文是团队 RPA 开发的**统一标准**。任何需要"自动操作软件界面"的 skill,都应先读这份文档,按这里的选型和范式落地,不要每个项目重新踩坑。
|
||||||
|
|
||||||
|
网页账号 / Profile 依赖公开兄弟技能 **account-manager**;浏览器 RPA 原语来自 **jiangchang-platform-kit**。二者 Gitea 地址、clone 方式与红线见 [`SHARED_REPOS.md`](SHARED_REPOS.md)。
|
||||||
|
|
||||||
我们开发的各类 skill,本质上都是在替人操作三类界面:**浏览器、桌面软件、手机软件**。三类的底层技术不同,但**工程范式相同**:可控会话(Profile)、有头运行、拟人操作、失败存证、人工兜底。
|
我们开发的各类 skill,本质上都是在替人操作三类界面:**浏览器、桌面软件、手机软件**。三类的底层技术不同,但**工程范式相同**:可控会话(Profile)、有头运行、拟人操作、失败存证、人工兜底。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
技能根目录 `requirements.txt` **只声明技能特有依赖**;**不要**重复声明 `jiangchang-platform-kit` 或 `playwright`。`SKILL.md` 的 `platform_kit_min_version` 是运行契约,**不是** pip 依赖声明。
|
技能根目录 `requirements.txt` **只声明技能特有依赖**;**不要**重复声明 `jiangchang-platform-kit` 或 `playwright`。`SKILL.md` 的 `platform_kit_min_version` 是运行契约,**不是** pip 依赖声明。
|
||||||
|
|
||||||
|
kit **源码仓**(可 clone 学习,勿 vendor)与其它公开公共仓登记见 [`SHARED_REPOS.md`](SHARED_REPOS.md)。
|
||||||
|
|
||||||
### 何时上调 `platform_kit_min_version`
|
### 何时上调 `platform_kit_min_version`
|
||||||
|
|
||||||
| 情况 | 做法 |
|
| 情况 | 做法 |
|
||||||
|
|||||||
128
development/SHARED_REPOS.md
Normal file
128
development/SHARED_REPOS.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# 公共仓库目录(可扩展)
|
||||||
|
|
||||||
|
本页是技能开发用到的**公开公共仓唯一登记处**,面向技术人员与 AI 编程代理。
|
||||||
|
|
||||||
|
- 仓均在公司**自建 Gitea**:[https://git.jc2009.com/](https://git.jc2009.com/)(基于开源 Gitea 自建,**不是** Gitea 官网)。
|
||||||
|
- 技术人员一般**可直接访问、随时 `git clone` 到本地**,用于研究、学习、对照与跟进更新。
|
||||||
|
- **当前登记 3 项**;以后新增公开公共仓时,**只在本页按类型加行**,不必改散落长文。
|
||||||
|
|
||||||
|
深度规范仍在 [`RPA.md`](RPA.md)、[`RUNTIME.md`](RUNTIME.md)、[`ADAPTER.md`](ADAPTER.md)、[`DEVELOPMENT.md`](DEVELOPMENT.md);本页只做**指路 + 边界**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 类型(可扩展)
|
||||||
|
|
||||||
|
| 类型 id | 含义 | 典型消费方式 |
|
||||||
|
|---------|------|--------------|
|
||||||
|
| `skill-template` | 业务技能作者脚手架与规范源 | clone 学习;`scaffold` / 复制出新业务仓;**不要**在模板仓写业务 |
|
||||||
|
| `sibling-skill` | 与业务技能并列安装的公开基础设施技能 | clone 学契约;运行时经 **CLI / 封装客户端** 调用 |
|
||||||
|
| `python-sdk` | 共享 Python 库(源码仓 + 宿主共享 venv 安装) | clone 读实现 / 贡献;运行时 **`import`**,**禁止 vendor** 进技能仓 |
|
||||||
|
| `asset-bundle` | (预留)共享媒体/资源包等 | 按该仓说明拉取或由 kit/宿主解析 |
|
||||||
|
| `tooling` | (预留)发布脚本、脚手架、CI 辅助等 | clone 使用或引用其 workflow |
|
||||||
|
|
||||||
|
新增类型时:先在本表加一行类型说明,再在 §2 登记表增加实例。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 当前登记表
|
||||||
|
|
||||||
|
| 短名 | 类型 | Gitea(唯一入口) | 一句话职责 |
|
||||||
|
|------|------|-------------------|------------|
|
||||||
|
| **skill-template** | `skill-template` | [https://git.jc2009.com/client-commons/skill-template](https://git.jc2009.com/client-commons/skill-template) | 新业务技能的开发模板、目录规范与发布约定 |
|
||||||
|
| **account-manager** | `sibling-skill` | [https://git.jc2009.com/client-commons/account-manager](https://git.jc2009.com/client-commons/account-manager) | 账号 / 凭据 / 浏览器 Profile / 租约的统一入口 |
|
||||||
|
| **jiangchang-platform-kit** | `python-sdk` | [https://git.jc2009.com/client-jiangchang/jiangchang-platform-kit](https://git.jc2009.com/client-jiangchang/jiangchang-platform-kit) | 共享 SDK(`jiangchang_skill_core` 等);技能发布可复用 CI 也在此仓 |
|
||||||
|
|
||||||
|
本地常见路径(仅作对照,以你机器为准):
|
||||||
|
|
||||||
|
- `D:\OpenClaw\client-commons\skill-template`
|
||||||
|
- `D:\OpenClaw\client-commons\account-manager`
|
||||||
|
- `D:\OpenClaw\client-jiangchang\jiangchang-platform-kit`
|
||||||
|
|
||||||
|
### 2.1 skill-template
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|----|------|
|
||||||
|
| **Clone 为了什么** | 读 `development/`、跟模板版本、用 `tools/scaffold_skill` 开新技能 |
|
||||||
|
| **怎么用** | 来源 B:scaffold;或学完后在业务仓开发。规范以本仓为准 |
|
||||||
|
| **红线** | 不要在模板仓写业务;业务仓 `origin` 不得指向本仓;不得保留 `.openclaw-skill-template` |
|
||||||
|
| **深入** | 本目录 [`README.md`](README.md)、[`DEVELOPMENT.md`](DEVELOPMENT.md) |
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
git clone https://git.jc2009.com/client-commons/skill-template.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 account-manager
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|----|------|
|
||||||
|
| **Clone 为了什么** | 读 CLI / `references/INTEGRATION.md`、平台表、租约与错误码;排 `NO_ACCOUNT` / `LEASE_CONFLICT` 等 |
|
||||||
|
| **怎么用(业务技能)** | 经 `scripts/service/account_client.py`(或等价)**subprocess 调 CLI**;网页 RPA 须先拿到 `profile_dir`(`ensure-web` / `pick-web`) |
|
||||||
|
| **红线** | **禁止**业务技能 `import` 其内部 `rpa_helpers` / 散落存密码(见 `POLICY-RPA-001`);对方文档若写「同进程 rpa_helpers」,**以本模板约束为准** |
|
||||||
|
| **深入** | 对方仓 `references/INTEGRATION.md`、`CLI.md`;本模板 [`RPA.md`](RPA.md) §0.2、[`ADAPTER.md`](ADAPTER.md) |
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
git clone https://git.jc2009.com/client-commons/account-manager.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 jiangchang-platform-kit
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|----|------|
|
||||||
|
| **Clone 为了什么** | 读 `jiangchang_skill_core`(config / logging / activity·SRCP / rpa / sibling_bridge 等)、跟版本、贡献共享 API |
|
||||||
|
| **怎么用(业务技能)** | 运行时由**宿主共享 venv** 提供;技能内 `import jiangchang_skill_core...`。`SKILL.md` 的 `platform_kit_min_version` 是兼容声明 |
|
||||||
|
| **红线** | **不要**把 `jiangchang-platform-kit` / `playwright` 写入技能 `requirements.txt`;**不要**在技能仓 vendor `jiangchang_skill_core/`(`POLICY-RUNTIME-002`) |
|
||||||
|
| **深入** | 对方仓 `README.md`;本模板 [`RUNTIME.md`](RUNTIME.md)、[`LOGGING.md`](LOGGING.md) |
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
git clone https://git.jc2009.com/client-jiangchang/jiangchang-platform-kit.git
|
||||||
|
```
|
||||||
|
|
||||||
|
私有 PyPI 索引(维护/排障用,日常技能开发通常不必手装):
|
||||||
|
`https://git.jc2009.com/api/packages/client-jiangchang/pypi/simple/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 三者关系(别当成三个无关收藏夹)
|
||||||
|
|
||||||
|
```text
|
||||||
|
规范 / 脚手架 ──────────► skill-template(本仓)
|
||||||
|
│
|
||||||
|
业务技能 scripts/ ──import──► 宿主共享 venv 中的 platform-kit
|
||||||
|
│
|
||||||
|
└──CLI──► account-manager(兄弟技能,要先拿到 profile_dir 等)
|
||||||
|
```
|
||||||
|
|
||||||
|
- **写规范、开新仓** → 打开 **skill-template**
|
||||||
|
- **少写公共 Python、进度/RPA 原语** → 用 **kit**(运行靠宿主;源码可 clone)
|
||||||
|
- **账号与浏览器 Profile** → 用 **account-manager**(运行靠 CLI;源码可 clone)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 何时该打开哪个仓
|
||||||
|
|
||||||
|
| 场景 | 优先打开 |
|
||||||
|
|------|----------|
|
||||||
|
| 不知道新技能目录/发布/developer_ids 怎么做 | **skill-template** `development/` |
|
||||||
|
| 定 `platform_key`、ensure-web、租约、凭证存储 | **account-manager** + 本模板 RPA/ADAPTER |
|
||||||
|
| 看 `emit` / `finish` / `@rpa_step` / `launch_persistent_browser` 实现 | **jiangchang-platform-kit** |
|
||||||
|
| 技能发布 CI / reusable workflow 从哪来 | **jiangchang-platform-kit** `.github/workflows/` |
|
||||||
|
| 「公共东西到底在哪」 | **本页登记表** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 以后如何新增一条公共仓(维护约定)
|
||||||
|
|
||||||
|
1. 确认公开可访问,URL 使用 `https://git.jc2009.com/...`(勿写 Gitea 官网)。
|
||||||
|
2. 选定或新增 §1 **类型**。
|
||||||
|
3. 在 §2 **登记表**加一行;必要时增加 `§2.x` 短节(消费方式 + 红线 + clone 示例)。
|
||||||
|
4. 若改变业务技能硬约束,同步 [`POLICY_MATRIX.md`](POLICY_MATRIX.md) / 相关深度文档。
|
||||||
|
5. **不要**只在某个业务技能 README 里私藏链接而不登记本页。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 相关链接
|
||||||
|
|
||||||
|
- 开发入口:[`README.md`](README.md)
|
||||||
|
- 运行时:[`RUNTIME.md`](RUNTIME.md)
|
||||||
|
- 网页 RPA / 账号:[`RPA.md`](RPA.md)、[`ADAPTER.md`](ADAPTER.md)
|
||||||
|
- 脚手架:[`../tools/README.md`](../tools/README.md)
|
||||||
@@ -81,7 +81,7 @@ def test_whatever():
|
|||||||
|
|
||||||
未设置环境变量 ⇒ 等价 `unit`。
|
未设置环境变量 ⇒ 等价 `unit`。
|
||||||
|
|
||||||
默认策略摘要:**不要在 unittest 必跑路径误设 `OPENCLAW_TEST_TARGET=real_*`**。
|
默认策略摘要:**不要在 unittest 必跑路径误设 `OPENCLAW_TEST_TARGET=real_*`**(CI 仍离线)。业务 `.env` 模板默认是 `real_rpa`,与「单测用 mock」不冲突;**mock 通 ≠ 交活**。
|
||||||
|
|
||||||
档位读取与业务代码一致:经 `jiangchang_skill_core.config.get("OPENCLAW_TEST_TARGET")`(见 `CONFIG.md`)。
|
档位读取与业务代码一致:经 `jiangchang_skill_core.config.get("OPENCLAW_TEST_TARGET")`(见 `CONFIG.md`)。
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""技能标识、版本与平台公共库约束(复制后请修改 slug/version/logger)。"""
|
"""技能标识、版本与平台公共库约束(复制后请修改 slug/version/logger)。"""
|
||||||
|
|
||||||
SKILL_SLUG = "your-skill-slug"
|
SKILL_SLUG = "your-skill-slug"
|
||||||
SKILL_VERSION = "1.0.53"
|
SKILL_VERSION = "1.0.56"
|
||||||
LOG_LOGGER_NAME = "openclaw.skill.your_skill_slug"
|
LOG_LOGGER_NAME = "openclaw.skill.your_skill_slug"
|
||||||
PLATFORM_KIT_MIN_VERSION = "1.2.2"
|
PLATFORM_KIT_MIN_VERSION = "1.2.2"
|
||||||
|
|||||||
@@ -84,8 +84,8 @@ class TestConfigBootstrap(unittest.TestCase):
|
|||||||
config.reset_cache()
|
config.reset_cache()
|
||||||
with open(example, encoding="utf-8") as f:
|
with open(example, encoding="utf-8") as f:
|
||||||
example_text = f.read()
|
example_text = f.read()
|
||||||
self.assertIn(_env_line(_TEST_TARGET_KEY, "mock").strip(), example_text)
|
self.assertIn(_env_line(_TEST_TARGET_KEY, "real_" + "rpa").strip(), example_text)
|
||||||
self.assertEqual(config.get(_TEST_TARGET_KEY), "mock")
|
self.assertEqual(config.get(_TEST_TARGET_KEY), "real_" + "rpa")
|
||||||
|
|
||||||
def test_config_path_outputs_json(self) -> None:
|
def test_config_path_outputs_json(self) -> None:
|
||||||
with IsolatedDataRoot(user_id="_cfg_path"):
|
with IsolatedDataRoot(user_id="_cfg_path"):
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class TestEnvExampleVideoDefaults(unittest.TestCase):
|
|||||||
with open(path, encoding="utf-8") as f:
|
with open(path, encoding="utf-8") as f:
|
||||||
text = f.read()
|
text = f.read()
|
||||||
for key in (
|
for key in (
|
||||||
"OPENCLAW_" + "TEST_TARGET=mock",
|
"OPENCLAW_" + "TEST_TARGET=real_" + "rpa",
|
||||||
"OPENCLAW_RECORD_VIDEO=0",
|
"OPENCLAW_RECORD_VIDEO=0",
|
||||||
"OPENCLAW_ARTIFACTS_ON_FAILURE=1",
|
"OPENCLAW_ARTIFACTS_ON_FAILURE=1",
|
||||||
"OPENCLAW_BROWSER_HEADLESS=0",
|
"OPENCLAW_BROWSER_HEADLESS=0",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
git clone https://git.jc2009.com/<org>/<your-skill-slug>.git
|
git clone https://git.jc2009.com/<org>/<your-skill-slug>.git
|
||||||
```
|
```
|
||||||
|
|
||||||
完整说明见 [`../development/DEVELOPMENT.md`](../development/DEVELOPMENT.md) §4「来源 A」。下面脚手架用于**本地已有 skill-template、要新建尚未灌仓目录**的场景(来源 B)。
|
完整说明见 [`../development/DEVELOPMENT.md`](../development/DEVELOPMENT.md) §4「来源 A」。公开公共仓(含本模板、account-manager、platform-kit)登记见 [`../development/SHARED_REPOS.md`](../development/SHARED_REPOS.md)。下面脚手架用于**本地已有 skill-template、要新建尚未灌仓目录**的场景(来源 B)。
|
||||||
|
|
||||||
## 推荐:脚手架创建新技能
|
## 推荐:脚手架创建新技能
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user