跳到正文
cccskills
免费在 GitHub 公开中文介绍

pr

从当前分支创建拉取请求,通常以 `canary` 为目标;当客户端依赖服务器契约时,按依赖顺序拆分多个请求,并整理验收链接与说明。

原文查看原文说明

Create a PR for the current branch (targets `canary` by default), including splitting one cross-layer branch into ordered stacked PRs so a lower layer (db / shared package / server TRPC) merges before its callers (desktop / CLI / UI). Use when the user asks to create / submit a PR, or to split a branch because clients call a server contract that isn't on the trunk yet. Triggers on 'pr', 'create pr', 'submit pr', 'open a PR', 'pull request', 'split this PR', 'stacked PR', 'backend should merge first', '提 PR', '提个 PR', '新建 PR', '拆 PR', '后端先合', '分层合并'.

lobehub/lobehub星标 83,510(GitHub 83,510 + cccskills 0)
集成工具GitHub

实测评分 未实测

查看安装方法

适用场景

  • 从当前分支创建拉取请求
  • 按顺序拆分服务端和客户端改动
  • 梳理请求依赖与合并顺序
  • 将验收检查关联到请求

中文介绍

功能

这份指南帮助你检查当前分支的改动和已有拉取请求,并在需要时创建请求。默认目标分支是 canary。如果同一分支同时包含数据库、共享软件包或服务器接口契约,以及调用这些内容的桌面端、命令行界面或用户界面代码,指南会将工作拆成多个请求,让底层改动先合并。指南还涵盖如何判断每个请求能否单独构建和运行、查找相关问题、关联验收检查,以及按照项目模板编写说明。

适用场景

准备提交分支改动供他人审查时可以使用。如果客户端代码已经依据某项后端契约实现,但该契约尚未进入目标分支,也适合参考。它还能帮助保持多个依赖请求的顺序,并明确每个请求负责的层级及相关问题。

使用示例

  • “请从当前分支创建一个目标为 canary 的拉取请求。”
  • “请按依赖顺序把这些改动拆成服务端和客户端请求。”
  • “请整理拉取请求说明所需的改动概要和验收检查。”

注意事项

创建拉取请求需要 GitHub CLI(gh)和已完成认证的环境。流程有时会要求提供验收检查的公开链接。请求正文必须使用英语,也不能包含来自生产数据的标识符或用户信息。

本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。

文档检查

AI 根据 SKILL.md 的内容检查了需要注意的操作和使用前提。评分只依据实际运行的结果(实测对比)。

安全性发送数据、删除文件、执行命令等是否有说明
B部分不足流程会推送并公开请求,同时说明了生产数据和公开内容的限制。
安装难易度所需工具和 API 密钥是否少且有说明
B部分不足需要 GitHub CLI、认证和验收发布权限,但只提供了部分设置步骤。

不计入评分。 由 AI(OpenAI Codex)于 2026年10月26日 评估。仅供参考,安装前请同时查看原文。

如果您认为评估有误,请申请复核

请写明哪一项有误以及原因。无需登录。我们会对照 SKILL.md 重新评估,并在此处更新结果。

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

包含的文件(2)

  • SKILL.md12.5 KB
  • agents/openai.yaml43 B

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Create Pull Request

Branch Strategy

  • Target branch: canary (development branch, cloud production)
  • main is the release branch — never PR directly to main

Steps

1. Gather context (run in parallel)

  • git branch --show-current — current branch name
  • git status --short — uncommitted changes
  • git rev-parse --abbrev-ref @{u} 2>/dev/null — remote tracking status
  • git log --oneline origin/canary..HEAD — unpushed commits
  • gh pr list --head "$(git branch --show-current)" --json number,title,state,url — existing PR
  • git diff --stat --stat-count=20 origin/canary..HEAD — change summary
  • Reuse an existing acceptance link from the task when it covers the delivered behavior. If a lookup is needed, first follow Publish auth preflight, then run publish_lh acceptance run list --json and match on branch. Do not blindly unset API keys: the production credential may exist only in the environment. A lookup never requires creating a new round.

2. Handle uncommitted changes on default branch

If current branch is canary (or main) AND there are uncommitted changes:

  1. Analyze the diff (git diff) to understand the changes
  2. Infer a branch name from the changes, format: <type>/<short-description> (e.g. fix/i18n-cjk-spacing)
  3. Create and switch to the new branch: git checkout -b <branch-name>
  4. Stage relevant files: git add <files> (prefer explicit file paths over git add .)
  5. Commit with a proper gitmoji message
  6. Continue to step 3

If current branch is canary/main but there are NO uncommitted changes and no unpushed commits, abort — nothing to create a PR for.

3. Push if needed

  • No upstream: git push -u origin $(git branch --show-current)
  • Has upstream: git push origin $(git branch --show-current)

4. Search related GitHub issues

  • gh issue list --search "<keywords>" --state all --limit 10
  • Only link issues with matching scope (avoid large umbrella issues)
  • Skip if no matching issue found

5. Acceptance gate

A feature or fix needs a published acceptance round before the PR is opened (AGENTS.md → Acceptance). If step 1 found none for this branch, run the acceptance skill first and come back with its https://app.lobehub.com/acceptance/<id> link. When the delivery was already verified on the real product earlier in the session, that skill's ingest path publishes the existing observations and artifacts directly — no re-run, no re-plan. Pure refactors or tooling changes with no user-visible outcome may skip it — state that in the PR body instead of leaving the line out.

6. Create PR with gh pr create --base canary

  • Title: <gitmoji> <type>(<scope>): <description>
  • Body: based on PR template (.github/PULL_REQUEST_TEMPLATE.md)
  • Obey the AGENT-INSTRUCTIONS HTML comments in that template. Keep them commented out, and do not copy them into the visible description.
  • Link related GitHub issues using magic keywords (Fixes #123, Closes #123)
  • Link Linear issues if applicable (Fixes LOBE-xxx)
  • Put the acceptance link (or the explicit skip reason) under Test in the Summary section.
  • Follow the source-label, privacy, and AI assistance rules in PR Template below when creating or updating a PR. Do not request prompt disclosure or block the normal PR workflow waiting for consent to publish a conversation.
  • Write the body to a temporary file and use --body-file to preserve formatting.

7. Link the PR to its acceptance

An acceptance round published before the PR existed carries no PR, and reusing that round is correct, so nothing else ever tells the acceptance about the PR. Right after gh pr create, record the link through the production publish environment. If step 1 reused a known acceptance and skipped the lookup, publish_lh is not defined yet: run Publish auth preflight now to define and verify it.

publish_lh acceptance link-pr <acceptanceId> "$(gh pr view --json url --jq .url)"

Do this for each PR in a stack; they share one acceptance. Skip it when the PR states that no acceptance is needed. A later round links itself only when its result.json names the PR (pullRequest); a PR inferred from the branch is recorded on the round but never linked. If the installed CLI lacks link-pr, or the server rejects it as unknown, mention that in the reply instead of retrying.

8. Open in browser

gh pr view --web

PR Template

Use .github/PULL_REQUEST_TEMPLATE.md as the source of truth for body structure, contribution classification, disclosure eligibility, and required fields. Follow its AGENT-INSTRUCTIONS when filling these sections:

  • Summary: fill for every PR, including the required Contribution source label. AI-assisted work remains labeled AI-assisted even when organization membership exempts the author from disclosing details; human review does not make it human-only. Use Unknown when the source cannot be established.
  • AI assistance: apply the template's organization-member exemption to details only, never to the source label. When required, fill its six fields using the final diff and verification evidence, not private conversation summaries. Use one section per PR, combining tools/models across sessions; report unknown metadata and unperformed review/checks honestly.

Prompts and transcripts are private by default and are not required fields. Only if the author explicitly requests sharing them, review the exact proposed text for sensitive information and obtain confirmation before publishing that text. Authorization to create or update a PR is not consent to publish a conversation. Check attached logs and screenshots for sensitive information too.

No production data identifiers

PR titles, bodies, comments and review replies are public. Never put an identifier or detail taken from production data in them, even when that is where the bug was found:

  • Record ids: topic (tpc_…), message (msg_…), operation (op_…), agent (agt_…), document (docs_…), user, device and bot ids. This includes agent vent ids and ids of internal reproduction reports.
  • User details: device or host names, local paths, file names, quoted user text, and app links to a user's agent or topic.

Describe the evidence instead: "observed in a production topic", "a user with two desktops (device A and device B)". Obvious placeholders (tpc_xxx, C:\Users\user) are fine in examples. Commit hashes, deployment ids and code identifiers are not production data. The same rule applies to commit messages and code comments.

Notes

  • Language: All PR content must be in English
  • If a PR already exists for the branch, inform the user instead of creating a duplicate

Stacked PRs (cross-layer feature)

The steps above create one PR for the current branch. When a single branch lands across layers — packages/database schema/model → a shared packages/* lib → src/server TRPC → apps/desktop + apps/cli callers → src/features UI — shipping it as one PR can't merge safely: the clients call an endpoint that doesn't exist on the trunk until the same PR merges, so any partial/rollback or independent review breaks. Split it into ordered PRs, lower layer first.

The ordering rule

A PR may only merge after every layer it calls is already on the trunk.

  • The server contract (new TRPC procedure, changed return shape, new table/model) merges first.
  • The callers (desktop, CLI, UI) merge after — they invoke that contract.
  • Tie-break with one question: "if this merged alone to canary right now, would it build and behave?" If no, it belongs in a later PR.

Which file goes in which PR

The non-obvious calls:

  • Frontend that adapts to a contract change goes WITH the server PR. If you widen a TRPC return shape (e.g. listDevices now returns platform: string | null), the component consuming it must change in the same PR — otherwise the server PR breaks the build on its own. Contract + its in-repo consumers ship together.
  • A new shared package goes with its consumer, not the server, unless the server imports it too. A @lobechat/* package imported only by desktop/CLI ships in the client PR. Don't carry an unused package in the lower PR.
  • Workspace dep declarations (package.json workspace:*, pnpm-workspace.yaml) travel with the code that imports the package.

The git recipe — split an existing full branch

Starting point: one branch (feat/x) with a single commit <FULL> containing everything, already pushed (so it's also safe on the remote).

# 1. Safety nets — make the full work unloseable before rewriting anything
git branch backup/x-full <FULL>          # local ref to the full commit
git branch feat/x-clients <FULL>         # the higher-layer branch starts here

# 2. Rewrite the lower-layer branch to lower-layer files only
git checkout feat/x                      # this becomes the SERVER PR
git reset --hard origin/canary
git checkout <FULL> -- <server/db files…>   # stages just those paths
git commit -m "✨ feat(...): <server half>"
git push --force-with-lease origin feat/x   # never --force; never push to canary

# 3. Build the higher-layer branch STACKED on the lower branch
git checkout feat/x-clients
git reset --hard feat/x                  # base = the just-rewritten server HEAD
git checkout backup/x-full -- <client/ui files…>   # only the remaining paths
git commit -m "✨ feat(...): <client half>"
git push -u origin feat/x-clients

Then open the higher PR based on the lower branch, not the trunk:

gh pr create --base feat/x --head feat/x-clients --title "…" --body "…"

--base feat/x keeps the diff client-only (no server files leak in) and makes it physically impossible to merge the clients before the server. After the server PR merges to canary, retarget the client PR's base to canary (GitHub usually auto-retargets when the base branch merges; note it in the PR body so a human confirms).

Verify the dependency actually holds

The whole point is the higher layer needs the lower one. Prove it: on the stacked higher branch, type-check the caller and confirm the symbol the lower layer introduced resolves.

cd apps/cli && bun run type-check 2>&1 | grep -iE "connect\.ts|device\.register"
# empty (re: your change) = the stacked base supplies device.register ✓

Filter to your touched files — this repo's standalone type-check emits pre-existing env noise (__ELECTRON__, @/types/llm, unbuilt @lobechat/types) that isn't yours.

PR + Linear bookkeeping

  • Each PR closes only its own layer's issues. Server PR: Closes LOBE-<server>. Client PR: Closes LOBE-<pkg> / <desktop> / <cli>. Don't let one PR's body claim another layer's issue.
  • Both PRs are Part of LOBE-<parent>.
  • On PR creation, move each closed sub-issue to In Review (not Done) and add a completion comment — see the linear skill.

Gotchas

  • Never push to canary. A split branch cut with git checkout -b feat/x origin/canary tracks origin/canary, so a bare git push targets canary. Always git push origin feat/x with the explicit branch name.
  • --force-with-lease, not --force when rewriting the lower branch — it aborts if the remote moved under you.
  • Back up before reset --hard. Step 1's backup/x-full + the pushed remote branch mean the full commit is referenced by ≥3 refs before you rewrite anything. Verify with git branch --contains <FULL>.
  • Lockfiles: this monorepo commits no root pnpm-lock.yaml, so a new workspace:* dep needs no lockfile churn. In a repo that does commit one, regenerate it on each branch after the split.
  • Don't over-split. Two PRs (contract / callers) is usually enough. A UI page that only reads an existing endpoint can be its own later PR, but don't fragment a single layer across PRs for its own sake.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

acceptance

免费有简介

通过实际操作产品验证交付内容,记录用户可查看的证据,并发布验收报告。可检查已有验证计划或创建检查项,选择合适的操作界面,并使用 `lh` CLI 发布结果。

  • 实际检查更改后的产品行为
  • 收集截图或其他验证证据
  • 编写验证计划和报告
lobehub/lobehub8.4万2026年10月26日 更新

add-model-provider

免费有简介

本技能指导在 LobeHub 中接入 AI 模型提供商,涵盖运行时、模型信息、设置、品牌展示、文档和验收,并帮助判断新增模型是否需要新的提供商集成。

  • 为 LobeHub 接入新的 AI 模型提供商
  • 更新提供商设置说明或介绍
  • 判断添加模型是否需要新的提供商集成
lobehub/lobehub8.4万2026年10月26日 更新

add-setting-env

免费有简介

本技能指导如何用服务器端环境变量设置用户偏好默认值,涵盖变量校验、服务器配置、写入用户状态,以及更新 `.env.example` 和自托管文档。

  • 通过环境变量设置用户偏好默认值
  • 将设置接入服务器配置和用户状态
  • 更新环境变量示例及文档
lobehub/lobehub8.4万2026年10月26日 更新

agent-runtime-hooks

免费有简介

说明如何在智能体执行步骤、工具调用、人工审批、上下文压缩和子智能体调用时注册钩子。钩子可观察事件、模拟本地工具结果,也可通过 Webhook 按配置策略允许或拒绝工具调用。

  • 记录智能体步骤和错误
  • 测试时模拟工具结果
  • 通过 Webhook 允许或拒绝工具调用
lobehub/lobehub8.4万2026年10月26日 更新

agent-signal

免费有简介

此技能用于为智能体设计事件驱动的后台工作流,划分来源、信号、动作和策略的职责,并处理异步交接、去重、执行范围、完成记录与运行观测。

  • 添加事件触发的后台任务
  • 将工作移出对话请求
  • 防止动作重复执行
lobehub/lobehub8.4万2026年10月26日 更新

agent-testing-bot

免费有简介

本技能在 macOS 桌面聊天应用中测试机器人频道:打开应用、进入频道或联系人、发送消息、等待回复并截图。支持 Discord、Slack、Telegram、微信、飞书和 QQ;iMessage 使用 BlueBubbles 桥接。

  • 检查真实 Discord 频道中的机器人回复
  • 测试 Slack 或 Telegram 的对话流程
  • 记录 macOS 应用中的操作结果
lobehub/lobehub8.4万2026年10月26日 更新

查看 lobehub 的全部技能

报告此技能的问题