Compare commits

..

3 Commits

Author SHA1 Message Date
4ed49495cf chore: default OPENCLAW_TEST_TARGET to real_rpa; host UX acceptance
All checks were successful
技能自动化发布 / release (push) Successful in 9s
2026-07-20 11:15:20 +08:00
8101b5ac01 docs: add extensible SHARED_REPOS catalog for public commons
All checks were successful
技能自动化发布 / release (push) Successful in 11s
2026-07-20 10:30:36 +08:00
c15854c20d docs: align host placements (row/batch), Gitea clone, developer_ids QA
All checks were successful
技能自动化发布 / release (push) Successful in 16s
2026-07-20 09:54:44 +08:00
23 changed files with 339 additions and 184 deletions

View File

@@ -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://);换环境时再改,一般保持默认即可

View File

@@ -9,6 +9,21 @@
- 小节正文写用户能看懂的变化(新能力、修复、注意事项),避免堆砌内部实现细节
- 打 tag 前**必须**为即将发布的版本新增一节;找不到匹配小节时,本次发布不会更新 changelog 字段
## 1.0.55
- 模板 `.env.example` 默认 `OPENCLAW_TEST_TARGET=real_rpa`;四档保留;明确 mock 只保单测/CImock 通 ≠ 交活
- 验收要求 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
- 宿主入口对齐:`row` / `batch` 升格为正式 placements支持 `bind.inputMapping``readOnly`;已声明入口均须自测(含技能详情直调)
- 开发文档:自建 Giteagit.jc2009.com与 scaffold 双来源;`developer_ids` 示例改为占位「你的用户ID」压缩 AI 工具章节
## 1.0.52
- 开发文档补齐全流程Gitea 克隆与本地模板复制两种拿仓方式;`developer_ids` 作为开发期自测通行证(下载安装注册 → 设置复制用户 ID

View File

@@ -1,7 +1,7 @@
---
name: 技能开发模板(通用业务版)
description: "OpenClaw 通用业务技能开发模板,供复制后定制新业务 skill。定制步骤见 development/DEVELOPMENT.md。"
version: 1.0.52
version: 1.0.55
author: 深圳匠厂科技有限公司
metadata:
openclaw:
@@ -25,7 +25,7 @@ allowed-tools:
### 架构铁律(先读)
- **单业务内核、多入口**:数据管理 / 定时任务 / Agent / 技能详情 / 直接 CLI 必须复用同一 domain service禁止按入口复制业务逻辑禁止按 `source` 分叉业务行为。
- **`placements`**:只决定 Action **出现在哪里**toolbar / cron / agent / skill-detail
- **`placements`**:只决定 Action **出现在哪里**toolbar / row / batch / cron / agent / skill-detail
- **`bind.tables`**:只决定数据管理出现在哪些表;含 `toolbar` 时**必须**显式非空绑定。
- **`executionProfile`**:只决定执行方式——`sync` 当场返回结果,`async` 进**任务中心**。与 placements / 入口**无关**。心智上多数为 sync仅长任务 / RPA 标 async宿主省略该字段时按 sync。每个 Action **仍必须**显式写 `sync``async`
- **同步数据**写技能本地库、不生成导出文件;**导出当前表**由宿主数据管理负责;特殊业务报告才另做 `export-*`

View File

@@ -4,7 +4,7 @@
- `examples/`CLI 成功输出形状示例(虚构路径与数据)。
- `schemas/`:轻量 JSON Schema`skill-actions.schema.json` 为**新技能严格规范**`task-log-record.schema.json` 等)。
`skill-actions.schema.json` 使用 `additionalProperties: false`。正式支持 `bind.tables`toolbar Action 必填)`row`/`batch` placements 与 `concurrency`/`locks` 仍为预留。`placements``executionProfile` 正交——进任务中心只看 `async`,与入口无关。表级 Action 与 Agent 契约见 [`references/ACTIONS.md`](../references/ACTIONS.md);开发深度规范见 [`development/SKILL_ACTION_RUNTIME.md`](../development/SKILL_ACTION_RUNTIME.md)。
`skill-actions.schema.json` 使用 `additionalProperties: false`。正式支持 `bind.tables`toolbar Action 必填)与可选 `bind.inputMapping`placements 含 `toolbar` / `row` / `batch` / `cron` / `agent` / `skill-detail`(对齐匠厂宿主)。`concurrency`/`locks` 仍为预留。`placements``executionProfile` 正交——进任务中心只看 `async`,与入口无关。表级 Action 与 Agent 契约见 [`references/ACTIONS.md`](../references/ACTIONS.md);开发深度规范见 [`development/SKILL_ACTION_RUNTIME.md`](../development/SKILL_ACTION_RUNTIME.md)。
- 用户市场四 Tab 见根目录 [`README.md`](../README.md) / [`TUTORIAL.md`](../TUTORIAL.md) / [`DEMO.md`](../DEMO.md) / [`CHANGELOG.md`](../CHANGELOG.md)
- Agent 调用/编排参考见 [`references/`](../references/)(含 [`ACTIONS.md`](../references/ACTIONS.md)

View File

@@ -26,7 +26,7 @@
"placement": {
"type": "string",
"enum": ["toolbar", "row", "batch", "cron", "agent", "skill-detail"],
"description": "稳定支持 toolbar/cron/agent/skill-detailrow/batch 为预留入口,新技能示例不得使用。placements 与 executionProfile 正交,不做条件限制。"
"description": "稳定支持 toolbar/row/batch/cron/agent/skill-detail(对齐匠厂宿主)。placements 与 executionProfile 正交,不做条件限制。"
},
"scalarArg": {
"type": ["string", "number", "boolean"]
@@ -48,7 +48,11 @@
"type": "array",
"minItems": 1
},
"sensitive": { "type": "boolean" }
"sensitive": { "type": "boolean" },
"readOnly": {
"type": "boolean",
"description": "宿主数据管理表单只读展示该字段(仍会随提交传入 entrypoint用于行内/勾选预填的主键等"
}
}
},
"inputSchema": {
@@ -110,10 +114,15 @@
"pattern": "^[a-z][a-z0-9_]*$",
"description": "英文 snake_case 业务表名;须真实存在于技能 SQLite / _jiangchang_tables"
},
"description": "数据管理表级绑定:决定 toolbar Action 出现在哪些表。宿主兼容旧技能时,缺失 bind 可视为全表展示;新技能 toolbar Action 必须显式声明。"
"description": "数据管理表级绑定:决定 toolbar/row/batch Action 出现在哪些表。宿主兼容旧技能时,缺失 bind 可视为全表展示;新技能 toolbar Action 必须显式声明。"
},
"inputMapping": {
"type": "object",
"additionalProperties": { "type": "string", "minLength": 1 },
"description": "可选。将 $row.$pk / $row.col / $selection.ids 等映射到 inputSchema 字段名,供 row/batch 预填。"
}
},
"description": "Phase 1 仅沉淀 bind.tables不包含 selection/inputMapping/columns/row/concurrency/locks"
"description": "表级绑定toolbar 必填。可选 inputMapping 供行内/批量预填。concurrency/locks 勿写入。"
},
"action": {
"type": "object",

View File

@@ -1,6 +1,6 @@
# 适配器标准:真实/仿真 × 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` |
| **`simulator_rpa`** | 仿真站点或桌面仿真,可半集成 | 开发联调可选 |
| **`real_api`** | 真实 API | 生产 / 集成测试显式设 `OPENCLAW_TEST_TARGET=real_api` |
| **`real_rpa`** | 真实浏览器/真实系统 | 生产 / 集成测试显式设 `OPENCLAW_TEST_TARGET=real_rpa` |
| **`mock`** | 纯内存或 fixture离线 | **单测 / CI 必过**mock 不通不要往下走 |
| **`simulator_rpa`** | 仿真站点或桌面仿真,可半集成 | 按业务场景选用 |
| **`real_api`** | 真实 API | 按业务场景选用(有官方接口时) |
| **`real_rpa`** | 真实浏览器/真实系统 | **模板 `.env.example` 默认**;业务自测与交活用此档 |
- **mock**:纯离线、不联网,给单测 / CI / 开发自测**保证可重复**。
- **simulator_rpa**:操作仿真平台(如 `sandbox.jc2009.com`跑端到端流程但不碰生产
- **real_api**:有官方接口时**首选**(最稳、最快、最易维护)
- **real_rpa**没有 API 只能操作生产界面,**风险最高、放最后**
- **mock**:纯离线、不联网,给单测 / CI**保证可重复**。**mock 通 ≠ 开发完成**。
- **simulator_rpa**:操作仿真平台(如 `sandbox.jc2009.com`按场景选用
- **real_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`)。
@@ -72,7 +72,7 @@ scripts/service/
from jiangchang_skill_core import config
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"):
return MockAdapter()
if target == "real_api":

View File

@@ -48,7 +48,7 @@
```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=后台静默(勿作日常用法)
@@ -58,7 +58,7 @@ OPENCLAW_BROWSER_HEADLESS=0 # 0=显示窗口(必须,便于介入与排查
```ini
# ── 运行模式 / adapter 档位(见 development/ADAPTER.md──
OPENCLAW_TEST_TARGET=real_rpa # 生产默认真实 RPA单测/CI 可改为 mock
OPENCLAW_TEST_TARGET=mock # 见 development/ADAPTER.md单测用 mock
# ── 好看视频 / 百度账号(须与 account-manager 平台 key 一致)──
TARGET_PLATFORM=baidu
@@ -73,7 +73,7 @@ HAOKAN_VIDEO_SELECTOR=video.art-video
```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://);换环境时再改,一般保持默认即可

View File

@@ -1,6 +1,6 @@
# 技能开发教程
这份文档是给**技术人员**看的,目标不是解释概念,而是让你拿到 `skill-template` 后,可以**一步一步开发出一个新的 skill**。
这份文档是给**技术人员**看的,目标不是解释概念,而是让你拿到**业务技能仓库**后,可以**一步一步开发出一个新的 skill**。
本文默认你开发的是当前最常见的一类业务 skill
@@ -13,65 +13,18 @@
## 推荐 AI 开发工具
当前 skill 开发建议尽量配合 AI 编程工具使用。这样做不是为了替代技术人员,而是为了提升以下环节的效率:
建议用 AI 编程工具辅助搭目录、补样板、写测试与排错。团队宜统一 12 个主力,避免协作习惯发散。
- 搭建标准目录结构
- 生成样板代码
- 理解旧项目代码
- 批量补文档、注释和测试
- 辅助排查报错与重构代码
| 场景 | 建议 |
|------|------|
| 一体化 IDE | Cursor 或 Windsurf |
| 终端深度代理 | Claude Code 或 Aider |
| 国内生态 | Trae / 通义灵码 |
| VS Code 插件 | GitHub Copilot 或 Cline |
建议团队统一选择 1 到 2 个主力工具长期使用,避免每个人工具链差异太大,导致协作方式不一致
官方下载与文档以各产品站点为准;技能开发步骤以本文与同目录规范为准,不依赖某一家工具的专有流程
下面先列国外主流工具,再列国内主流工具。链接优先使用官方站点、官方文档或官方安装入口
### 国外主流工具
| 工具 | 类型 | 适合场景 | 官方入口 |
|------|------|----------|----------|
| Cursor | 独立 AI IDE | 代码编辑、Agent 开发、整仓理解 | <a href="https://www.cursor.com/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://www.cursor.com/downloads" target="_blank" rel="noopener noreferrer">下载</a> |
| Windsurf | 独立 AI IDE | Agent 编程、项目生成、连续开发流 | <a href="https://docs.codeium.com/windsurf" target="_blank" rel="noopener noreferrer">文档</a> / <a href="https://windsurf.com/download" target="_blank" rel="noopener noreferrer">下载</a> |
| GitHub Copilot | IDE 插件 / 编程助手 | 日常补全、解释代码、生成函数、配合 VS Code 或 JetBrains 使用 | <a href="https://github.com/copilot" target="_blank" rel="noopener noreferrer">官网</a> |
| Claude Code | 终端 / IDE 编程代理 | 命令行开发、代码库分析、自动改代码、运行命令 | <a href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://docs.anthropic.com/en/docs/claude-code/" target="_blank" rel="noopener noreferrer">文档</a> |
| Codex | 终端 / IDE / Web 编程代理 | OpenAI 官方编码代理,适合代码生成、理解、调试、评审 | <a href="https://developers.openai.com/codex/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://developers.openai.com/codex/quickstart" target="_blank" rel="noopener noreferrer">快速开始</a> |
| Aider | 终端 AI 编程工具 | 已有代码仓库的增量开发、终端协作、快速提交 | <a href="https://www.aider.chat/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://aider.chat/docs/" target="_blank" rel="noopener noreferrer">文档</a> |
| Cline | VS Code / JetBrains 插件 | 编辑器内 Agent 开发、命令执行、浏览器联动调试 | <a href="https://cline.bot/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://docs.cline.bot/introduction/welcome" target="_blank" rel="noopener noreferrer">文档</a> / <a href="https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev" target="_blank" rel="noopener noreferrer">VS Code 插件</a> |
### 国内主流工具
| 工具 | 类型 | 适合场景 | 官方入口 |
|------|------|----------|----------|
| Trae | 独立 AI IDE | AI 辅助写代码、项目搭建、对话式开发 | <a href="https://www.trae.ai/home" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://www.trae.ai/download" target="_blank" rel="noopener noreferrer">下载</a> |
| 通义灵码 | 独立 IDE / IDE 插件 | 国内团队日常编码、问答、补全、代码生成 | <a href="https://tongyi.aliyun.com/lingma/?channel=yy_AiBot" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://tongyi.aliyun.com/lingma/download" target="_blank" rel="noopener noreferrer">下载</a> |
| CodeGeeX | IDE 插件 / 开源助手 | 代码补全、生成、注释、跨语言辅助 | <a href="https://github.com/zai-org/CodeGeeX" target="_blank" rel="noopener noreferrer">GitHub</a> / <a href="https://marketplace.visualstudio.com/items?itemName=aminer.codegeex" target="_blank" rel="noopener noreferrer">VS Code 插件</a> |
| 腾讯 CodeBuddy | IDE 插件 | 代码补全、测试生成、智能问答、腾讯云开发体系协作 | <a href="https://www.codebuddy.ai/" target="_blank" rel="noopener noreferrer">官网</a> / <a href="https://www.tencentcloud.com/document/product/1256" target="_blank" rel="noopener noreferrer">文档</a> / <a href="https://marketplace.visualstudio.com/items?itemName=Tencent-Cloud.coding-copilot" target="_blank" rel="noopener noreferrer">VS Code 插件</a> |
| 百度文心快码Baidu Comate | IDE 插件 | 国内研发团队辅助编码、解释、测试、优化 | <a href="https://comate.baidu.com/zh" target="_blank" rel="noopener noreferrer">官网</a> |
### 选型建议
如果你们团队主要做这类 Python skill 开发,我建议这样选:
- 想要一体化最强体验:优先试 `Cursor``Windsurf`
- 想要命令行深度协作:优先试 `Claude Code``Aider`
- 想继续基于 VS Code 插件体系:优先试 `GitHub Copilot``Cline``通义灵码``CodeBuddy`
- 想优先使用国内生态与中文支持:优先试 `Trae``通义灵码``CodeGeeX``CodeBuddy``文心快码`
### 团队落地建议
为了减少培训成本,建议内部至少统一一套主工具方案:
- 国外方案:`Cursor` + `Claude Code`
- 国内方案:`Trae` + `通义灵码`
- VS Code 插件方案:`GitHub Copilot` + `Cline`
不建议每位技术人员完全自由发挥,否则后续在:
- 提示词写法
- 代码修改习惯
- 调试方式
- 提交节奏
这些方面会越来越不统一。
开发中常用的**公开公共仓**skill-template / account-manager / jiangchang-platform-kit 等,可 `git clone` 学习,目录可扩展)见 [`SHARED_REPOS.md`](SHARED_REPOS.md)
## 1. 先理解模板的定位
@@ -81,7 +34,7 @@
| 来源 | 适用情况 | 怎么做 |
|------|----------|--------|
| **A. Gitea 克隆** | 项目经理已在 [git.jc2009.com](https://git.jc2009.com/) 开好业务仓并给你权限 | `git clone` 到本地后按 [`REQUIREMENTS.md`](REQUIREMENTS.md) 开发 |
| **A. Gitea 克隆** | 项目经理已在自建 Gitea[https://git.jc2009.com/](https://git.jc2009.com/)**不是** Gitea 官网)开好业务仓并给你权限 | `git clone` 到本地后按 [`REQUIREMENTS.md`](REQUIREMENTS.md) 开发 |
| **B. 本地模板复制** | 你本机已有 `skill-template` 源码,要新建尚未灌仓的技能目录 | **优先** [`tools/scaffold_skill.ps1`](../tools/scaffold_skill.ps1)(见 [`tools/README.md`](../tools/README.md));也可手工复制但必须清掉模板 `.git` |
拿到仓库后的推荐顺序:
@@ -200,7 +153,7 @@ scripts/
from jiangchang_skill_core.rpa import launch_persistent_browser, anti_detect, wait_for_captcha_pass
```
上述 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 里重复造包**(尚待实战验证)。
---
@@ -270,7 +223,7 @@ release workflow 会对 `scripts/` 下的 Python 源码做加密/打包。当前
#### 来源 A从 Gitea 克隆(项目经理已开仓)
1. 确认项目经理已在 [https://git.jc2009.com/](https://git.jc2009.com/) 创建**本技能**仓库,并给你拉取/推送权限。
1. 确认项目经理已在自建 Gitea[https://git.jc2009.com/](https://git.jc2009.com/),公司基于开源 Gitea 自建的代码仓库,**不要**访问 Gitea 官网当作业务仓地址)创建**本技能**仓库,并给你拉取/推送权限。
2. 克隆到本地(示例):
```powershell
@@ -328,7 +281,7 @@ git remote -v
目录名要和 skill slug 对齐,后面很多地方都依赖这个命名。
### 第二步:先改 4 个最关键标识
### 第二步:先改关键标识与占位
拿到仓库并填好 / 更新 [`REQUIREMENTS.md`](REQUIREMENTS.md) 后,优先改下面这些地方:
@@ -410,7 +363,7 @@ git remote -v
#### 目的(先理解再填)
开发 / 测试阶段,技能 `release` 到匠厂后,平台侧通常为**不公开**`access_scope = 0`
开发 / 测试阶段,技能 `release` 到匠厂后,平台侧**默认不公开**`access_scope = 0`
- 技能市场里对普通人**不可见**
- **若不额外授权,连开发该技能的技术人员自己也看不见、装不了**
@@ -435,7 +388,7 @@ metadata:
slug: your-skill-slug
category: 通用
developer_ids:
- 12580 # 换成你在匠厂「设置 → 用户信息」复制的用户 ID
- 12345 # 换成「你的用户ID」匠厂「设置 → 用户信息」复制的正整数)
```
约定如下(原有规则保留):
@@ -779,7 +732,7 @@ uses: client-jiangchang/jiangchang-platform-kit/.github/workflows/reusable-relea
.\release.ps1
```
如果你的技能使用了 `metadata.openclaw.developer_ids`,那么这一步触发的发布工作流除了同步 `skills` / `skill_versions` 外,还会在平台侧自动补开发者可见权限。测试非公开技能时,建议重点验证这部分是否生效
发布前 **`developer_ids` 应已配置**(见 §6。本步触发的发布工作流除了同步 `skills` / `skill_versions` 外,还会在平台侧自动补开发者可见权限;发布后应重点确认:用本人账号能在技能市场看到并安装该技能
这一步会自动完成标准发布动作,包括:
@@ -865,23 +818,33 @@ 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 是否有头运行;需登录/验证码时是否停下等人,而不是静默失败
- 数据管理:表名/字段中文、按钮文案是否清楚;结果是否写回用户看得见的地方
- 市场说明 / 教程是否与真实行为一致
| 宿主入口(侧栏 / 界面) | 技能侧如何挂上 | 建议验收什么 |
|-------------------------|----------------|--------------|
| **新建任务**(对话 Agent | `placements` 含 `agent`;或短查询走共享 Python CLI | 自然语言能触发主流程;长任务 / RPA 须走 `run_skill_action`,禁止 bash 干等 |
| **数据管理** | `placements` 含 `toolbar`(须合法非空 `bind.tables`;表数据来自技能本地库 / `init-db` | 左侧能看到本技能库表;表顶栏出现对应按钮;点按行为符合预期 |
| **数据管理 · 表顶栏** | `placements` 含 `toolbar`(须合法非空 `bind.tables` | 左侧能看到本技能库表;表顶栏出现按钮;点按行为符合预期 |
| **数据管理 · 行内** | `placements` 含 `row`(建议 `bind.tables` + `bind.inputMapping` 预填主键) | 行内操作链接可见(需有主键列);点按后入参/行为正确 |
| **数据管理 · 批量** | `placements` 含 `batch` | 勾选行后批量按钮可用;无勾选时禁用;批量行为正确 |
| **定时任务** | `placements` 含 `cron`(创建时选「技能直调」) | 能选到本技能 Action、保存并触发到点或「立即运行」行为正确 |
| **任务中心** | 不是 placement由 `executionProfile: "async"` 决定是否进 Job | 长任务出现进度 / 可取消;来源标签与触发入口一致(对话 / 数据管理 / 定时等) |
| **技能市场 → 技能详情** | 安装与四 Tab 文案;`placements` 含 `skill-detail` 为契约预留 | **必验**安装、说明 / 教程 / 演示 / 更新日志。详情页「技能直调」按钮:当前宿主 UI **尚未落地**manifest 可写 `skill-detail`,勿仅依赖该入口做主验收 |
| **任务中心** | 不是 placement由 `executionProfile: "async"` 决定是否进 Job | 长任务出现进度 / 可取消;来源标签与触发入口一致 |
| **技能市场 → 技能详情** | `placements` 含 `skill-detail`(详情直调) | **必验**安装与四 Tab。详情页「技能直调」按钮随宿主版本上线**已声明则须在具备该 UI 的宿主上完成按钮自测**(与其它入口同等对待,不要只靠 Agent |
补充说明:
- **进不进任务中心只看 `executionProfile`**,与从新建任务、数据管理还是定时任务触发无关(既有正交规则不变)。
- **进不进任务中心只看 `executionProfile`**,与从哪个入口触发无关(既有正交规则不变)。
- 数据管理还依赖库表元数据(`_jiangchang_*` 等,见 [`../references/SCHEMA.md`](../references/SCHEMA.md));仅有 Action、没有可展示库表时侧栏可能看不到表。
- 模板对 `row` / `batch` 的约定仍见 [`../references/ACTIONS.md`](../references/ACTIONS.md)(示例请勿使用);宿主能力以匠厂版本为准,新技能主路径仍以文档已稳定描述的 `toolbar` / `cron` / `agent` 为准
- `row` / `batch` / `toolbar` / `cron` / `agent` / `skill-detail` 均以**当前匠厂宿主已实现能力**为准;字段与示例见 [`../references/ACTIONS.md`](../references/ACTIONS.md)
**新建任务(对话)最小检查:**
@@ -925,7 +888,8 @@ uses: client-jiangchang/jiangchang-platform-kit/.github/workflows/reusable-relea
- [ ] 本仓库**不是** skill-template 的误复制(根目录**无** `.openclaw-skill-template`
- [ ] `git remote -v` 指向**本技能**远端URL 不含 skill-template 仓库名
- [ ] `git log` 首条提交属于本技能(非模板历史)(来源 A 从 Gitea 克隆的已有业务仓,以该仓历史为准)
- [ ] 发布后计划在宿主按 §15 第七步验收:已声明的 **新建任务 / 数据管理 / 定时任务 / 任务中心(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`
## 17. 常见错误

View File

@@ -35,7 +35,7 @@
| POLICY-SKILL-ACTION-001 | 存在 `development/SKILL_ACTION_RUNTIME.md`schema 含 `executionProfile`;业务技能(非模板占位 slug若 service 含 `RpaVideoSession``actions.json` 须有 `executionProfile=async` 且 placements 含 `agent` 的 action | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.md | hard | 文档/schema/manifest 检查 | `tests/test_development_policy_guard.py::TestPolicySkillAction001` |
| POLICY-SKILL-ACTION-002 | 每个 Action 必须显式声明 `executionProfile`,且只能是 `sync``async` | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | schema required + manifest 扫描 | `tests/test_development_policy_guard.py::TestPolicySkillAction002``tests/test_actions_manifest.py` |
| POLICY-SKILL-ACTION-003 | toolbar Action 必须声明合法非空 `bind.tables`snake_case、唯一 | references/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | schema if/then + manifest 扫描 | `tests/test_development_policy_guard.py::TestPolicySkillAction003``tests/test_actions_manifest.py` |
| POLICY-SKILL-ACTION-004 | `placements``executionProfile` 正交文档不得把数据管理入口与异步执行方式硬绑定Schema 须接受 toolbar/cron/agent/skill-detail × sync/async 全部组合 | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | Schema 4×2 矩阵校验 + 文档禁止短语扫描 | `tests/test_actions_manifest.py::test_schema_allows_all_placement_execution_profile_combinations``tests/test_development_policy_guard.py::TestPolicySkillAction004` |
| POLICY-SKILL-ACTION-004 | `placements``executionProfile` 正交文档不得把数据管理入口与异步执行方式硬绑定Schema 须接受 toolbar/row/batch/cron/agent/skill-detail × sync/async 全部组合 | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | Schema 6×2 矩阵校验 + 文档禁止短语扫描 | `tests/test_actions_manifest.py::test_schema_allows_all_placement_execution_profile_combinations``tests/test_development_policy_guard.py::TestPolicySkillAction004` |
| POLICY-ARCH-CORE-001 | 同一业务能力的 Action、CLI、Agent、cron、数据管理入口复用同一业务内核文档要求已声明 | development/DEVELOPMENT.mddevelopment/SKILL_ACTION_RUNTIME.md | hard文档标记 / soft语义 | 文档关键表述存在性;真实复用靠 sample/review | `tests/test_development_policy_guard.py::TestPolicyArchCore001``tests/samples/test_action_core_contract.py.sample` |
| POLICY-DATA-SYNC-001 | 同步型业务须遵循幂等、事务、完整性与空结果保护(文档已声明) | references/SCHEMA.mddevelopment/SKILL_ACTION_RUNTIME.md | hard文档标记 / soft语义 | 文档关键表述存在性;完整语义靠 sample/review | `tests/test_development_policy_guard.py::TestPolicyDataSync001``tests/samples/test_sync_contract.py.sample` |

View File

@@ -1,38 +1,40 @@
# 开发资料入口
本目录面向**人类开发者**与 **AI 编程代理**。技术人员与编程 AI **以本目录为主读路径**`references/` 是 CLI / Action / Schema 契约细节,根目录市场四 Tab 面向最终用户。
## 新技能全流程(先看这张表)
按顺序做;细节与约束见 [`DEVELOPMENT.md`](DEVELOPMENT.md) 对应章节(**不替代**下文深度规范,只作导航)。
| 步骤 | 做什么 | 详见 |
|------|--------|------|
| 1 | **拿到仓库**:① 项目经理在 [Gitea](https://git.jc2009.com/) 开仓并授权后 `git clone`;或 ② 本地已有 `skill-template` 时用 scaffold / 复制出新目录(遵守 Git 红线) | [`DEVELOPMENT.md`](DEVELOPMENT.md) §1、§4 |
| 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 |
| 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 |
| 6 | 匠厂技能市场安装后,按声明测:**新建任务(Agent)** / **数据管理** / **定时任务** / **任务中心**(async) | [`DEVELOPMENT.md`](DEVELOPMENT.md) §15契约见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) |
脚手架与 Git 防串库:[`../tools/README.md`](../tools/README.md)`scaffold_skill.ps1`)。
# 开发资料入口
本目录面向**人类开发者**与 **AI 编程代理**。技术人员与编程 AI **以本目录为主读路径**`references/` 是 CLI / Action / Schema 契约细节,根目录市场四 Tab 面向最终用户。
## 新技能全流程(先看这张表)
按顺序做;细节与约束见 [`DEVELOPMENT.md`](DEVELOPMENT.md) 对应章节(**不替代**下文深度规范,只作导航)。
| 步骤 | 做什么 | 详见 |
|------|--------|------|
| 1 | **拿到仓库**:① 项目经理在 [自建 Gitea](https://git.jc2009.com/)`git.jc2009.com`,非 Gitea 官网)开仓并授权后 `git clone`;或 ② 本地已有 `skill-template` 时用 scaffold / 复制出新目录(遵守 Git 红线) | [`DEVELOPMENT.md`](DEVELOPMENT.md) §1、§4 |
| 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 |
| 4 | **配置 `developer_ids`(开发自测必做)**:开发期技能在匠厂默认不公开;不加则开发者自己也装测不了。从宿主设置复制用户 ID 写入 `SKILL.md` | [`DEVELOPMENT.md`](DEVELOPMENT.md) §6「关于 developer_ids」 |
| 5 | 本地单测mock通过后按业务默认 **`real_rpa`** 真实跑通;再 `release.ps1`;看 Gitea CI。**mock 通 ≠ 完成** | [`ADAPTER.md`](ADAPTER.md)[`DEVELOPMENT.md`](DEVELOPMENT.md) §15 |
| 6 | 匠厂安装后,按已声明入口自测,并看**用户体验**(进度、失败提示、有头 RPA 等) | [`DEVELOPMENT.md`](DEVELOPMENT.md) §15[`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) |
脚手架与 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 前,建议按以下顺序阅读:
1. [`SHARED_REPOS.md`](SHARED_REPOS.md) — **公共仓库目录**(模板 / 账号管理 / platform-kit 等,可扩展)
2. [`REQUIREMENTS.md`](REQUIREMENTS.md) — 需求文档模板与验收标准
3. [`NAMING.md`](NAMING.md) — slug / 仓库名命名规范(复制模板前必读)
4. [`DEVELOPMENT.md`](DEVELOPMENT.md) — 完整开发步骤与目录规范
5. [`TESTING.md`](TESTING.md) — 测试分层、隔离数据根与档位开关
6. [`LOGGING.md`](LOGGING.md) — 日志分层、必打节点、敏感信息红线(**涉及长任务、RPA、外部系统时必读**
7. [`ADAPTER.md`](ADAPTER.md) — 涉及外部系统对接时
8. [`RPA.md`](RPA.md) — 涉及浏览器 / 桌面 / 手机自动化时
9. [`CONFIG.md`](CONFIG.md) — `.env` 规范与 bootstrap 机制
10. [`DATA_PATHS.md`](DATA_PATHS.md) — 下载/导入/导出等本地文件路径标准(涉及文件读写时必读)
11. [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) — Skill Action sync/async、任务中心、Agent 禁令、队列 pick涉及 RPA / 长任务 / 数据管理按钮 / Cron / Agent 时必读)
12. [`RUNTIME.md`](RUNTIME.md) — 共享 runtime、数据路径、发布打包与编码约定
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),不要写进本目录。

View File

@@ -164,16 +164,16 @@
- 代码结构符合模板规范;`SKILL.md` slug 与 `constants.SKILL_SLUG` 一致
- `health``version``init-db` 命令执行正常
- 主命令(如 `run`)在 mock / simulator 档位可重复验证
- `python tests/run_tests.py -v` 必跑测试全部通过
- `python tests/run_tests.py -v` 必跑测试全部通过mock / 离线门禁;**mock 通 ≠ 完成**
- 主命令在业务默认档(模板为 `real_rpa`)真实跑通;不得只 mock 通就交活
- `task_logs` 写入和查询符合 `references/SCHEMA.md`(含 `created_at` / `updated_at` Unix 秒级规范)
- `init_db()` 已写入 `_jiangchang_tables` / `_jiangchang_columns`;用户可见表/字段具备中文 `display_name`
- 字段展示顺序与 `PRAGMA table_info(task_logs)` 的 cid 一致;不依赖 `display_order`
- `tests/test_display_metadata.py` 通过
- 真实联调(如有)放在 `tests/integration/`默认套件不包含真实外联
- 真实联调样例仍放 `tests/integration/`,默认套件不包含真实外联(与业务 `.env` 默认 `real_rpa` 不冲突)
- `SKILL.md``developer_ids` 已配置为开发者本人匠厂用户 ID开发期不公开时否则本人无法在市场安装自测取 ID 步骤见 `development/DEVELOPMENT.md` §6
- 发布后 Gitea 工作流成功;匠厂技能市场对开发者账号可见最新版本并可安装
- 安装后按本技能 `actions.json` 声明完成宿主多入口验收:至少覆盖已声明的「新建任务(Agent)」;若声明了 `toolbar` / `cron` / `async`,还须分别验收数据管理、定时任务、任务中心(见 `development/DEVELOPMENT.md` §15 第七步)
- 安装后按本技能 `actions.json` 声明完成宿主多入口验收(见 `development/DEVELOPMENT.md` §15**须看用户体验**进度可见、失败可读、RPA 有头、文案与真实行为一致等),后台通了不算完
## 10. 开发注意事项
@@ -257,8 +257,8 @@
- 命令可运行tests/run_tests.py -v 通过
- task_logs 符合 SCHEMA
- 正式环境安装验证通过
- `developer_ids` 已配置为「你的用户ID」匠厂设置中复制的正整数
- 正式环境安装验证通过;已声明的宿主入口(新建任务 / 数据管理 / 定时任务 / 任务中心 / 技能详情等)按 DEVELOPMENT §15 自测
## 10. 开发注意事项
- 不修改无关项目;不引入旧模板结构

View File

@@ -2,6 +2,8 @@
> 本文是团队 RPA 开发的**统一标准**。任何需要"自动操作软件界面"的 skill都应先读这份文档按这里的选型和范式落地不要每个项目重新踩坑。
网页账号 / Profile 依赖公开兄弟技能 **account-manager**;浏览器 RPA 原语来自 **jiangchang-platform-kit**。二者 Gitea 地址、clone 方式与红线见 [`SHARED_REPOS.md`](SHARED_REPOS.md)。
我们开发的各类 skill本质上都是在替人操作三类界面**浏览器、桌面软件、手机软件**。三类的底层技术不同,但**工程范式相同**可控会话Profile、有头运行、拟人操作、失败存证、人工兜底。
---

View File

@@ -6,6 +6,8 @@
技能根目录 `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`
| 情况 | 做法 |

128
development/SHARED_REPOS.md Normal file
View 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` 开新技能 |
| **怎么用** | 来源 Bscaffold或学完后在业务仓开发。规范以本仓为准 |
| **红线** | 不要在模板仓写业务;业务仓 `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)

View File

@@ -52,7 +52,7 @@
| `health` / `version` / `config-path` / 纯统计 / 秒级查询 | `sync` |
| 任意 placement含 toolbar | 允许 sync 或 async以 manifest 为准 |
合法:`sync|async` × `toolbar|cron|agent|skill-detail`
合法:`sync|async` × `toolbar|row|batch|cron|agent|skill-detail`
历史说明:旧文档曾错误地把数据管理按钮入口与异步执行方式绑死。该约束**已废止**;模板测试与 Schema **不得**再建立「入口位置决定 sync/async」一类硬耦合。旧版宿主曾「省略 → async」**当前宿主为「省略 → sync」**。新技能仍须显式声明,不得依赖省略行为。
@@ -64,14 +64,16 @@
| 入口(匠厂侧栏 / 界面) | 常见 `source.kind` | 技能侧 | 开发者怎么测 |
|-------------------------|-------------------|--------|--------------|
| **新建任务**(对话 Agent | `agent` | `placements``agent``run_skill_action` | 侧栏「新建任务」→ 对话触发;按 manifest 的 executionProfile 执行 |
| **数据管理** | `data-management` | `placements``toolbar`;须 `bind.tables` | 侧栏「数据管理」→ 打开本技能表 → 点表顶栏技能按钮 |
| **定时任务** | `cron` | `placements` `cron` | 侧栏「定时任务」→ 新建「技能直调」并选本 Action |
| **新建任务**(对话 Agent | `agent` | `placements``agent``run_skill_action` | 侧栏「新建任务」→ 对话触发 |
| **数据管理 · 顶栏** | `data-management` | `toolbar` + 必填 `bind.tables` | 侧栏「数据管理」→ 表顶栏按钮 |
| **数据管理 · 行内** | `data-management` | `row`(建议 `bind.tables` + `inputMapping` | 同行操作链接(需主键) |
| **数据管理 · 批量** | `data-management` | `batch` | 勾选行后点批量按钮 |
| **定时任务** | `cron` | `placements``cron` | 侧栏「定时任务」→「技能直调」 |
| **任务中心** | (各入口触发的 Job | `executionProfile: "async"` | 侧栏「任务中心」查看进度 / 取消;**不是** placement |
| **技能详情** | `skill-detail`(预留) | `placements` `skill-detail` | 市场详情四 Tab / 安装必验;详情直调按钮宿主 UI **尚未落地**,主验收勿只靠此入口 |
| **技能详情** | `skill-detail` | `placements``skill-detail` | 市场详情安装/四 Tab详情直调按钮宿主上线后**同等自测** |
技能 **不要** 在 Python 里按 `source` / placement 写业务分叉;宿主读 manifest 分流展示与等待策略。
发布后按入口逐项验收的操作清单见 [`DEVELOPMENT.md`](DEVELOPMENT.md) §15 第七步。
**已声明的入口都要自测**,不要只测对话。操作清单见 [`DEVELOPMENT.md`](DEVELOPMENT.md) §15 第七步。
---
@@ -83,7 +85,8 @@
|-------------|-------------------------|-----------------|----------------|
| 运行检查 / 版本 / 配置路径 | `sync` | `skill-detail`, `agent` | 无 |
| 库 / 队列统计 | `sync` | `skill-detail`, `agent` | 无 |
| 外源 → 本地库同步 | `sync``async` | 可含 `toolbar`(须 `bind.tables`)、`cron``agent` | 可选 |
| 外源 → 本地库同步 | `sync``async` | 可含 `toolbar`(须 `bind.tables`)、`cron``agent``skill-detail` | 可选 |
| 单行 / 批量数据管理动作 | `sync``async` | `row` / `batch`(建议 `bind.tables`;行内常用 `inputMapping` | 可选 |
| 数据导入 / 失败重置 | `sync``async` | `skill-detail`, `agent` | 可选 |
| **单条**副作用 RPA | `async`(建议) | `agent`, `skill-detail` | **建议** |
| **批量顺序** RPApick | `async`(建议) | `toolbar`, `cron`, `agent` | **建议** |

View File

@@ -81,7 +81,7 @@ def test_whatever():
未设置环境变量 ⇒ 等价 `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`)。

View File

@@ -80,7 +80,7 @@ Action 是**可选能力**
| 字段 / 层 | 只决定什么 | 不决定什么 |
|-----------|------------|------------|
| **`placements`** | Action **出现在哪里**toolbar / cron / agent / skill-detail | 不决定 sync/async |
| **`placements`** | Action **出现在哪里**toolbar / row / batch / cron / agent / skill-detail | 不决定 sync/async |
| **`bind.tables`** | 数据管理里出现在**哪些业务表** | 不决定业务实现 |
| **`executionProfile`** | 宿主是**同步等待**还是**异步 Job** | 不限制可展示入口 |
| **`entrypoint`** | 实际执行哪个 CLI 命令与参数 | 不写业务逻辑 |
@@ -95,9 +95,9 @@ Action 是**可选能力**
| 顶层 | `schemaVersion``skill``actions` |
| action | `id``label``description``placements``entrypoint`、**`executionProfile`(必填)**;可选 `inputSchema``confirmation`、**`bind`** |
| entrypoint | `type = cli``command``args`**必填** JSON 数组,项为 `string` / `number` / `boolean` |
| placements | `toolbar``skill-detail``agent``cron` |
| **bind** | `{ "tables": ["business_table"] }`见下节) |
| inputSchema | 根 `type: object`properties 使用 `string` / `number` / `boolean`;支持 `enum``default``required``sensitive` |
| placements | `toolbar``row``batch``skill-detail``agent``cron` |
| **bind** | `{ "tables": ["business_table"] }`;可选 `inputMapping`(行内/批量预填,见下节) |
| inputSchema | 根 `type: object`properties 使用 `string` / `number` / `boolean`;支持 `enum``default``required``sensitive``readOnly` |
| confirmation | `{ "message": "..." }` |
| **executionProfile** | `"sync"` \| `"async"`**必须显式写出**,禁止依赖缺省) |
@@ -113,14 +113,16 @@ Action 是**可选能力**
规则:
- `bind` 为 object`additionalProperties: false`;当前允许 `tables`
- `bind` 为 object`additionalProperties: false`;当前允许 `tables`(必填键当存在 bind 时)与可选 `inputMapping`
- `tables` 非空数组、元素唯一、英文 **snake_case**、不得为空字符串。
- **`placements``toolbar` 时必须显式声明非空 `bind.tables`**(模板 Schema `if/then` + 自动测试强制)。
- `row` / `batch` **建议**同样声明 `bind.tables`,避免在无关表上露出按钮;未声明时宿主可能按兼容逻辑在更多表上展示。
- 表名须真实存在于技能 SQLite 与 `_jiangchang_tables`
- 希望出现在多张表时,显式列出所有表;**不要**依赖「无 bind 则全表展示」——那是宿主对**旧技能**的兼容,不是新技能标准。
- 本阶段**不**扩展 `selection` / `inputMapping` / `columns` / row binding / concurrency / locks
- **`inputMapping`(可选)**:把行/勾选映射到 `inputSchema` 字段,例如 `"leadId": "$row.$pk"``"ids": "$selection.ids"`。适合 `row` / `batch`。宿主仍会提交这些字段;可用 `inputSchema.properties.*.readOnly: true` 在表单中只读展示
- `concurrency` / `locks` 仍未稳定,**不要**写入新技能 manifest。
默认模板 `actions.json` 仅含 `health` / `version` / `config-path`,不放在 toolbar故无需 `bind` 示例污染默认 manifest。业务示例
默认模板 `actions.json` 仅含 `health` / `version` / `config-path`,不放在 toolbar/row/batch,故无需 `bind` 示例污染默认 manifest。业务示例
```json
{
@@ -134,16 +136,42 @@ Action 是**可选能力**
}
```
行内示例:
```json
{
"id": "retry-one",
"label": "重试本行",
"description": "对当前行执行一次业务重试。",
"placements": ["row"],
"executionProfile": "async",
"bind": {
"tables": ["business_records"],
"inputMapping": { "recordId": "$row.$pk" }
},
"inputSchema": {
"type": "object",
"required": ["recordId"],
"properties": {
"recordId": { "type": "string", "title": "记录 ID", "readOnly": true }
}
},
"entrypoint": {
"type": "cli",
"command": "retry",
"args": ["--id", "{{recordId}}"]
}
}
```
## 预留能力(当前不可当作已实现能力)
| 类别 | 预留项 | 说明 |
|------|--------|------|
| placements | `row``batch` | 行内 / 批量入口,未来扩展;新技能示例不得使用 |
| action 字段 | `concurrency``locks` | 并发与锁控制,未稳定开放 |
| inputSchema | `array`、nested `object``oneOf` 等 | 复杂表单,不属于当前推荐范围 |
`bind` **不是**保留字段;已作为 Phase 1 表级绑定正式能力
`bind``row``batch` **不是**保留能力;已按匠厂宿主正式支持写入本规范
## 执行模型
宿主将 action 转为 argv再用**共享 Python**(用户数据目录下 `python-runtime/.venv`)执行:
@@ -168,7 +196,7 @@ python {skill_root}/scripts/main.py <command> <args...>
| `sync`(或省略时的宿主缺省) | 调用方等待结束,直接返回结构化结果或结构化错误;**不**创建后台 Job | 不进 |
| `async`(须显式声明) | 宿主创建后台 Job立即返回 `jobId`;用 `emit` / `checkpoint` / `finish` 报告进度与终态 | **进入** |
合法组合(全部允许):`sync|async` × `toolbar|cron|agent|skill-detail`
合法组合(全部允许):`sync|async` × `toolbar|row|batch|cron|agent|skill-detail`
经验建议(**不是** placement 硬限制):耗时不可预测、需要暂停/停止/进度展示的任务,用 `async`;其余默认写 `sync`
@@ -199,26 +227,27 @@ HINT: <next step>
| 值 | 含义 |
|----|------|
| `toolbar` | 数据管理第一排技能按钮(须配合 `bind.tables` |
| `skill-detail` | 技能详情或技能市场详情页 |
| `toolbar` | 数据管理表顶栏技能按钮(须配合 `bind.tables` |
| `row` | 数据管理行内操作(建议 `bind.tables` + `inputMapping`;表需有主键) |
| `batch` | 数据管理批量操作(需勾选行;无勾选时宿主禁用按钮) |
| `skill-detail` | 技能详情页直调(与安装/四 Tab 同属技能市场详情;已声明则须自测) |
| `agent` | Agent 可直接调用(`run_skill_action` |
| `cron` | 定时任务可直接调用 |
**预留(模板示例请勿使用):** `row``batch`
| `cron` | 定时任务「技能直调」 |
### Action 类型 × placements常见示例不是限制
下表只表示**常见用法示例**。实际 `placements` 以 manifest 配置为准;**`sync` / `async` 不影响展示入口**。
下表只表示**常见用法示例**。实际 `placements` 以 manifest 配置为准;**`sync` / `async` 不影响展示入口**。已声明的入口都要在宿主自测,不要只测其中一条。
| Action 类型 | 常见 executionProfile | 常见 placements | confirmation |
|-------------|----------------------|-----------------|--------------|
| health / version / config-path | sync | skill-detail, agent | 无 |
| 统计 / 只读查询 | sync | skill-detail, agent | 无 |
| 数据同步(外源 → 本地库) | sync 或 async | toolbar + cron + agent + skill-detail按需 | 可选 |
| 单行重试 / 行内处理 | sync 或 async | row可加 agent | 可选 |
| 批量处理勾选行 | sync 或 async | batch可加 toolbar/cron | 可选 |
| 导入 / 重置 | sync 或 async | skill-detail, agent | 可选 |
| 单条副作用 RPA | async建议 | agent, skill-detail | **建议** |
| 批量顺序 pick RPA | async建议 | toolbar, cron, agent | **建议** |
## 同步数据 vs 导出当前表 vs 特殊业务报告
不要混用「导出」一词:
@@ -236,7 +265,7 @@ HINT: <next step>
当前宿主稳定支持:
- `object` / `string` / `number` / `boolean`
- `enum` / `default` / `required` / `sensitive`
- `enum` / `default` / `required` / `sensitive` / `readOnly`
- 简单模板替换(`{{fieldName}}`
示例:
@@ -281,6 +310,8 @@ HINT: <next step>
- `enum` 在宿主中渲染为选择框
- `required` 字段在提交前校验
- `sensitive` 字段不得出现在低信任入口
- `readOnly: true` 时数据管理表单只读展示该字段(仍随提交传入);适合行内/勾选预填的主键、编号列表
- `placements``batch` 的动作在数据管理表顶常驻,无勾选时禁用(与表删除一致)
- 需要确认的副作用操作使用 `confirmation.message`
- 模板参数使用 `{{fieldName}}`,且必须在 `inputSchema.properties` 中声明
- `entrypoint.args` 项当前只允许 `string``number``boolean`;不允许对象或 `null`

View File

@@ -1,6 +1,6 @@
"""技能标识、版本与平台公共库约束(复制后请修改 slug/version/logger"""
SKILL_SLUG = "your-skill-slug"
SKILL_VERSION = "1.0.52"
SKILL_VERSION = "1.0.55"
LOG_LOGGER_NAME = "openclaw.skill.your_skill_slug"
PLATFORM_KIT_MIN_VERSION = "1.2.2"

View File

@@ -15,7 +15,6 @@ from util.constants import SKILL_SLUG
_TEMPLATE_PLACEHOLDER_SLUG = "your-skill-slug"
_ALLOWED_PLACEMENTS = frozenset({"toolbar", "row", "batch", "cron", "agent", "skill-detail"})
_RESERVED_PLACEMENTS = frozenset({"row", "batch"})
_RESERVED_ACTION_FIELDS = frozenset({"concurrency", "locks"})
_ALLOWED_EXECUTION_PROFILES = frozenset({"sync", "async"})
_REQUIRED_MANIFEST_KEYS = frozenset({"schemaVersion", "skill", "actions"})
@@ -275,13 +274,13 @@ class TestActionsManifest(unittest.TestCase):
self.assertEqual(missing, [], msg="\n".join(missing))
def test_schema_allows_all_placement_execution_profile_combinations(self) -> None:
"""POLICY-SKILL-ACTION-0044 placements × 2 profiles 必须全部通过 Schema。"""
"""POLICY-SKILL-ACTION-0046 placements × 2 profiles 必须全部通过 Schema。"""
try:
import jsonschema
except ImportError:
self.fail("jsonschema is required to validate placement×executionProfile orthogonality")
schema = _load_actions_schema()
placements = ("toolbar", "cron", "agent", "skill-detail")
placements = ("toolbar", "row", "batch", "cron", "agent", "skill-detail")
profiles = ("sync", "async")
for placement in placements:
for profile in profiles:
@@ -346,16 +345,6 @@ class TestActionsManifest(unittest.TestCase):
for snippet in forbidden_snippets:
self.assertNotIn(snippet, text)
def test_template_example_does_not_use_reserved_placements(self) -> None:
manifest = _load_actions_manifest()
for action in manifest["actions"]:
placements = set(action.get("placements") or [])
overlap = placements & _RESERVED_PLACEMENTS
self.assertFalse(
overlap,
msg=f"{action['id']} uses reserved placements not yet supported in template: {overlap}",
)
def test_template_variables_have_input_schema(self) -> None:
manifest = _load_actions_manifest()
for action in manifest["actions"]:

View File

@@ -84,8 +84,8 @@ class TestConfigBootstrap(unittest.TestCase):
config.reset_cache()
with open(example, encoding="utf-8") as f:
example_text = f.read()
self.assertIn(_env_line(_TEST_TARGET_KEY, "mock").strip(), example_text)
self.assertEqual(config.get(_TEST_TARGET_KEY), "mock")
self.assertIn(_env_line(_TEST_TARGET_KEY, "real_" + "rpa").strip(), example_text)
self.assertEqual(config.get(_TEST_TARGET_KEY), "real_" + "rpa")
def test_config_path_outputs_json(self) -> None:
with IsolatedDataRoot(user_id="_cfg_path"):

View File

@@ -1211,7 +1211,7 @@ class TestPolicySkillAction004(unittest.TestCase):
msg=_policy_msg(
"POLICY-SKILL-ACTION-004",
"tests/test_actions_manifest.py",
"missing Schema 4×2 orthogonality matrix test",
"missing Schema 6×2 orthogonality matrix test",
),
)

View File

@@ -61,7 +61,7 @@ class TestEnvExampleVideoDefaults(unittest.TestCase):
with open(path, encoding="utf-8") as f:
text = f.read()
for key in (
"OPENCLAW_" + "TEST_TARGET=mock",
"OPENCLAW_" + "TEST_TARGET=real_" + "rpa",
"OPENCLAW_RECORD_VIDEO=0",
"OPENCLAW_ARTIFACTS_ON_FAILURE=1",
"OPENCLAW_BROWSER_HEADLESS=0",

View File

@@ -1,5 +1,15 @@
# skill-template 工具
## 业务仓也可以直接 clone来源 A
若项目经理已在**公司自建 Gitea**[https://git.jc2009.com/](https://git.jc2009.com/),基于开源 Gitea 自建,**不是** Gitea 官网)开好业务技能仓库并授权,技术人员应直接:
```powershell
git clone https://git.jc2009.com/<org>/<your-skill-slug>.git
```
完整说明见 [`../development/DEVELOPMENT.md`](../development/DEVELOPMENT.md) §4「来源 A」。公开公共仓含本模板、account-manager、platform-kit登记见 [`../development/SHARED_REPOS.md`](../development/SHARED_REPOS.md)。下面脚手架用于**本地已有 skill-template、要新建尚未灌仓目录**的场景(来源 B
## 推荐:脚手架创建新技能
**不要**用资源管理器整文件夹复制 `skill-template`(会带走隐藏 `.git`,导致 push 串库)。