with one click
gitcode-pr
GitCode 仓库 PR 提交流程。可作为独立 subagent 运行。覆盖:创建 Issue、分支、提交、创建 PR、合并。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
GitCode 仓库 PR 提交流程。可作为独立 subagent 运行。覆盖:创建 Issue、分支、提交、创建 PR、合并。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | gitcode-pr |
| description | GitCode 仓库 PR 提交流程。可作为独立 subagent 运行。覆盖:创建 Issue、分支、提交、创建 PR、合并。 |
作为独立 subagent 被 arkweb-architect 调用时,文件列表和提交信息已在 task 描述中提供,直接执行。
输入格式(从 task 描述中解析):
## 待提交文件
{文件路径列表}
## 提交信息
- Issue 标题:docs: {feature-name} — {description}
- Commit message: docs: {description}\n\n- {change_1}\n- {change_2}\n\nCo-Authored-By:Agent\nSigned-off-by: {git config user.name} <{git config user.email}>
- PR body: 方案概述 + 评审记录 + Closes #{issue_number}
- 分支名:docs/{feature-name}
## 仓库配置
- 仓库:{owner}/{docs_repo}
- 本地路径:{project_root}
- Token:从环境变量读取(优先 `GITCODE_TOKEN`,回退 `GITLAB_TOKEN`)
输出: Issue + PR 创建结果 → 回复 URL 和状态
在主 session 中直接调用,每步确认后执行。
所有代码提交到 GitCode 仓库必须遵循 Issue → 分支 → 提交 → PR 流程,禁止直接 push 到 master。
| 仓库 | GitCode 路径 | 本地路径 |
|---|---|---|
| AI 辅助设计 | {owner}/{docs_repo} | {project_root} |
| AI Dashboard | {owner}/{dashboard_repo} | {project_root} |
| 鸿蒙知识库 | openharmony-ai-design/oh-ai-full-design | 见 memory |
https://gitcode.com/api/v5PRIVATE-TOKEN headerurllib(见下方说明)| 变量 | 含义 | 取值方式 |
|---|---|---|
FORK_OWNER | fork 仓库的 owner(GitCode 用户名) | 从 git remote URL 中解析:git remote get-url origin → 提取 owner 部分(如 git@gitcode.com:{FORK_OWNER}/chromium_src.git) |
推荐使用 Python 3
urllib调用 GitCode repos API。 部分环境的 curl(如 7.81.0)在 HTTPS 模式下可能无法正确发送PRIVATE-TOKENheader 到 GitCode 的/repos路径(HTTP/2 网关兼容性问题)。如果 Python 3 不可用,可使用curl --http1.1强制 HTTP/1.1 作为降级方案。
所有 GitCode API 调用使用以下 Python 模板:
python3 -c "
import urllib.request, json, os
token = os.environ.get('GITCODE_TOKEN') or os.environ.get('GITLAB_TOKEN') or exit('Error: set GITCODE_TOKEN or GITLAB_TOKEN')
base = 'https://gitcode.com/api/v5/repos/{owner}/{repo}'
# --- 按需替换以下部分 ---
url = f'{base}/issues'
data = json.dumps({'title': 'TITLE', 'body': 'BODY'}).encode()
method = 'POST'
# --- 替换结束 ---
req = urllib.request.Request(url, data=data, method=method)
req.add_header('PRIVATE-TOKEN', token)
req.add_header('Content-Type', 'application/json')
try:
resp = urllib.request.urlopen(req, timeout=30)
result = json.loads(resp.read().decode())
print(json.dumps(result, ensure_ascii=False, indent=2))
except urllib.error.HTTPError as e:
print(f'HTTP {e.code}: {e.read().decode()[:500]}')
"
ArkWeb 项目涉及 3 个仓库的协同提交,必须遵循以下规则:
| 仓库 | 上游原仓 | fork 仓库 | 本地路径 | 默认 base |
|---|---|---|---|---|
| chromium_src | openharmony-tpc/chromium_src | {FORK_OWNER}/chromium_src | {SKILL_HOME}/src | 132_trunk |
| web_webview | openharmony/web_webview | {FORK_OWNER}/web_webview | {SKILL_HOME}/deps_code/webview | master |
| arkui_ace_engine | openharmony/arkui_ace_engine | {FORK_OWNER}/arkui_ace_engine | {SKILL_HOME}/deps_code/arkui_ace_engine | master |
同一层级的仓库共用一个 Issue,不同层级使用独立 Issue:
| 层级 | 仓库 | Issue 创建位置 |
|---|---|---|
| 引擎层 | chromium_src(独立) | openharmony-tpc/chromium_src |
| 框架层 | web_webview + arkui_ace_engine(共用) | openharmony/web_webview(在 web_webview 仓库创建,ace_engine PR 中引用同一 Issue 链接) |
所有 PR 必须从 fork 指向上游原仓,禁止 fork 内部自合并:
正确:
{FORK_OWNER}/chromium_src:feat/xxx → openharmony-tpc/chromium_src:132_trunk
{FORK_OWNER}/web_webview:feat/xxx → openharmony/web_webview:master
{FORK_OWNER}/arkui_ace_engine:feat/xxx → openharmony/arkui_ace_engine:master
错误:
{FORK_OWNER}/chromium_src:feat/xxx → {FORK_OWNER}/chromium_src:master
创建 PR body 之前,必须先读取目标仓库的 PR 模板文件。 不同仓库的模板路径和格式不同:
| 仓库 | 模板路径 |
|---|---|
| chromium_src | .gitcode/PULL_REQUEST_TEMPLATE.zh-CN.md |
| web_webview | .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md |
| arkui_ace_engine | .gitcode/PULL_REQUEST_TEMPLATE.md |
模板读取失败或未找到时,使用本 skill 中的默认模板。
1. 在每个仓库创建分支 → 提交代码 → push 到 fork 远程
2. 创建 Issue(按分组规则)
3. 读取每个仓库的 PR 模板
4. 填充模板 + 关联 Issue + 设计文档索引
5. 创建跨仓库 PR(fork → 上游原仓)
6. 互相在 PR body 中引用关联 PR 链接
创建 PR 前必须先创建 Issue。 Issue 是 PR 的追溯入口,不可跳过。
Issue 创建规则:
- 按上述「Issue 分组规则」确定在哪个仓库创建
- 同一层级的仓库共用一个 Issue
- 不同层级使用独立 Issue
- Issue body 应包含:需求描述、涉及仓库列表、关联 PR(创建后回填)
python3 -c "
import urllib.request, json, os
token = os.environ.get('GITCODE_TOKEN') or os.environ.get('GITLAB_TOKEN') or exit('Error: set GITCODE_TOKEN or GITLAB_TOKEN')
url = 'https://gitcode.com/api/v5/repos/{owner}/{repo}/issues'
data = json.dumps({'title': ISSUE_TITLE, 'body': ISSUE_BODY}).encode()
req = urllib.request.Request(url, data=data, method='POST')
req.add_header('PRIVATE-TOKEN', token)
req.add_header('Content-Type', 'application/json')
resp = urllib.request.urlopen(req, timeout=15)
result = json.loads(resp.read().decode())
print(f'Issue #{result[\"number\"]}: {result[\"html_url\"]}')
"
Issue 命名规范:
docs: {简要描述}feat: {简要描述}fix: {简要描述}refactor: {简要描述}cd {本地仓库路径}
git checkout master && git pull origin master
git checkout -b {type}/{short-description}
git add -A
# 获取 git 配置的署名信息
SIGN_OFF=$(git config user.name && echo " <$(git config user.email)>")
git commit -m "{type}: {subject}
- {detail_1}
- {detail_2}
Co-Authored-By:Agent
Signed-off-by: ${SIGN_OFF}"
git push -u origin {type}/{short-description}
分支命名规范: docs/xxx / feat/xxx / fix/xxx / refactor/xxx
Commit message 规范(Conventional Commits):
type: subject
- 详细变更项 1
- 详细变更项 2
Co-Authored-By:Agent
Signed-off-by: {user.name} <{user.email}>
必填项:
Co-Authored-By:Agent — 固定格式,无尖括号无邮箱Signed-off-by: — 使用 git config user.name 和 git config user.email 的值创建 PR 前必须读取仓库的 PR 模板,用实际内容填充后作为 body 提交。
PR body 组成规则:
读取模板:从仓库本地路径读取 PR 模板文件(按优先级查找):
.gitcode/PULL_REQUEST_TEMPLATE.zh-CN.md.gitcode/PULL_REQUEST_TEMPLATE.md.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md.gitee/PULL_REQUEST_TEMPLATE.md.github/PULL_REQUEST_TEMPLATE.mdPULL_REQUEST_TEMPLATE.md填充模板:将模板中的占位项替换为实际内容:
Closes #N附加设计文档索引:在 body 末尾附加本次工作流产出的设计文档清单,格式如下:
---
## 设计文档
- 需求提案:[proposal.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/proposal.md)
- 需求基线:[{date}-{feature}-requirement.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/{date}-{feature}-requirement.md)
- 架构设计:[{date}-{feature}-design.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/{date}-{feature}-design.md)
- 方案评审:[{date}-{feature}-brainstorm.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/{date}-{feature}-brainstorm.md)
- 设计评审:[{date}-{feature}-review.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/{date}-{feature}-review.md)
- 统一规格:[spec.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/spec.md)
- 代码分析:[{date}-{feature}-analysis.md]({DOCS_REPO_URL}/blob/master/analysis/{date}-{feature}-analysis.md)
- Committer 检视:[{date}-{feature}-committer-review.md]({DOCS_REPO_URL}/blob/master/docs/features/{feature-name}/{date}-{feature}-committer-review.md)
{DOCS_REPO_URL}为{docs_repo}仓库的 GitCode Web URL。如果设计文档不在 GitCode 仓库中,使用本地绝对路径。
默认模板(无仓库模板时使用):
### 关联的issue:
Closes #N
### 修改描述:
{需求概述}
涉及仓库:{仓库名列表}
### 入库必检项
是否涉及非兼容变更: {是/否}
TDD自验结果: {Pass/Fail/不涉及}
XTS自验结果: {Pass/Fail/不涉及}
检视意见是否都已闭环: {是/否}
调用示例:
python3 -c "
import urllib.request, json, os
token = os.environ.get('GITCODE_TOKEN') or os.environ.get('GITLAB_TOKEN') or exit('Error: set GITCODE_TOKEN or GITLAB_TOKEN')
url = 'https://gitcode.com/api/v5/repos/{owner}/{repo}/pulls'
# body 内容由模板填充 + 设计文档索引组合而成
body = TEMPLATE_CONTENT + '\n\n---\n\n## 设计文档\n' + DOCS_INDEX
data = json.dumps({
'title': 'PR标题',
'head': '源分支名',
'base': '132_trunk', // chromium_src 用 132_trunk,其他仓库用 master
'body': body
}).encode()
req = urllib.request.Request(url, data=data, method='POST')
req.add_header('PRIVATE-TOKEN', token)
req.add_header('Content-Type', 'application/json')
resp = urllib.request.urlopen(req, timeout=30)
result = json.loads(resp.read().decode())
print(f'PR #{result[\"number\"]}: {result[\"html_url\"]}')
"
注意事项:
/pulls 端点,head 参数必须带 owner 前缀,格式为 {fork_owner}:{branch_name}。切勿 POST 到 fork 仓库自身,否则会创建 fork 内部自合并 PR。Closes #N/pulls,不是 /merge_requestsGET /pulls?state=open&head={branch} 确认,避免重复创建Subagent 模式: 不自动合并,等待主 session 决策 4 确认。
交互模式: 如果用户要求合并:
python3 -c "
import urllib.request, json, os
token = os.environ.get('GITCODE_TOKEN') or os.environ.get('GITLAB_TOKEN') or exit('Error: set GITCODE_TOKEN or GITLAB_TOKEN')
url = 'https://gitcode.com/api/v5/repos/{owner}/{repo}/pulls/{pr_number}/merge'
req = urllib.request.Request(url, method='PUT')
req.add_header('PRIVATE-TOKEN', token)
req.add_header('Content-Type', 'application/json')
resp = urllib.request.urlopen(req, timeout=30)
result = json.loads(resp.read().decode())
print(f'PR merged: {result.get(\"state\", \"merged\")}')
"
| 操作 | 方法 | 端点 |
|---|---|---|
| 创建 Issue | POST | /repos/{owner}/{repo}/issues |
| 关闭 Issue | PATCH | /repos/{owner}/{repo}/issues/{number} |
| 创建 PR | POST | /repos/{owner}/{repo}/pulls |
| 关闭 PR | PATCH | /repos/{owner}/{repo}/pulls/{number} |
| 获取 PR | GET | /repos/{owner}/{repo}/pulls/{number} |
| 合并 PR | PUT | /repos/{owner}/{repo}/pulls/{number}/merge |
关闭 Issue/PR 注意事项:
PATCH 方法,不是 PUTstate_event: close(不是 state: closed)state_event 只接受 close 或 reopen/pulls: 确认使用 repos/{owner}/{repo}/pullsCloses #Nhead 参数使用 {fork_owner}:{branch} 格式(跨仓库 PR)✅ gitcode-pr 完成
📋 Issue: #{number} — {title}
🔀 PR: #{number} — {title}
🔗 PR URL: {url}
📂 分支: {branch_name}
📊 状态: {open/merged}
Expert assistant for ArkTS-JS Interoperability in ArkCompiler (ArkTS runtime). 触发场景:修改/调试 ArkCompiler 互操作层代码(static_core/plugins/ets/runtime/interop_js/)、实现 ArkTS 与 JS 跨语言调用、处理 ETS 和 JS 之间的值转换(js_convert/JSRefConvert)、分析 Interop 内存泄漏与 GC 安全点、以及进行相关代码规范审查。
Guide for adding and maintaining ArkTS <-> JS/TS interoperability tests in ArkCompiler. 触发场景:在 plugins/ets/tests/interop_js/tests/ 目录下创建新的 ArkTS 与 JS/TS 互操作(Interop)测试用例、调试/维护已有 Interop 测试、编写 C++ 运行器(GTest runner)或声明文件(.d.ets)时。
Use when an OpenHarmony C++ change must be checked for call-chain completeness, especially for data propagation, IPC/proxy/stub paths, virtual overrides, callbacks, or dlopen/dlsym boundaries. Produces evidence tables and modification coverage matrices; the helper script only discovers candidate edges.
Use when the user wants to download OpenHarmony daily build images or flash them to a real device (DAYU200/RK3568 or others). Triggers on daily build, DAYU200, RK3568, flashing, burning, hdc reboot, upgrading firmware.
为 C/C++ 项目生成 LLVM libFuzzer FUZZ 测试用例、执行 26 条安全规范审查、生成语义化种子数据。 兼容 OpenHarmony / Linux / Android 构建系统。 触发关键词:fuzz 测试、生成 fuzzer、创建 fuzz 用例、fuzz 规范检查、fuzz_test、LLVMFuzzerTestOneInput、种子数据/corpus
ETS-JavaScript interop Promise bridging system in ArkCompiler. Use this skill when working on cross-language Promise conversion between ETS (ArkTS) and JavaScript, including JSConvertPromise Wrap/Unwrap, EtsPromise proxy creation, EtsPromiseRef bridging, CreatePromiseLink, OnJsPromiseCompleted callbacks, connectPromise, SettleJsPromise, PromiseInteropResolve/Reject, EtsAwaitPromise/AwaitProxyPromise, callback queue management, or any code under js_convert.h (Promise section), js_job_queue, ets_promise, ets_promise_ref, std_core_Promise.cpp, or PromiseInterop.ets. Also use when debugging cross-VM Promise state synchronization, coroutine suspension/resumption during await, or napi_deferred lifecycle issues.