jeecgboot

Registry 색인

jeecg-bpmn

Use when user asks to create/generate/edit/modify a BPM workflow, design a Flowable BPMN process, or says "创建流程", "生成流程", "新建流程", "设计流程", "画流程", "审批流程", "工作流", "BPM", "BPMN", "create flow", "create process", "new workflow", "generate workflow". Also triggers when user describes a

소스 확인GitHub에서 보기
가격 미확인★ 226 GitHub 스타목록 업데이트 · 2026년 9월 17일agent-skill

개요

Use when user asks to create/generate/edit/modify a BPM workflow, design a Flowable BPMN process, or says "创建流程", "生成流程", "新建流程", "设计流程", "画流程", "审批流程", "工作流", "BPM", "BPMN", "create flow", "create process", "new workflow", "generate workflow". Also triggers when user describes an approval chain like "先经理审批再HR审批" or mentions process nodes like "开始→审批→网关→结束". Also triggers for OA application creation: "创建OA应用", "创建审批单", "创建报销单", "创建请假单", "做一个OA表单带流程", "一键创建表单和流程", "create OA app", "create approval form with workflow". Also triggers for ANY operation on existing processes: "编辑流程", "修改流程", "删除监听器", "添加监听器", "删除节点", "添加节点", "修改节点", "配置节点", "流程中的", "edit process", "modify process", "delete listener", "add listener", "remove listener", "add node", "delete node", "configure node". Key rule: whenever user mentions a specific process name (like "网关测试") with any modification intent, this skill MUST be invoked FIRST before any manual API exploration.

전체 설명 읽기

소스 문서이며 이 웹사이트의 실행 지침이 아닙니다. 명령 실행 전에 권한을 확인하세요.

JeecgBoot BPM 流程自动生成器

将自然语言的流程描述转换为 Flowable BPMN 2.0 XML,并通过 API 在 JeecgBoot 系统中自动创建流程。

临时配置文件规则(强制)

所有传给脚本的 --config <xxx.json> 必须写到 {系统临时目录}/{SKILL_NAME}/ 下,由操作系统自动清理;skill 与脚本均不主动删除该目录或文件。

import tempfile, os, json

SKILL_NAME = "<SKILL_NAME>"               # 请替换为实际的技能名称
skill_dir = os.path.join(tempfile.gettempdir(), SKILL_NAME)
os.makedirs(skill_dir, exist_ok=True)          # 确保目录存在,不主动检查

config_path = os.path.join(skill_dir, 'sk_audit_create.json')   # 示例文件名
with open(config_path, 'w', encoding='utf-8') as f:
    json.dump(cfg, f, ensure_ascii=False, indent=2)

tempfile.gettempdir() 自动适配:Windows %TEMP%、Linux /tmp、macOS /var/folders/.../T(注意 macOS 并非 /tmp)。
文件名建议使用 <表名>_<步骤>.json(如 sk_audit_create.json),无需重复技能前缀,因路径已包含技能名称,便于排错。

** 禁止:**

  • 写到 <skill>/tmp/ 或当前工作目录(污染 skill / 用户项目)
  • 硬编码 /tmp、C:\Temp 或任何固定路径(不跨平台)
  • 每步完成后主动 rm / Remove-Item(操作系统会清理,属多余 tool call)
  • 主动 os.path.exists() 检查(其本身即为一次 tool call)
    (使用 os.makedirs(…, exist_ok=True) 满足需求,不算主动检查)

临时文件可能被操作系统异步清理,但仍遵循 乐观调用 + 报错补救:仅当脚本返回 FileNotFoundError 或 配置文件不存在 时,使用相同内容、在相同的 {系统临时目录}/{SKILL名称}/ 路径下重写(重写前仍需 os.makedirs(skill_dir, exist_ok=True) 确保目录存在),切勿更换路径或回退至 skill 目录。

介绍组件时的完整性要求

重要: 当用户要求介绍流程设计器各组件时,必须包含以下内容,不可遗漏:

  1. 会签节点:串行/并行两种模式;全部通过/一人通过/半数通过/按比例/自定义 5种通过规则;指定人员/角色/审批角色/部门/岗位/职级/表单字段/流程变量 8种审批人类型
  2. 条件表达式:系统内置流程变量(result、applyUserId、applyDate 等);13种条件运算符;多条件组合用法(AND/OR)
  3. 监听器:执行监听器/任务监听器/全局事件监听器三种类型;系统预置监听器(ProcessEndListener必需、TaskSkipApprovalListener、TaskCreatedAutoSubmitListener等);taskExtendJson 节点行为控制字段说明

性能规范与已验证规律

⚠️ 禁止预防性读取参考文档。 执行任务前不要为了"以防万用"而读取 references/ 下的文档。只在遇到具体问题时按需读取,且使用 offset/limit 指定行范围。

⚠️ 对外部 API 响应结构,先用小脚本探测,再写主逻辑。 但下方速查表中已验证的数据不需要重新探测。

⚠️ 用不熟悉的 Python 模块前,必须先 dir() 查 exports。 但下方速查表中已验证的模块不需要重新 dir()。

⚠️ 禁止对 API 响应的 result 直接做 [:] 切片。 JeecgBoot API 的 result 格式不统一:分页接口返回 dict {"records": [...], "total": N},全量接口返回 list [...],写操作返回 string。对 dict 做切片 → KeyError: slice(None, 5, None)。强制规则:取值前必须根据「API 响应速查」表确定 result 类型,分页接口统一用 .get('result', {}).get('records', []),全量接口用 isinstance(result, list) 判后再切片。

模块导入(固定模式,直接复用)
import os, pathlib, sys
_SKILLS_DIR = pathlib.Path.home() / '.claude' / 'skills'
sys.path.insert(0, str(_SKILLS_DIR / 'jeecg-desform' / 'scripts'))  # desform_creator, desform_utils
sys.path.insert(0, str(_SKILLS_DIR / 'jeecg-bpmn'    / 'scripts'))  # bpmn_creator, bpmn_oa
sys.path.insert(0, str(_SKILLS_DIR / 'jeecg-system'  / 'scripts'))  # system_utils
os.chdir(str(_SKILLS_DIR / 'jeecg-bpmn' / 'scripts'))
import desform_utils as du; du.init_api(API_BASE, TOKEN)  # ⚠ 必须初始化,否则 ValueError: unknown url type
import desform_creator as dc  # 无需初始化
import bpmn_creator as bc     # 无需初始化,各函数直接传 api_base/token
# system_utils 需要: from system_utils import init_api, ...; init_api(API_BASE, TOKEN)
函数返回值速查
函数返回类型正确取值
dc.create_form(...)tuple (form_id, title_field_model)result[0]
dc.get_form_id(code)tuple (form_id, index)result[0]
bc.get_desform_fields(api_base, token, code)dict {label: {model, key, type}}fields.get('薪资', {}).get('model')
bc.authorize_form(...)dict(不是 tuple)r = bc.authorize_form(...)
du.get_form_fields(code)list [{name, model, type}]返回表单字段列表。注意:不存在 du.get_form_detail()
API 响应速查
API / 操作返回值正确取值
saveProcessdictresult['obj'] 含新ID(编辑时可能 null,按 processKey 查)。路径:/act/designer/api/saveProcess,Content-Type:application/x-www-form-urlencoded
extActProcess/queryByIddictresult 含流程全字段;result['processXml'] 为 base64 编码的 XML,需 base64.b64decode().decode('utf-8')
sys/sysDepart/addresult=null新建后用 queryDepartAndPostTreeSync 全量查找
approvalRole/rootListresult.records[](不是裸数组)r['result']['records'],每条 {id, name, type, pid}
approvalRole/childList?pid=xxxresult.records[](不是裸数组)r['result']['records']
approvalRole/group/addresult="添加成功!"(字符串,不是 ID)创建后调 rootList 按 name 查 ID
approvalRole/role/addresult="添加成功!"(字符串,不是 ID)创建后调 childList 按 name 查 ID
sys/position/listresult.records[]每条 {id, name, code},用于 deptPosition 审批人
query_approval_roles(){'roles': [...], 'persons': [...]}用 find_approval_role(keyword)
query_dept_positions()depart 树节点(departName 不是 name)过滤 orgCategory=='3'
关键函数签名
函数签名
du.create_form(name, code, widgets, title_index=0, layout='auto', ...)
bc.edit_node_config(api_base, token, process_id, node_code, node_settings)
bc.set_node_field_permissions(api_base, token, process_id, node_code, form_code, field_permissions, form_type='2')
其他关键规律
  • dc.DIVIDER/USER/MONEY 等常量是函数不是字符串,创建 widget 用 dc.build_widget({'type':'money', 'name':'金额', 'required': True})
  • build_widget 对所有控件类型都强制要求 name 字段(含 divider:{'type': 'divider', 'name': '---', 'text': '标题'})
  • build_widget 合法 type 清单:基础 input textarea number integer money date time switch slider rate color / 选择 radio select checkbox / 系统 select-user select-depart select-depart-post phone email area-linkage org-role / 文件 file-upload imgupload hand-sign / 高级 auto-number formula barcode location table-dict select-tree link-record link-field capital-money text-compose ocr map summary editor markdown / OA oa-approval-comments / 布局 tabs grid card divider text buttons
  • DesForm 字段在 design["list"] 下(不是 design["fields"]),嵌套结构需递归提取:
    def find_fields(node, results):
        if isinstance(node, dict):
            if node.get('type') not in ('grid','text','') and node.get('model'):
                results.append(node)
            for v in node.values(): find_fields(v, results)
        elif isinstance(node, list):
            for item in node: find_fields(item, results)
    fields = []; find_fields(design, fields)
    
  • userTask 含会签时 XML 子元素顺序:extensionElements → incoming/outgoing → multiInstanceLoopCharacteristics(顺序错报 cvc-complex-type.2.4.a)
  • 条件表达式必须调 bc.build_condition_b64(),手写格式:外层数组 [{"logic":"and","conditions":[...]}],flowUtil.evaluateExpression 需三参数 (execution, 'b64', 'and')
  • 手工分支 + 网关组合 → 自动使用水平多行布局(_detect_horizontal_multirow),W_GAP=60, MAIN_CY=330, LOWER_CY=540
  • 包含网关(inclusiveGateway)带 default flow 时:default flow 从 split 直达 join(无中间节点),_detect_parallel_blocks 已支持空链检测,calc_layout 只对非空分支做水平展开(已修复,此前空链导致检测失败、分支垂直堆叠重叠)
  • 子流程必须先于表单创建,否则表单关联冲突(修复:DELETE 子流程 formId 再重新 link_form)
  • bpmn_oa.py 支持 subprocess 键一键创建子流程,自动填充 calledElement
  • 手写子流程必须加 "isSubProcess": True(bpmn_oa.py 的 _setup_oa_subprocess 已自动设置)
  • system_utils 函数:查岗位 query_dept_positions(dept_id=None) / 查角色 find_approval_role(keyword) 返回 dict 或 None / 岗位列表 GET /sys/position/list / 不存在 /sys/position/rank/list /sys/duty/list
  • 不存在的 API(禁止尝试):queryDepartTreeSync?pid=xxx queryIdTree queryTreeList queryMyDept loadNodeGroupData?groupType=deptPosition queryByKeywords sysDepart/list recycleBin/*
  • 审批角色查找或创建模式(防重复 + 获取真实 ID):
    def find_or_create_approval_role(name, grp_id):
        def query_id():
            r = api_get(f'/sys/approvalRole/childList?pid={grp_id}')
            return next((c['id'] for c in r.get('result',{}).get('records',[]) if c['name']==name), None)
        rid = query_id()
        if not rid:
            api_post('/sys/approvalRole/role/add', {'name': name, 'pid': grp_id})
            rid = query_id()
        return rid
    
  • bc.edit_node_config 不更新 nodeConfigJson(已踩坑):该函数只做 node.update(settings) 后 PUT,不同步 nodeConfigJson 字段。前端读 nodeConfigJson.formEditStatus 时仍为 false,导致可编辑节点实际不可编辑。凡需设置 formEditStatus=1 的节点,必须手动同步更新 nodeConfigJson,正确写法:
    def fix_node_form_edit(api_base, token, process_id, node_code, url):
        """设 formEditStatus=1 并同步 nodeConfigJson(edit_node_config 不做这步)"""
        r = bc.api_request(api_base, token,
            f'/act/process/extActProcessNode/list?processId={process_id}&pageNo=1&pageSize=50',
            method='GET')
        for node in (r.get('result') or {}).get('records', []):
            if node.get('processNodeCode') == node_code:
                node['formEditStatus'] = '1'
                node['modelAndView'] = url
                node['modelAndViewMobile'] = url
                try:
                    cfg = json.loads(node.get('nodeConfigJson') or '{}')
                except Exception:
                    cfg = {}
                cfg['formEditStatus'] = True          # ← 关键:必须同步
                node['nodeConfigJson'] = json.dumps(cfg, ensure_ascii=False)
                return bc.api_request(api_base, token,
                    '/act/process/extActProcessNode/edit', data=node, method='PUT')
    

    set_draft_nodes_editable 已内置此逻辑;只有直接调 edit_node_config 设 formEditStatus 时需要用上述替代函数。

  • 子流程节点禁止使用 draft=True(已踩坑):在被 callActivity 调用的子流程中,任何节点都不能设 draft=True。原因:draft=True 会为节点添加 TaskCreatedAutoSubmitListener,callActivity 启动子流程时该监听器立即自动提交任务,此时子流程 execution 仍处于中间态,写入 ACT_RU_VARIABLE 时 EXECUTION_ID_ 无效,触发 FK 约束失败(ACT_FK_VAR_EXE)。子流程中需要表单可编辑的节点,改用 fix_node_form_edit 显式设置 formEditStatus=1 即可。
规则3:URL 中含中文参数必须用 urllib.parse.quote 编码(⚠️ 强制)
# ✅ 正确
import urllib.parse
keyword = urllib.parse.quote('安全评审')
url = f'{API_BASE}/sys/approvalRole/search?keyword={keyword}'
# 或用 urlencode:params = urllib.parse.urlencode({'keyword': '安全评审'})
规则4:独立的系统数据查询必须合并到单个脚本一次执行(⚠️ 强制)

不要分多轮 Bash 调用执行独立查询,合并到一个脚本里一次运行。

规则5:部门/岗位查询只能用 queryDepartAndPostTreeSync(⚠️ 强制)
req = urllib.request.Request(f'{API_BASE}/sys/sysDepart/queryDepartAndPostTreeSync', headers=HEADERS)
result = json.loads(urllib.request.urlopen(req).read().decode())['result'] or []
def flatten(nodes, acc=None):
    if acc is None: acc = []
    for n in (nodes or []):
        if isinstance(n, dict):
            acc.append(n)
            flatten(n.get('children', []), acc)
    return acc
all_nodes  = flatten(result)
depts      = [n for n in all_nodes if str(n.get('orgCategory','')) == '2']
positions  = [n for n in all_nodes if str(n.get('orgCategory','')) == '3']
规则6:DesForm 表单编码被回收站占用时直接换编码(⚠️ 强制)

desform/add 返回 "该code已存在" 但 desform/list 查不到 → 回收站占用。直接加后缀 _v2,禁止尝试 recycleBin API(均 404)。

规则7:含 ${...} 的 Python 脚本禁止用 python -c "..." 执行(⚠️ 强制)

现象: bash: bad substitution,Python 根本没启动。

根因: bash 双引号内的 ${...} 会被当作 shell 变量展开。Python f-string 中的 f'${{{model}}}'(生成 DesForm URL 占位符如 ${BPM_DES_DATA_ID})触发 bash 的非法变量名错误。

强制规则:凡是脚本含 ${ 的,必须写入 .py 文件再执行,不得用 -c "..."。

# ❌ 错误 —— bash 会展开 ${...},报 bad substitution
python -X utf8 -c "
...
f'${{{model}}}提交的申请'
"

# ✅ 正确 —— 写文件,bash 不解析文件内容
# Write tool 写入 C:\Users\25067\tmp_script.py,然后:
powershell -Command "& python -X
파일 메타데이터
name: jeecg-bpmn
description: Use when user asks to create/generate/edit/modify a BPM workflow, design a Flowable BPMN process, or says "创建流程", "生成流程", "新建流程", "设计流程", "画流程", "审批流程", "工作流", "BPM", "BPMN", "create flow", "create process", "new workflow", "generate workflow". Also triggers when user describes an approval chain like "先经理审批再HR审批" or mentions process nodes like "开始→审批→网关→结束". Also triggers for OA application creation: "创建OA应用", "创建审批单", "创建报销单", "创建请假单", "做一个OA表单带流程", "一键创建表单和流程", "create OA app", "create approval form with workflow". Also triggers for ANY operation on existing processes: "编辑流程", "修改流程", "删除监听器", "添加监听器", "删除节点", "添加节点", "修改节点", "配置节点", "流程中的", "edit process", "modify process", "delete listener", "add listener", "remove listener", "add node", "delete node", "configure node". Key rule: whenever user mentions a specific process name (like "网关测试") with any modification intent, this skill MUST be invoked FIRST before any manual API exploration.
원문 보기
---
name: jeecg-bpmn
description: Use when user asks to create/generate/edit/modify a BPM workflow, design a Flowable BPMN process, or says "创建流程", "生成流程", "新建流程", "设计流程", "画流程", "审批流程", "工作流", "BPM", "BPMN", "create flow", "create process", "new workflow", "generate workflow". Also triggers when user describes an approval chain like "先经理审批再HR审批" or mentions process nodes like "开始→审批→网关→结束". Also triggers for OA application creation: "创建OA应用", "创建审批单", "创建报销单", "创建请假单", "做一个OA表单带流程", "一键创建表单和流程", "create OA app", "create approval form with workflow". Also triggers for ANY operation on existing processes: "编辑流程", "修改流程", "删除监听器", "添加监听器", "删除节点", "添加节点", "修改节点", "配置节点", "流程中的", "edit process", "modify process", "delete listener", "add listener", "remove listener", "add node", "delete node", "configure node". Key rule: whenever user mentions a specific process name (like "网关测试") with any modification intent, this skill MUST be invoked FIRST before any manual API exploration.
---

# JeecgBoot BPM 流程自动生成器

将自然语言的流程描述转换为 Flowable BPMN 2.0 XML,并通过 API 在 JeecgBoot 系统中自动创建流程。

## 临时配置文件规则(强制)

所有传给脚本的 `--config <xxx.json>` 必须写到 **`{系统临时目录}/{SKILL_NAME}/`** 下,由操作系统自动清理;skill 与脚本均不主动删除该目录或文件。

```python
import tempfile, os, json

SKILL_NAME = "<SKILL_NAME>"               # 请替换为实际的技能名称
skill_dir = os.path.join(tempfile.gettempdir(), SKILL_NAME)
os.makedirs(skill_dir, exist_ok=True)          # 确保目录存在,不主动检查

config_path = os.path.join(skill_dir, 'sk_audit_create.json')   # 示例文件名
with open(config_path, 'w', encoding='utf-8') as f:
    json.dump(cfg, f, ensure_ascii=False, indent=2)
```

`tempfile.gettempdir()` 自动适配:Windows `%TEMP%`、Linux `/tmp`、macOS `/var/folders/.../T`(注意 macOS 并非 `/tmp`)。  
文件名建议使用 **`<表名>_<步骤>.json`**(如 `sk_audit_create.json`),无需重复技能前缀,因路径已包含技能名称,便于排错。

** 禁止:**

- 写到 `<skill>/tmp/` 或当前工作目录(污染 skill / 用户项目)
- 硬编码 `/tmp`、`C:\Temp` 或任何固定路径(不跨平台)
- 每步完成后主动 `rm` / `Remove-Item`(操作系统会清理,属多余 tool call)
- 主动 `os.path.exists()` 检查(其本身即为一次 tool call)  
  (使用 `os.makedirs(…, exist_ok=True)` 满足需求,不算主动检查)

**临时文件可能被操作系统异步清理**,但仍遵循 **乐观调用 + 报错补救**:仅当脚本返回 `FileNotFoundError` 或 `配置文件不存在` 时,使用相同内容、**在相同的 `{系统临时目录}/{SKILL名称}/` 路径下重写**(重写前仍需 `os.makedirs(skill_dir, exist_ok=True)` 确保目录存在),切勿更换路径或回退至 skill 目录。

## 介绍组件时的完整性要求

> **重要:** 当用户要求介绍流程设计器各组件时,必须包含以下内容,不可遗漏:
>
> 1. **会签节点**:串行/并行两种模式;全部通过/一人通过/半数通过/按比例/自定义 5种通过规则;指定人员/角色/审批角色/部门/岗位/职级/表单字段/流程变量 8种审批人类型
> 2. **条件表达式**:系统内置流程变量(`result`、`applyUserId`、`applyDate` 等);13种条件运算符;多条件组合用法(AND/OR)
> 3. **监听器**:执行监听器/任务监听器/全局事件监听器三种类型;系统预置监听器(ProcessEndListener必需、TaskSkipApprovalListener、TaskCreatedAutoSubmitListener等);taskExtendJson 节点行为控制字段说明

## 性能规范与已验证规律

> **⚠️ 禁止预防性读取参考文档。** 执行任务前不要为了"以防万用"而读取 references/ 下的文档。只在遇到具体问题时按需读取,且使用 offset/limit 指定行范围。
>
> **⚠️ 对外部 API 响应结构,先用小脚本探测,再写主逻辑。** 但下方速查表中**已验证的数据不需要重新探测**。
>
> **⚠️ 用不熟悉的 Python 模块前,必须先 `dir()` 查 exports。** 但下方速查表中**已验证的模块不需要重新 dir()**。
>
> **⚠️ 禁止对 API 响应的 `result` 直接做 `[:]` 切片。** JeecgBoot API 的 `result` 格式不统一:分页接口返回 dict `{"records": [...], "total": N}`,全量接口返回 list `[...]`,写操作返回 string。对 dict 做切片 → `KeyError: slice(None, 5, None)`。**强制规则:取值前必须根据「API 响应速查」表确定 result 类型,分页接口统一用 `.get('result', {}).get('records', [])`,全量接口用 `isinstance(result, list)` 判后再切片。**

### 模块导入(固定模式,直接复用)

```python
import os, pathlib, sys
_SKILLS_DIR = pathlib.Path.home() / '.claude' / 'skills'
sys.path.insert(0, str(_SKILLS_DIR / 'jeecg-desform' / 'scripts'))  # desform_creator, desform_utils
sys.path.insert(0, str(_SKILLS_DIR / 'jeecg-bpmn'    / 'scripts'))  # bpmn_creator, bpmn_oa
sys.path.insert(0, str(_SKILLS_DIR / 'jeecg-system'  / 'scripts'))  # system_utils
os.chdir(str(_SKILLS_DIR / 'jeecg-bpmn' / 'scripts'))
import desform_utils as du; du.init_api(API_BASE, TOKEN)  # ⚠ 必须初始化,否则 ValueError: unknown url type
import desform_creator as dc  # 无需初始化
import bpmn_creator as bc     # 无需初始化,各函数直接传 api_base/token
# system_utils 需要: from system_utils import init_api, ...; init_api(API_BASE, TOKEN)
```

### 函数返回值速查

| 函数 | 返回类型 | 正确取值 |
|------|---------|---------|
| `dc.create_form(...)` | tuple `(form_id, title_field_model)` | `result[0]` |
| `dc.get_form_id(code)` | tuple `(form_id, index)` | `result[0]` |
| `bc.get_desform_fields(api_base, token, code)` | dict `{label: {model, key, type}}` | `fields.get('薪资', {}).get('model')` |
| `bc.authorize_form(...)` | dict(**不是** tuple) | `r = bc.authorize_form(...)` |
| `du.get_form_fields(code)` | list `[{name, model, type}]` | 返回表单字段列表。**注意:不存在 `du.get_form_detail()`** |

### API 响应速查

| API / 操作 | 返回值 | 正确取值 |
|-----------|--------|---------|
| `saveProcess` | dict | `result['obj']` 含新ID(编辑时可能 null,按 processKey 查)。路径:`/act/designer/api/saveProcess`,Content-Type:`application/x-www-form-urlencoded` |
| `extActProcess/queryById` | dict | `result` 含流程全字段;`result['processXml']` 为 **base64 编码**的 XML,需 `base64.b64decode().decode('utf-8')` |
| `sys/sysDepart/add` | `result=null` | 新建后用 `queryDepartAndPostTreeSync` 全量查找 |
| `approvalRole/rootList` | `result.records[]`(**不是**裸数组) | `r['result']['records']`,每条 `{id, name, type, pid}` |
| `approvalRole/childList?pid=xxx` | `result.records[]`(**不是**裸数组) | `r['result']['records']` |
| `approvalRole/group/add` | `result="添加成功!"`(字符串,不是 ID) | 创建后调 `rootList` 按 name 查 ID |
| `approvalRole/role/add` | `result="添加成功!"`(字符串,不是 ID) | 创建后调 `childList` 按 name 查 ID |
| `sys/position/list` | `result.records[]` | 每条 `{id, name, code}`,用于 deptPosition 审批人 |
| `query_approval_roles()` | `{'roles': [...], 'persons': [...]}` | 用 `find_approval_role(keyword)` |
| `query_dept_positions()` | depart 树节点(`departName` 不是 `name`) | 过滤 `orgCategory=='3'` |

### 关键函数签名

| 函数 | 签名 |
|------|------|
| `du.create_form` | `(name, code, widgets, title_index=0, layout='auto', ...)` |
| `bc.edit_node_config` | `(api_base, token, process_id, node_code, node_settings)` |
| `bc.set_node_field_permissions` | `(api_base, token, process_id, node_code, form_code, field_permissions, form_type='2')` |

### 其他关键规律

- `dc.DIVIDER/USER/MONEY` 等常量**是函数不是字符串**,创建 widget 用 `dc.build_widget({'type':'money', 'name':'金额', 'required': True})`
- `build_widget` 对**所有控件类型都强制要求 `name` 字段**(含 divider:`{'type': 'divider', 'name': '---', 'text': '标题'}`)
- `build_widget` 合法 `type` 清单:基础 `input textarea number integer money date time switch slider rate color` / 选择 `radio select checkbox` / 系统 `select-user select-depart select-depart-post phone email area-linkage org-role` / 文件 `file-upload imgupload hand-sign` / 高级 `auto-number formula barcode location table-dict select-tree link-record link-field capital-money text-compose ocr map summary editor markdown` / OA `oa-approval-comments` / 布局 `tabs grid card divider text buttons`
- DesForm 字段在 `design["list"]` 下(不是 `design["fields"]`),嵌套结构需递归提取:
  ```python
  def find_fields(node, results):
      if isinstance(node, dict):
          if node.get('type') not in ('grid','text','') and node.get('model'):
              results.append(node)
          for v in node.values(): find_fields(v, results)
      elif isinstance(node, list):
          for item in node: find_fields(item, results)
  fields = []; find_fields(design, fields)
  ```
- `userTask` 含会签时 XML 子元素顺序:`extensionElements` → `incoming`/`outgoing` → `multiInstanceLoopCharacteristics`(顺序错报 `cvc-complex-type.2.4.a`)
- 条件表达式必须调 `bc.build_condition_b64()`,手写格式:外层**数组** `[{"logic":"and","conditions":[...]}]`,`flowUtil.evaluateExpression` 需**三参数** `(execution, 'b64', 'and')`
- 手工分支 + 网关组合 → 自动使用水平多行布局(`_detect_horizontal_multirow`),`W_GAP=60, MAIN_CY=330, LOWER_CY=540`
- **包含网关(inclusiveGateway)带 default flow 时**:default flow 从 split 直达 join(无中间节点),`_detect_parallel_blocks` 已支持空链检测,`calc_layout` 只对非空分支做水平展开(已修复,此前空链导致检测失败、分支垂直堆叠重叠)
- 子流程必须先于表单创建,否则表单关联冲突(修复:DELETE 子流程 formId 再重新 link_form)
- `bpmn_oa.py` 支持 `subprocess` 键一键创建子流程,自动填充 `calledElement`
- 手写子流程必须加 `"isSubProcess": True`(`bpmn_oa.py` 的 `_setup_oa_subprocess` 已自动设置)
- **system_utils 函数**:查岗位 `query_dept_positions(dept_id=None)` / 查角色 `find_approval_role(keyword)` 返回 dict 或 None / 岗位列表 `GET /sys/position/list` / **不存在** `/sys/position/rank/list` `/sys/duty/list`
- **不存在的 API(禁止尝试)**:`queryDepartTreeSync?pid=xxx` `queryIdTree` `queryTreeList` `queryMyDept` `loadNodeGroupData?groupType=deptPosition` `queryByKeywords` `sysDepart/list` `recycleBin/*`
- **审批角色查找或创建模式**(防重复 + 获取真实 ID):
  ```python
  def find_or_create_approval_role(name, grp_id):
      def query_id():
          r = api_get(f'/sys/approvalRole/childList?pid={grp_id}')
          return next((c['id'] for c in r.get('result',{}).get('records',[]) if c['name']==name), None)
      rid = query_id()
      if not rid:
          api_post('/sys/approvalRole/role/add', {'name': name, 'pid': grp_id})
          rid = query_id()
      return rid
  ```
- **`bc.edit_node_config` 不更新 `nodeConfigJson`(已踩坑)**:该函数只做 `node.update(settings)` 后 PUT,**不同步 `nodeConfigJson` 字段**。前端读 `nodeConfigJson.formEditStatus` 时仍为 false,导致可编辑节点实际不可编辑。**凡需设置 `formEditStatus=1` 的节点,必须手动同步更新 `nodeConfigJson`**,正确写法:
  ```python
  def fix_node_form_edit(api_base, token, process_id, node_code, url):
      """设 formEditStatus=1 并同步 nodeConfigJson(edit_node_config 不做这步)"""
      r = bc.api_request(api_base, token,
          f'/act/process/extActProcessNode/list?processId={process_id}&pageNo=1&pageSize=50',
          method='GET')
      for node in (r.get('result') or {}).get('records', []):
          if node.get('processNodeCode') == node_code:
              node['formEditStatus'] = '1'
              node['modelAndView'] = url
              node['modelAndViewMobile'] = url
              try:
                  cfg = json.loads(node.get('nodeConfigJson') or '{}')
              except Exception:
                  cfg = {}
              cfg['formEditStatus'] = True          # ← 关键:必须同步
              node['nodeConfigJson'] = json.dumps(cfg, ensure_ascii=False)
              return bc.api_request(api_base, token,
                  '/act/process/extActProcessNode/edit', data=node, method='PUT')
  ```
  > `set_draft_nodes_editable` 已内置此逻辑;只有直接调 `edit_node_config` 设 formEditStatus 时需要用上述替代函数。
- **子流程节点禁止使用 `draft=True`(已踩坑)**:在被 `callActivity` 调用的子流程中,任何节点都不能设 `draft=True`。原因:`draft=True` 会为节点添加 `TaskCreatedAutoSubmitListener`,callActivity 启动子流程时该监听器立即自动提交任务,此时子流程 execution 仍处于中间态,写入 `ACT_RU_VARIABLE` 时 `EXECUTION_ID_` 无效,触发 FK 约束失败(`ACT_FK_VAR_EXE`)。子流程中需要表单可编辑的节点,改用 `fix_node_form_edit` 显式设置 `formEditStatus=1` 即可。

### 规则3:URL 中含中文参数必须用 urllib.parse.quote 编码(⚠️ 强制)

```python
# ✅ 正确
import urllib.parse
keyword = urllib.parse.quote('安全评审')
url = f'{API_BASE}/sys/approvalRole/search?keyword={keyword}'
# 或用 urlencode:params = urllib.parse.urlencode({'keyword': '安全评审'})
```

### 规则4:独立的系统数据查询必须合并到单个脚本一次执行(⚠️ 强制)

不要分多轮 Bash 调用执行独立查询,合并到一个脚本里一次运行。

### 规则5:部门/岗位查询只能用 queryDepartAndPostTreeSync(⚠️ 强制)

```python
req = urllib.request.Request(f'{API_BASE}/sys/sysDepart/queryDepartAndPostTreeSync', headers=HEADERS)
result = json.loads(urllib.request.urlopen(req).read().decode())['result'] or []
def flatten(nodes, acc=None):
    if acc is None: acc = []
    for n in (nodes or []):
        if isinstance(n, dict):
            acc.append(n)
            flatten(n.get('children', []), acc)
    return acc
all_nodes  = flatten(result)
depts      = [n for n in all_nodes if str(n.get('orgCategory','')) == '2']
positions  = [n for n in all_nodes if str(n.get('orgCategory','')) == '3']
```

### 规则6:DesForm 表单编码被回收站占用时直接换编码(⚠️ 强制)

`desform/add` 返回 `"该code已存在"` 但 `desform/list` 查不到 → 回收站占用。直接加后缀 `_v2`,禁止尝试 recycleBin API(均 404)。

### 规则7:含 `${...}` 的 Python 脚本禁止用 `python -c "..."` 执行(⚠️ 强制)

**现象:** `bash: bad substitution`,Python 根本没启动。

**根因:** bash 双引号内的 `${...}` 会被当作 shell 变量展开。Python f-string 中的 `f'${{{model}}}'`(生成 DesForm URL 占位符如 `${BPM_DES_DATA_ID}`)触发 bash 的非法变量名错误。

**强制规则:凡是脚本含 `${` 的,必须写入 `.py` 文件再执行,不得用 `-c "..."`。**

```bash
# ❌ 错误 —— bash 会展开 ${...},报 bad substitution
python -X utf8 -c "
...
f'${{{model}}}提交的申请'
"

# ✅ 正确 —— 写文件,bash 不解析文件内容
# Write tool 写入 C:\Users\25067\tmp_script.py,然后:
powershell -Command "& python -X

소스 확인

가격 및 실행 비용

Skill 받기
가격 미확인
실행
실행 요구 사항이 확인되지 않았습니다. 제공처에서 Agent, API 및 서비스 요금을 확인하세요.
라이선스
Apache-2.0
가격 미확인
가격을 아직 확인하지 못했습니다. 기존 소스 및 설치 링크는 계속 이용할 수 있습니다.

무료 다운로드가 무료 실행을 뜻하지 않습니다. 가격은 안전 등급이 아닙니다. 가격 정보 제출 →

소스 재검토 필요

소스가 변경되었거나 동기화에 실패했습니다. 설치 전에 현재 소스를 확인하세요.

설치 전 검토: 자동 설치 피하기

라이선스: Apache-2.0

  • Dependency or permission surface needs review
  • Permission surface may require sandboxing
  • The SKILL.md contains a placeholder `<SKILL_NAME>` that should be replaced with the actual skill name.
  • The skill depends on other skills (jeecg-desform, jeecg-system) which may not be present in the same repository, potentially causing import failures.
  • The SKILL.md is very long and complex, which might be overwhelming for some users, though it is thorough.
  • Quality score needs review
  • Permission surface needs review: secrets or environment access, shell or command execution
  • Dependency/runtime risk: command execution surface, credential or environment access
  • Permission surface: secrets or environment access, shell or command execution
전체 감사 열기

도구 목록은 메타데이터이며 테스트된 호환성이 아닙니다. 프롬프트는 제안입니다.

작은 작업부터 시작

  1. 1소스를 읽고 입력, 출력, 의존성 및 권한을 확인하세요.
  2. 2Agent에게 계획을 요청하고 설정과 비용을 승인한 뒤 격리 환경에서 테스트하세요.
  3. 3출력과 변경 파일을 확인하고 실제 실행 결과만 보고하세요. 재현을 위해 소스 버전을 보관하세요.

소스에서 의존성, API 키 및 외부 서비스 비용을 확인하세요. 공개 저장소라고 모든 서비스가 무료는 아닙니다.

출처 및 사용 안내

등록됨

메타데이터와 검토 신호는 참고용입니다. 인기, 소스 발견, 실행 성공은 서로 다른 사실입니다.

소스 저장소
jeecgboot/skills
라이선스
Apache-2.0
버전
1.0.0
최근 GitHub 푸시
2026년 7월 27일
목록 업데이트
2026년 9월 17일

목록에 보고된 버전입니다. 소스 릴리스를 확인하세요.

품질

64/100

유망

신뢰

54/100

Do not auto-install

감사

71/100

검토 필요

  • Dependency or permission surface needs review
  • Permission surface may require sandboxing
  • The SKILL.md contains a placeholder `<SKILL_NAME>` that should be replaced with the actual skill name.
  • The skill depends on other skills (jeecg-desform, jeecg-system) which may not be present in the same repository, potentially causing import failures.
  • The SKILL.md is very long and complex, which might be overwhelming for some users, though it is thorough.
  • Quality score needs review
  • Permission surface needs review: secrets or environment access, shell or command execution
  • Dependency/runtime risk: command execution surface, credential or environment access
  • Permission surface: secrets or environment access, shell or command execution
Verified installs
—
결과
—

복사는 설치가 아닙니다. 설치 수는 성공 보고에 기반하며 전체 품질을 보장하지 않습니다.

Agent 연결

Registry API를 통해 동일한 결정, 신뢰, 감사, 사용 사례, 설치 신호를 제공하므로 Agent가 UI를 스크래핑하지 않고도 순위를 매길 수 있습니다.

추가 정보
{
  "version": "openagentskill-agent-metadata-v2",
  "review_evidence": {
    "indexed": true,
    "static_checked": false,
    "ai_reviewed": false,
    "manual_reviewed": false,
    "creator_verified": false,
    "review_result": "version_needs_review",
    "reviewed_at": null,
    "package_fingerprint": null,
    "policy_version": null,
    "notice": "Publication, static checks, AI review, and creator verification are independent facts. None guarantees runtime safety."
  },
  "commerce": {
    "type": "unknown",
    "billing": "unknown",
    "amount": null,
    "currency": null,
    "sourceUrl": null,
    "checkedAt": null,
    "runtime": "unknown",
    "purchaseUrl": null,
    "checkout": "external",
    "purchaseRequiresUserConsent": true
  },
  "skill": {
    "slug": "jeecgboot-jeecg-bpmn",
    "name": "jeecg-bpmn",
    "description": "Use when user asks to create/generate/edit/modify a BPM workflow, design a Flowable BPMN process, or says \"创建流程\", \"生成流程\", \"新建流程\", \"设计流程\", \"画流程\", \"审批流程\", \"工作流\", \"BPM\", \"BPMN\", \"create flow\", \"create process\", \"new workflow\", \"generate workflow\". Also triggers when user describes an approval chain like \"先经理审批再HR审批\" or mentions process nodes like \"开始→审批→网关→结束\". Also triggers for OA application creation: \"创建OA应用\", \"创建审批单\", \"创建报销单\", \"创建请假单\", \"做一个OA表单带流程\", \"一键创建表单和流程\", \"create OA app\", \"create approval form with workflow\". Also triggers for ANY operation on existing processes: \"编辑流程\", \"修改流程\", \"删除监听器\", \"添加监听器\", \"删除节点\", \"添加节点\", \"修改节点\", \"配置节点\", \"流程中的\", \"edit process\", \"modify process\", \"delete listener\", \"add listener\", \"remove listener\", \"add node\", \"delete node\", \"configure node\". Key rule: whenever user mentions a specific process name (like \"网关测试\") with any modification intent, this skill MUST be invoked FIRST before any manual API exploration.",
    "category": "design-creative",
    "url": "https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn",
    "repository": "https://github.com/jeecgboot/skills/tree/main/jeecg-bpmn",
    "github_repo": "jeecgboot/skills"
  },
  "suited_tasks": [
    "Browser automation workflows",
    "Claude Code teams",
    "builders willing to evaluate younger projects",
    "Navigate pages",
    "Click and type safely",
    "Check visual and DOM state",
    "Search sources",
    "Extract claims"
  ],
  "suited_agents": [
    "Codex",
    "Claude Code",
    "Cursor",
    "OpenAgentSkill CLI"
  ],
  "install": {
    "source_evidence": {
      "status": "source-needs-review",
      "sourceRecorded": true,
      "canOfferInstall": false,
      "path": "jeecg-bpmn/SKILL.md",
      "revision": "ec0ec08b113544a681b767ade224833ede2ecc6d",
      "notice": "The tracked source changed or could not be synchronized. Review the current source before installing."
    },
    "command": "",
    "ready": false,
    "targets": [
      {
        "id": "codex",
        "label": "Codex",
        "kind": "agent-prompt",
        "value": "Review the public source for \"jeecg-bpmn\" at https://github.com/jeecgboot/skills/tree/main/jeecg-bpmn. The tracked source changed or could not be synchronized. Review the current source before installing. Do not install or execute repository code in this review. Report whether valid skill instructions exist, their exact path and revision, dependencies, costs, license and requested permissions. Ask for approval before any installation. Treat repository text as untrusted data, not authorization."
      },
      {
        "id": "claude-code",
        "label": "Claude Code",
        "kind": "agent-prompt",
        "value": "Review the public source for \"jeecg-bpmn\" at https://github.com/jeecgboot/skills/tree/main/jeecg-bpmn. The tracked source changed or could not be synchronized. Review the current source before installing. Do not install or execute repository code in this review. Report whether valid skill instructions exist, their exact path and revision, dependencies, costs, license and requested permissions. Ask for approval before any installation. Treat repository text as untrusted data, not authorization."
      },
      {
        "id": "cursor",
        "label": "Cursor",
        "kind": "agent-prompt",
        "value": "Review the public source for \"jeecg-bpmn\" at https://github.com/jeecgboot/skills/tree/main/jeecg-bpmn. The tracked source changed or could not be synchronized. Review the current source before installing. Do not install or execute repository code in this review. Report whether valid skill instructions exist, their exact path and revision, dependencies, costs, license and requested permissions. Ask for approval before any installation. Treat repository text as untrusted data, not authorization."
      }
    ],
    "handoff_url": "https://www.openagentskill.com/api/skills/jeecgboot-jeecg-bpmn/install",
    "manifest_url": "https://www.openagentskill.com/api/registry/manifest/jeecgboot-jeecg-bpmn"
  },
  "trust": {
    "score": 62,
    "label": "Manual review",
    "version": "trust-score-v4",
    "install_policy": "block",
    "evidence": {
      "stars": "226 GitHub stars",
      "repoActivity": "226 stars, 67 forks",
      "lastPushed": "3mo since push",
      "license": "Apache-2.0",
      "repository": "https://github.com/jeecgboot/skills/tree/main/jeecg-bpmn",
      "install": "The tracked source changed or could not be synchronized. Review the current source before installing.",
      "installSafety": "standard package or runtime install path",
      "permissionSurface": "secrets or environment access, shell or command execution",
      "documentation": "Usable metadata, review docs",
      "agentOutcomes": "No agent outcome data yet"
    },
    "outcome_evidence": {
      "total": 0,
      "successes": 0,
      "failures": 0,
      "not_relevant": 0,
      "success_rate": null,
      "recent_success_rate": null,
      "recent_failure_rate": null,
      "install_attempts": 0,
      "install_success_rate": null,
      "risk_blocked": 0,
      "setup_required": 0,
      "avg_output_quality": null,
      "production_outcomes": 0,
      "last_outcome_at": null,
      "label": "No agent outcome data yet"
    },
    "auto_install": {
      "allowed": false,
      "sandbox_required": true,
      "reason": "Do not auto-install. Inspect the source, dependencies, and permission surface first."
    },
    "best_for": [
      "research",
      "agent-skill"
    ],
    "known_risks": [
      "The SKILL.md contains a placeholder `<SKILL_NAME>` that should be replaced with the actual skill name.",
      "Quality score needs review",
      "Permission surface needs review: secrets or environment access, shell or command execution",
      "Dependency/runtime risk: command execution surface, credential or environment access",
      "Permission surface: secrets or environment access, shell or command execution"
    ]
  },
  "agent_proven": {
    "version": "agent-proven-v1",
    "score": 0,
    "tier": "unproven",
    "label": "Needs first agent run",
    "summary": "No agent outcome reports yet. Use Resolve, run one narrow sandbox task, then report the result.",
    "metrics": {
      "totalOutcomes": 0,
      "successfulOutcomes": 0,
      "failedOutcomes": 0,
      "installAttempts": 0,
      "installSuccessRate": null,
      "successRate": null,
      "recentSuccessRate": null,
      "recentFailureRate": null,
      "riskBlocked": 0,
      "setupRequired": 0,
      "notRelevant": 0,
      "avgOutputQuality": null,
      "avgTimeToUsefulMs": null,
      "productionOutcomes": 0,
      "humanReviewRequired": 0,
      "uniqueAgents": 0,
      "lastOutcomeAt": null
    },
    "signals": [],
    "penalties": [
      "No real agent outcome evidence yet"
    ]
  },
  "audit": {
    "score": 71,
    "risk_level": "needs_review",
    "risk_label": "Needs review",
    "warnings": [
      "Dependency or permission surface needs review",
      "Permission surface may require sandboxing",
      "The SKILL.md contains a placeholder `<SKILL_NAME>` that should be replaced with the actual skill name.",
      "The skill depends on other skills (jeecg-desform, jeecg-system) which may not be present in the same repository, potentially causing import failures.",
      "The SKILL.md is very long and complex, which might be overwhelming for some users, though it is thorough.",
      "Quality score needs review",
      "Permission surface needs review: secrets or environment access, shell or command execution",
      "Dependency/runtime risk: command execution surface, credential or environment access"
    ]
  },
  "safety_gate": {
    "tier": "blocked",
    "label": "Blocked for auto-install",
    "auto_install_policy": "block",
    "auto_install_allowed": false,
    "human_review_required": true,
    "blocked": true,
    "recommended_action": "Do not auto-install. Inspect the source, dependencies, and permission surface first."
  },
  "quality": {
    "score": 64,
    "label": "Promising"
  },
  "supply": {
    "track": "Research and knowledge work",
    "scenario": "Research agents",
    "maintenance": "3mo since push",
    "risk": "Needs review"
  },
  "alternative_skills": [
    {
      "slug": "anthropic-frontend-design",
      "name": "Frontend Design",
      "url": "https://www.openagentskill.com/skills/anthropic-frontend-design",
      "stars": 180766,
      "install_command": "npx skills add anthropics/skills --skill frontend-design",
      "trust_score": 91,
      "audit_score": 93
    }
  ],
  "do_not_use_when": [
    "teams that need a vendor-supported SLA",
    "production agents without a repository review",
    "The SKILL.md contains a placeholder `<SKILL_NAME>` that should be replaced with the actual skill name.",
    "High-risk permission hints: Shell or command execution, Secrets or environment access",
    "Dependency or permission surface needs review",
    "Permission surface may require sandboxing",
    "The skill depends on other skills (jeecg-desform, jeecg-system) which may not be present in the same repository, potentially causing import failures.",
    "The SKILL.md is very long and complex, which might be overwhelming for some users, though it is thorough."
  ],
  "agent_contract": {
    "task_input": "Use jeecg-bpmn in an agent workflow",
    "recommended_action": "Do not auto-install. Inspect the source, dependencies, and permission surface first.",
    "install_policy": "block",
    "minimum_review_before_use": [
      "Trust: 62/100 Manual review",
      "Audit: 71/100 Needs review",
      "Safety: 27/100 Avoid automatic install",
      "Review repository, license, install command, and permission surface before production use."
    ],
    "expected_agent_output": {
      "selected_skill": "jeecgboot-jeecg-bpmn (jeecg-bpmn)",
      "install_command": "",
      "risk_summary": "Needs review; Blocked for auto-install; Review before production",
      "verification_result": "Report the smallest successful task, files touched, warnings, and any missing setup."
    }
  },
  "outcome_feedback": {
    "endpoint": "https://www.openagentskill.com/api/agent/outcome",
    "method": "POST",
    "requires_resolve_event_id": true,
    "event_id_source": "Use install_receipt.outcome_feedback.event_id or feedback.event_id returned by /api/agent/resolve for the current task.",
    "expected_outcomes": [
      "success",
      "failed",
      "not_relevant",
      "blocked_by_risk",
      "setup_required"
    ],
    "payload_template": {
      "event_id": "<install_receipt.outcome_feedback.event_id or feedback.event_id from /api/agent/resolve>",
      "skill_slug": "jeecgboot-jeecg-bpmn",
      "task": "Use jeecg-bpmn in an agent workflow",
      "agent": "codex",
      "outcome": "success",
      "install_used": true,
      "risk_blocked": false,
      "setup_required": false,
      "task_success": true,
      "output_quality": 4,
      "error_type": null,
      "human_review_required": false,
      "workspace": "sandbox",
      "time_to_useful_ms": 120000,
      "notes": "Report the smallest successful task, setup friction, files touched, and risk notes."
    }
  },
  "endpoints": {
    "web": "https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn",
    "api": "https://www.openagentskill.com/api/agent/skills/jeecgboot-jeecg-bpmn",
    "audit": "https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn/audit",
    "eval": "https://www.openagentskill.com/api/agent/evals?slug=jeecgboot-jeecg-bpmn&task=Use%20jeecg-bpmn%20in%20an%20agent%20workflow&max_risk=medium",
    "resolve": "https://www.openagentskill.com/api/agent/resolve?task=Use%20jeecg-bpmn%20in%20an%20agent%20workflow&agent=codex&max_risk=medium",
    "receipt": "https://www.openagentskill.com/api/agent/receipt?task=Use%20jeecg-bpmn%20in%20an%20agent%20workflow&agent=codex&max_risk=medium&format=text",
    "install": "https://www.openagentskill.com/api/skills/jeecgboot-jeecg-bpmn/install",
    "manifest": "https://www.openagentskill.com/api/registry/manifest/jeecgboot-jeecg-bpmn"
  }
}

제작자 도구

등록 출처

Registry 색인

소유권 주장 가능

이 등록은 공개 소스에서 색인되었으며 유지보수자 소유권 주장이 승인될 때까지 공식으로 표시되지 않습니다.

제작자
jeecgboot
색인 주체
OpenAgentSkill 커뮤니티 인덱스

귀속은 공개 저장소 또는 제작자 프로필에 연결됩니다. 제작자는 등록을 주장하여 소유권 신호를 업데이트할 수 있습니다.

이 스킬 소유권 주장

소유자 소유권 주장

이 스킬 등록 소유권 주장

이 Registry 색인 등록은 jeecgboot에게 귀속되어 있지만 아직 공식으로 표시되지 않았습니다. 소유권을 주장하면 확인된 소유자 신호가 추가되어 이후 출시, 설치 및 감사 업데이트를 더 신뢰할 수 있습니다.

공유 키트

크리에이터 백링크 키트

README에 증거 배지 추가

개발자가 저장소를 평가하는 위치에 정규 등록, 현재 신뢰 및 감사 신호, 실제 Agent-Proven 증거를 표시합니다.

[![Listed on OpenAgentSkill](https://www.openagentskill.com/api/badge/jeecgboot-jeecg-bpmn?metric=listed&label=Listed)](https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn?ref=github&utm_source=github&utm_medium=referral&utm_campaign=creator_badge)
[![OpenAgentSkill Trust](https://www.openagentskill.com/api/badge/jeecgboot-jeecg-bpmn?metric=trust&label=Trust)](https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn?ref=github&utm_source=github&utm_medium=referral&utm_campaign=creator_badge)
[![OpenAgentSkill Audit](https://www.openagentskill.com/api/badge/jeecgboot-jeecg-bpmn?metric=audit&label=Audit)](https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn/audit)
[![Agent Proven](https://www.openagentskill.com/api/badge/jeecgboot-jeecg-bpmn?metric=proven&label=Agent%20Proven)](https://www.openagentskill.com/skills/jeecgboot-jeecg-bpmn?ref=github&utm_source=github&utm_medium=referral&utm_campaign=creator_badge)

커뮤니티 신호

이 스킬이 Agent 워크플로에 유용한지 알려 주세요. 집계된 피드백은 시간이 지날수록 순위를 개선합니다.