원클릭으로
conventional-branch
// Use when creating or validating a Git branch name so the branch follows a conventional type/description format, matches the work being done, and starts from the right base branch.
// Use when creating or validating a Git branch name so the branch follows a conventional type/description format, matches the work being done, and starts from the right base branch.
Use when Copilot CLI's built-in tools do not cover a service you need — for example PostgreSQL, Redis, Jira, Slack, or an internal API — and you need to add an MCP server beyond the default GitHub MCP. NOT when the built-in tools already cover the task.
Use when designing or reviewing an AI agent system that needs policy-based access controls, intent classification, tool-level rate limiting, trust scoring for multi-agent workflows, or append-only audit trails.
Use when auditing an AI agent system against the OWASP Agentic Security Initiative Top 10 — checks tool access, prompt boundaries, memory handling, and operational safeguards across the agent pipeline.
Use when you need to evaluate an LLM pipeline or AI feature systematically — sets up an eval harness with test cases, scoring rubrics, and pass/fail tracking rather than one-off manual spot-checks
Use when reviewing or planning QA strategy for a feature, PR, or release so test coverage, test quality, reliability, and defect reporting are handled as a coherent engineering discipline instead of ad hoc checks.
Use when work is changing sessions, agents, or machines and the next pass needs a compact handoff document with current state, open questions, and next steps instead of raw chat history.
| name | conventional-branch |
| description | Use when creating or validating a Git branch name so the branch follows a conventional type/description format, matches the work being done, and starts from the right base branch. |
| metadata | {"category":"workflow","agent_type":"general-purpose","origin":"adapted from github/awesome-copilot conventional-branch (MIT)"} |
Create branch names that are easy to scan, easy to sort, and easy to align with Conventional Commits.
feature/... or fix/...| Instead of conventional-branch | Use |
|---|---|
| Writing or splitting commit messages | commit-workflow |
| Creating isolated parallel checkouts for multiple branches | using-git-worktrees |
| Switching to an already agreed branch name with no validation needed | create or checkout the branch directly |
<type>/<description>
| Type | Alias | Good fit |
|---|---|---|
feature | feat | New features or enhancements |
fix | bugfix | Non-urgent bug fixes |
hotfix | — | Urgent production fixes |
release | — | Release preparation branches |
docs | — | Documentation-only changes |
chore | — | Tooling, config, or housekeeping |
main, master, and develop remain reserved trunk branches. Do not treat
them as valid topic branch names in this workflow.
release/v1.2.0-. or .-feature/add-login-page
feat/issue-123-add-login
fix/fix-header-overflow
hotfix/security-patch
release/v1.2.0
docs/update-docs-links
Choose the type from the actual work:
featurefixhotfixreleasedocschoreIf the user did not specify a type, default to feature unless the task is
clearly a fix or release action.
Turn the work summary into a short kebab-case slug:
Examples:
Add OAuth Login -> add-oauth-loginissue 123 fix header bug -> issue-123-fix-header-bugRelease 1.2.0 -> v1.2.0Use a quick validation pass before creating the branch:
$branch = "feature/add-oauth-login"
if ($branch -cmatch '[A-Z]') { throw "Branch must be lowercase." }
if ($branch -match '[ _]') { throw "Branch cannot contain spaces or underscores." }
if ($branch -match '--|\.\.|-\.|\.-') { throw "Branch has an invalid separator sequence." }
if ($branch -notmatch '^(?:feature|feat|fix|bugfix|hotfix|release|docs|chore)\/[a-z0-9][a-z0-9.-]*[a-z0-9]$') {
throw "Branch does not match the conventional pattern."
}
$parts = $branch.Split('/', 2)
if ($parts.Count -eq 2) {
$type = $parts[0]
$description = $parts[1]
if ($type -ne 'release' -and $description -match '\.') {
throw "Dots are only allowed for release branches."
}
}
For release branches, verify the description still looks like a version rather than a prose sentence.
Prefer the remote default branch first, then fall back to local trunk branches:
$base = git symbolic-ref --short refs/remotes/origin/HEAD 2>$null
if ($base) {
$base = $base -replace '^origin/', ''
} else {
foreach ($candidate in @('develop', 'main', 'master')) {
git show-ref --verify --quiet "refs/heads/$candidate"
if ($LASTEXITCODE -eq 0) {
$base = $candidate
break
}
}
}
if (-not $base) { throw "Could not determine the base branch." }
$branch = "feature/add-oauth-login"
$hasRemoteBase = $false
git ls-remote --exit-code origin "refs/heads/$base" *> $null
if ($LASTEXITCODE -eq 0) {
$hasRemoteBase = $true
}
git checkout $base
if ($hasRemoteBase) {
git pull origin $base
}
git checkout -b $branch
Report:
git push -u origin <branch>Keep the branch type aligned with the likely commit prefix when practical:
| Branch | Typical commit |
|---|---|
feature/add-login | feat: add login |
fix/fix-header | fix: correct header overflow |
docs/update-readme | docs: refresh setup guide |
chore/update-deps | chore: bump dependencies |
release/v1.2.0 | chore: release v1.2.0 |
commit-workflow - align later commit messages with the branch intentusing-git-worktrees - isolate multiple topic branches in parallel