From omni
Creates or reuses Git branches and feature directories (changes/...). Parses input to decide branch/directory actions, outputs BRANCH_NAME, FEATURE_DIR, SPEC_FILE.
How this skill is triggered — by the user, by Claude, or both
Slash command
/omni:create-branchThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
当需要为功能规格创建或复用工作上下文时使用本技能。目标是确定并返回:
当需要为功能规格创建或复用工作上下文时使用本技能。目标是确定并返回:
BRANCH_NAMEFEATURE_DIRSPEC_FILE本技能处理两类问题:
changes/... 功能目录从用户指令与上下文中解析两个驱动量;未出现则视为未指定:
| 输入 | 含义 | 视为已指定 |
|---|---|---|
BRANCH_NAME | Git 分支名 | 显式给出;或「在 xxx 分支」「使用当前分支」等可解析为单一分支名 |
FEATURE_DIR | 功能目录,位于仓库 changes/ 下 | 显式路径 changes/foo、仅目录名 foo(补全为 changes/foo)、或等价表述 |
若两者都未指定,可根据 description 推导一个建议名,用于后续询问或派生目录名;这只是技能内部推导,不是脚本参数。若最终采用“基于描述建议”的命名方式,除非名称中已包含业务前缀编号,否则最终建议名应补一个可用编号前缀。
严格按以下顺序执行,不要跳步:
BRANCH_NAME、FEATURE_DIR。FEATURE_DIR:
changes/foo,直接视为功能目录。foo,先补全为 changes/foo 再继续。spec.md,必须走脚本。ls test_01/ 再判断它是不是 changes/test_01。ls changes/* | grep ... | sort ... | tail ... 这类方式扫描编号目录。spec.md,然后再把状态“补齐”给脚本。本节规则只用于技能内部生成建议名,可用于建议分支名、建议目录名,或在“新建分支(基于描述)”场景下推导 BRANCH_NAME 的核心标识;不是 create-new-feature 脚本的输入参数规则。
BRANCH_NAME。thread-table-aging、add-user-auth。OAuth2、API、JWT 等技术缩写的语义,不要在推导阶段丢失这些关键词。RDC:项目-xxxx 或 BUG:项目-xxxx 的编号前缀:
RDC: 或 BUG:,不得丢弃。RDC:xGW7-13063413-session-delete,不得替换或省略编号。thread-table-aging。001-thread-table-aging。补充说明:
RDC: / BUG: 前缀,则该前缀即为核心标识,无需再额外补通用编号。BRANCH_NAME 与 FEATURE_DIR。BRANCH_NAME 推导目录名,可在调用脚本前再做一次目录安全清洗。先判断当前工作区是否为 Git 仓库,例如执行 git rev-parse --is-inside-work-tree。之后按 BRANCH_NAME × FEATURE_DIR 是否指定走分支。
已指定 FEATURE_DIR | 未指定 FEATURE_DIR | |
|---|---|---|
已指定 BRANCH_NAME | G1:若分支与目录都已存在则直接复用;只要任一项缺失,就必须调用脚本创建缺失项,并确保 spec.md 存在 | G2:若分支已存在则直接复用;若目录缺失,则先根据 BRANCH_NAME 推导目录名,再调用脚本创建目录;若分支缺失,同样必须通过脚本创建;确保 spec.md 存在 |
未指定 BRANCH_NAME | G3:若目录已存在则直接复用;若目录不存在则不要手工创建,先按「询问 A」明确分支策略,再通过脚本创建所需目录/分支 | G4:若能从 description 推导建议名,则先生成最终建议名称;无业务前缀时应补编号;一旦决定新建,必须通过脚本创建建议目录与分支,然后再进入后续流程 |
已指定 FEATURE_DIR | 未指定 FEATURE_DIR | |
|---|---|---|
已指定 BRANCH_NAME | N1:提示当前非 Git,BRANCH_NAME 仅作逻辑名;若目录已存在则直接复用;若目录缺失则必须通过脚本创建并初始化 spec.md | N2:提示当前非 Git;若未给目录,则可由 BRANCH_NAME 推导目录名;目录创建必须通过脚本完成 |
未指定 BRANCH_NAME | N3:若目录已存在则直接复用;若目录缺失则必须通过脚本创建;确保 spec.md 存在 | N4:若能从 description 推导建议名,则先生成最终建议名称;无业务前缀时应补编号;目录创建必须通过脚本完成 |
非 Git 场景下仅维护磁盘上的 changes/<dir>/ 与 spec.md;不执行 Git 分支操作。
仓库中的 create-new-feature 是一个双参数直通脚本,只接受:
BRANCH_NAMEFEATURE_DIR使用原则:
BRANCH_NAME 已存在,且目标 FEATURE_DIR 已存在,并且当前场景只是“复用”,则直接复用,不需要调用脚本。spec.md,都必须调用脚本,不允许技能侧手工创建后再补状态。BRANCH_NAME / FEATURE_DIR 传给脚本。FEATURE_DIR 进行,而不是针对原始输入文本直接检查。脚本职责:
REPO_ROOTFEATURE_DIR:支持绝对路径、changes/foo、或仅目录名 fooBRANCH_NAME,则按分支名最后一段清洗后推导目录名FEATURE_DIRspec.md,若已存在则不覆盖BRANCH_NAME、SPEC_FILE、FEATURE_DIR| 环境 | 命令 |
|---|---|
| Linux / macOS / Git Bash | bash ./.infra/scripts/bash/create-new-feature.sh --json --branch-name "<BRANCH_NAME>" --feature-dir "<DIR_NAME>" |
| Windows(PowerShell) | pwsh ./.infra/scripts/powershell/create-new-feature.ps1 -Json -BranchName "<BRANCH_NAME>" -FeatureDir "<DIR_NAME>" |
说明:
FEATURE_DIR 优先传目录名本身,例如 001-gsu-session-delete-handle;脚本会自动补到 changes/...。BRANCH_NAME 时,脚本会自动推导目录名。FEATURE_DIR 时,脚本只创建或复用目录与 spec.md,不会执行 Git 分支操作。short_name、编号分支、--number 等旧入口。BRANCH_NAMESPEC_FILEFEATURE_DIRchange_file:与 SPEC_FILE 同义,仅为兼容旧调用方保留HAS_GIT询问 A(Git,无 BRANCH_NAME,已有或刚建 FEATURE_DIR):
已关联功能目录 <FEATURE_DIR>,请选择分支操作:
A. 复用已有分支(请说明分支名,或“使用当前分支”)
B. 新建特性分支(建议名:<建议 BRANCH_NAME>)
询问 B(Git,两者均未指定,已生成目录或建议名):
已准备功能目录 <FEATURE_DIR>,请选择分支操作:
A. 复用某个已有分支(请说明分支名)
B. 新建特性分支(建议名:<建议 BRANCH_NAME>)
| 变量 | 说明 |
|---|---|
BRANCH_NAME | 最终采用的分支名;非 Git 时可仅作为逻辑名 |
FEATURE_DIR | 功能目录绝对路径 |
SPEC_FILE | $FEATURE_DIR/spec.md 绝对路径 |
将以上三个值统一传给调用方技能,例如 specify。
npx claudepluginhub zte-aicloud/co-omnispec --plugin omniManages Git branches and feature directories based on requirement IDs. Creates or reuses branches and directories, validates requirement IDs, and sets output variables for downstream tools.
Creates Git feature branches with short auto-incremented names and type prefixes (feat/fix/refactor/chore/docs). Generates from manual descriptions, uncommitted changes, or Arkhe SDLC specs.
Creates a feature branch or worktree before writing artifacts. Detects the base branch, infers a branch name from context, and confirms with the user.