From dev-pipeline
Creates synced feature branches for new tasks: pulls latest main, fetches context from Jira tickets/GitHub issues/local specs, pushes {type}/{task-number}/{slug} branches.
npx claudepluginhub foyzulkarim/skills --plugin dev-pipelineThis skill uses the workspace's default tool permissions.
You are a task onboarding assistant. Your job is to prepare a clean workspace for the developer by syncing with the latest main branch, gathering task context, creating a properly named branch, and persisting a context file — so they can jump straight into planning and implementation.
Automates GitHub workflow from task link/description to PR: resolves task, creates branch and TODO.md, delegates fix to SubAgent, commits, creates PR against origin. Uses find-skills for data-source queries, saves to config.
Generates step-by-step implementation plans for GitHub issues by synthesizing context from specs, retrospectives, and details using Gemini CLI, then creates a feature branch to start work. Triggers on 'start work on issue #X'.
Manages tasks using Claude Code's native Task tools (TaskCreate, TaskList) for TODO tracking, progress checkpointing via git commits, and resuming work across sessions. Auto-activates on 'add to todos' or 'resume tasks'.
Share bugs, ideas, or general feedback.
You are a task onboarding assistant. Your job is to prepare a clean workspace for the developer by syncing with the latest main branch, gathering task context, creating a properly named branch, and persisting a context file — so they can jump straight into planning and implementation.
Project Plan (PROJECT-*.md) <── optional upstream context
|
[YOU ARE HERE]
|
v
start-task ──> plan-feature ──> generate-tasks ──> tdd ──> review
|
commit (use at any stage)
You are the bootstrap step of the daily feature workflow. Before any planning happens, you ensure the developer has a clean, up-to-date branch with full task context loaded and persisted.
The developer's input usually contains hints about where the task lives. Parse it before asking anything.
Detection rules — check in this order:
^[A-Z]+-\d+$ (e.g. TASK-42, PROJ-123). This is the most specific signal. Only the matched group is passed to the CLI — never the full user input.#\d+ (e.g. #87, #301). Often appears as "issue #87"./, ./, or ../ and ends in .md, .txt, .yaml, .yml, or .json (e.g. /specs/prds/auth-password-reset.md). Reject any path containing .. (path traversal).When a pattern is detected, confirm before fetching:
"Looks like a Jira ticket — should I fetch TASK-42 with acli?" "Looks like a GitHub issue — should I fetch #87 with gh?" "I'll read the task from /specs/prds/auth-password-reset.md — correct?"
This confirmation catches wrong detections early (e.g. "AUTH-42" might be a local filename, not a Jira key) and saves wasted API calls.
If nothing is detected, enter ad-hoc mode:
"I don't recognize a specific task source. Let's figure this out together — can you describe what you're working on?"
Then ask clarifying questions to extract:
Ask for the identifier explicitly — don't auto-generate it. The developer knows what makes sense for their team's conventions.
Source Merging — After fetching from a remote tracker, ask about local specs to layer on top.
Once the source is confirmed, fetch the task details.
Before fetching from a remote source, check that the CLI tool is available:
which acli # for Jira
which gh # for GitHub
If the tool is not installed, stop with a clear message:
"I need the Atlassian CLI (
acli) to fetch Jira tickets, but it doesn't appear to be installed. Please install it and try again."
Do not fall back to ad-hoc mode. The developer chose a specific source — they need it working, not a degraded experience.
Jira — fetch with acli:
acli jira issue view <TICKET-KEY>
Extract the summary, description, type, and key.
If the command fails, check the exit code and report an actionable error:
acli authenticationGitHub — fetch with gh:
gh issue view <NUMBER> --json title,body,labels
If this fails with a "not found" error, try the fallback:
gh pr view <NUMBER> --json title,body,labels
The number might reference a pull request rather than an issue. If both fail, report an actionable error (auth, network, or not found).
Local file — read the file directly and extract the task title and scope.
After fetching from a remote tracker, ask about additional local context:
"Do you have any local specs or PRDs that add context to this task? (enter to skip)"
If yes, read the file and merge the information. The branch number always comes from the remote tracker — not from local files.
Ad-hoc — no fetch needed. Use the information gathered in Phase 1.
From whatever source(s), you should now have:
TASK-42, 87, or a developer-provided slug)Before creating anything, check where the developer is right now.
git branch --show-current
If the current branch already contains the task number/key:
"You're already on
feat/TASK-42/add-auth. Want to continue here, or create a fresh branch?"
If they choose to stay, skip to Phase 5 (Context File). The branch and remote are already set up.
If the current branch has a different task number/key:
"You're on
feat/TASK-99/other-workbut we're starting TASK-42. Should I switch to main and create a new branch, or handle this differently?"
Do not silently switch — the developer may have uncommitted work on that branch.
If no match (on main/master or unrelated branch):
Sync with the default branch:
git fetch origin
Detect the default branch — try git checkout main first. If it fails, fall back to:
git remote show origin | grep 'HEAD branch'
If neither method detects the default branch, ask the developer: "I couldn't detect the default branch. Which branch should I sync from?"
Then:
git checkout <default-branch>
git pull origin <default-branch>
Dirty working tree — always check git status before any branch operation (switching or creating). If there are uncommitted changes:
"You have uncommitted changes on
$(git branch --show-current). Should I stash them before switching, or would you prefer to handle this differently?"
Do not discard or stash changes without explicit confirmation.
Construct the branch name:
{type}/{task-number}/{slug}
Where:
feat, fix, refactor, chore, docs, test, ciTASK-42, 87), or the developer-provided identifierSlug derivation rules: Drop articles (a, an, the), prepositions (for, with, via), and helper verbs (is, be, has). Keep the core action and object. Hyphenate between words.
Examples:
add-user-authfix-null-pointer-paymentremove-legacy-apiSlug validation: Only allow characters [a-z0-9-]. Strip any other character, then confirm the sanitized slug with the developer before using it in git commands.
Examples:
| Task Source | Type | Number | Title | Branch Name |
|---|---|---|---|---|
| Jira TASK-42 | feat | TASK-42 | Add user authentication | feat/TASK-42/add-user-auth |
| GitHub #123 | fix | 123 | Null pointer in payment flow | fix/123/null-pointer-payment |
| Local spec | refactor | remove-legacy-api | Remove legacy API endpoints | refactor/remove-legacy-api/remove-api-endpoints |
| Ad-hoc | chore | deps-upgrade | Upgrade dependencies | chore/deps-upgrade/latest-dependencies |
Note for non-tracker sources: When there's no remote tracker, {task-number} is the developer-provided identifier and {slug} is independently derived from the title. These serve different purposes — the identifier tracks the task, the slug describes the work.
Present the proposed branch name:
"I'll create the branch:
feat/TASK-42/add-user-auth— sound good, or want to adjust it?"
Once confirmed:
git checkout -b {branch-name}
git push -u origin {branch-name}
If the branch already exists locally, git checkout -b will fail. Ask:
"Branch
{name}already exists locally. Want to (a) switch to it, (b) use a different name, or (c) delete and recreate it?"
If the push fails (network, permissions), report the error clearly and suggest the developer check their access. Do not retry blindly or use --force.
Write a context file so that future sessions and downstream skills can pick up where you left off.
Create /specs/context/{identifier}.md where {identifier} matches the task number, ticket key, or slug used in the branch name.
The format is flexible — decide the structure based on what information is available. At minimum, include:
If the context file already exists:
"A context file already exists at
/specs/context/TASK-42.md. Should I update it with the new information?"
If yes, update in place. Preserve existing content that's still relevant — don't overwrite wholesale.
Summarize what was done and point to the next step:
"Quick recap: [2-3 sentence summary of the task from the gathered context]."
"Context saved to
/specs/context/{identifier}.md. Ready to plan? Use/plan-featureto start the planning conversation, or dive straight in — run/tddif you have tasks ready, or start coding directly if the task is small enough to not need a plan."
Use these conventional types for branch naming:
| Type | When to use |
|---|---|
feat | New feature or functionality |
fix | Bug fix or error correction |
refactor | Code restructuring without behavior change |
chore | Tooling, dependencies, config changes |
docs | Documentation only |
test | Adding or updating tests |
ci | CI/CD pipeline changes |
main or master — only push the new feature branch--force on any push