From dev-lifecycle
Full feature development lifecycle — plan, implement, test, review, PR, Copilot review, verify CI, QA demo, and merge. Use when user says "/dev-lifecycle", "full lifecycle", "implement and PR", or describes a feature needing the full plan-to-merge workflow.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dev-lifecycle:dev-lifecycleThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
End-to-end feature development: plan, implement, test, validate, review, PR, verify CI, QA demo, merge, and clean up.
End-to-end feature development: plan, implement, test, validate, review, PR, verify CI, QA demo, merge, and clean up.
Feature request: "$ARGUMENTS"
If $ARGUMENTS is empty, ask the user what feature to implement before proceeding.
Before writing any code, understand the project conventions:
CLAUDE.md (if present) for architecture, testing, linting, and commit conventions.bin/ci script or equivalent CI pipeline to understand quality gates..rubocop.yml, .reek.yml, eslint.config.*, etc.), and testing frameworks.DEFAULT_BRANCH=$(git remote show origin | sed -n 's/.*HEAD branch: //p')
Think through the implementation before writing code:
If the user provides specific instructions (e.g., coverage thresholds, linting rules), note them as hard requirements for later validation.
# Ensure we're on the default branch and up to date
git checkout $DEFAULT_BRANCH
git pull
# Create a feature branch
# Use conventional branch naming: feat/, fix/, refactor/, etc.
git checkout -b <branch-name>
Parse --branch NAME from arguments if provided. Otherwise, derive a branch name from the feature description using conventional prefixes (e.g., feat/per-heartbeat-model, fix/session-timeout).
Write the code and tests:
# rubocop:disable, # :reek:, // eslint-disable, # nosemgrep, etc.) — refactor the code to satisfy the linter instead.Run the project's full CI pipeline locally and fix any issues:
# If a bin/ci script exists, use it
bin/ci
# Otherwise, run linters and tests individually:
# Ruby: rubocop && bundle exec rake test
# JS/TS: npm test or yarn test
# Python: ruff check . && pytest
# Go: golangci-lint run && go test ./...
Repeat until all checks pass:
Cap at 5 iterations. If still failing after 5 attempts, report what's broken and ask the user for guidance.
Run /pr-review-toolkit:review-pr all to catch issues before the PR. If the pr-review-toolkit skill is not available, do a manual review:
git diff $DEFAULT_BRANCH — review all changes for correctness, style, and security.Address any critical or important findings from the review. Re-run local validation after fixes.
Stage all changes and commit with a conventional commit message:
git add <files>
git commit -m "<type>: <description>"
git push -u origin HEAD
Do NOT chain git commands with && — run each as a separate Bash call. Use a concise conventional commit message. If the changes span multiple concerns, use multiple commits.
gh pr create --title "<conventional title>" --body "$(cat <<'EOF'
## Summary
<1-3 bullet points describing what changed and why>
## Changes
<bulleted list of notable changes>
## Test plan
- [ ] Local CI passes (linters, tests, coverage)
- [ ] Self-review completed
- [ ] <feature-specific test steps>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
Keep the PR title under 70 characters. The summary should explain the "why", not just the "what".
Request a GitHub Copilot review and address feedback. Run /gh-copilot-review if the skill is available. If not, do it manually:
Request the review:
gh pr edit --add-reviewer @copilot
Note: the @ in @copilot is critical — without it, it looks for a human user named "copilot".
Wait for the review — poll until Copilot's review is submitted:
REPO=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
PR_NUMBER=$(gh pr view --json number --jq '.number')
# Check for pending review request
gh api "repos/$REPO/pulls/$PR_NUMBER/requested_reviewers" --jq '.users[] | select(.login | test("copilot"; "i")) | .login'
# Check for submitted reviews
gh api "repos/$REPO/pulls/$PR_NUMBER/reviews" --jq '[.[] | select(.user.login | test("copilot"; "i"))] | last | .state'
Poll every 15 seconds until the review is no longer pending (typically 1-3 minutes).
Address feedback — for each inline comment:
```suggestion block, apply the exact suggested change.gh api "repos/$REPO/pulls/$PR_NUMBER/comments/$COMMENT_ID/replies" -f body="Done — applied the suggested change."
Resolve threads — use GraphQL to resolve addressed review threads:
OWNER=$(echo "$REPO" | cut -d/ -f1)
REPO_NAME=$(echo "$REPO" | cut -d/ -f2)
# Get unresolved Copilot threads
gh api graphql -f query='query { repository(owner: "'"$OWNER"'", name: "'"$REPO_NAME"'") { pullRequest(number: '"$PR_NUMBER"') { reviewThreads(first: 100) { nodes { id isResolved comments(first: 1) { nodes { author { login } } } } } } } }'
# Resolve each thread
gh api graphql -f query='mutation { resolveReviewThread(input: { threadId: "'"$THREAD_ID"'" }) { thread { isResolved } } }'
Commit and push fixes:
git add <files>
git commit -m "fix: address Copilot review feedback"
git push
Skip this phase if --skip-copilot was passed in arguments.
Wait for CI to pass on the PR. Run /watch-ci if the skill is available. If not, monitor manually:
# Poll PR checks until they complete
gh pr checks --watch
If CI fails:
gh pr checks --json name,state,conclusionCap at 3 CI fix iterations. If still failing, report what's broken and ask the user.
Skip this phase if --skip-ci was passed in arguments.
Before merging, demo the feature for the user to manually approve. The approach depends on what was built.
Determine which strategy fits the feature:
Use tmux to demo in a split pane so the user can watch live:
Split the pane:
# Create a horizontal split (demo pane below)
tmux split-window -v -l 15
DEMO_PANE=$(tmux display-message -p '#{pane_id}')
Run the demo — send commands to the demo pane:
# Send a command to the demo pane
tmux send-keys -t "$DEMO_PANE" '<demo command>' Enter
Wait for output to settle, then capture it:
tmux capture-pane -t "$DEMO_PANE" -p
Walk through the feature — run 2-5 commands that exercise the new functionality, capturing output after each. Narrate what each step demonstrates (post narration as text output between commands).
Ask for approval: Use AskUserQuestion: "QA Demo complete. The feature works as shown above. Approve to merge, or describe what needs fixing."
Clean up the demo pane:
tmux kill-pane -t "$DEMO_PANE"
If any demo step fails or produces unexpected output, investigate and fix before asking for approval. If a fix is needed, re-run local CI (Phase 5) and push before re-demoing.
Use Playwright MCP (if available) or a headed browser to walk through the feature:
Ensure the dev server is running. If not, start it in a tmux split:
tmux split-window -v -l 5
DEV_PANE=$(tmux display-message -p '#{pane_id}')
tmux send-keys -t "$DEV_PANE" '<start command>' Enter
Wait for the server to be ready (poll the health endpoint or watch for the "ready" log line).
Navigate to the feature using Playwright MCP or browser automation:
Present the walkthrough — describe what each screenshot shows and what the expected behavior is.
Ask for approval: Use AskUserQuestion: "QA Demo complete. Screenshots above show the feature working end-to-end. Approve to merge, or describe what needs fixing."
Clean up — stop the dev server pane if you started one:
tmux kill-pane -t "$DEV_PANE"
For changes with no direct UI:
Run the relevant tests with verbose output so the user can see what's being exercised:
# Ruby example
bundle exec ruby -Itest test/path/to/relevant_test.rb -v
If the change affects configuration or internal behavior, show a before/after comparison (e.g., git stash && <run command> && git stash pop && <run command>).
Ask for approval: Use AskUserQuestion: "QA Demo complete. Test output above exercises the new functionality. Approve to merge, or describe what needs fixing."
If the user rejects the demo:
Cap at 3 demo iterations. If still not approved, stop and discuss with the user.
Skip this phase if --skip-qa was passed in arguments.
Once the user approves the demo, merge the PR and clean up everything:
gh pr merge --squash --delete-branch
If the merge fails (e.g., branch protection, required reviews), report the blocker and ask the user how to proceed.
git checkout $DEFAULT_BRANCH
git pull
If running in a git worktree (detected when git rev-parse --git-dir differs from git rev-parse --git-common-dir):
WORKTREE_PATH=$(pwd)
MAIN_REPO=$(git rev-parse --git-common-dir | sed 's|/\.git$||')
git -C "$MAIN_REPO" checkout "$DEFAULT_BRANCH" && \
git -C "$MAIN_REPO" pull && \
git -C "$MAIN_REPO" worktree remove "$WORKTREE_PATH" && \
git -C "$MAIN_REPO" worktree prune
Check for and clean up any artifacts from the lifecycle:
Do NOT delete or modify any committed files during cleanup. Only clean up transient runtime artifacts.
Skip this phase if --skip-merge was passed in arguments.
Report the final status:
## Feature Complete
**PR:** <url> (merged)
**Branch:** <branch-name> (deleted)
### What was implemented
- <summary of changes>
### Quality checks
- Local CI: passed
- Self-review: passed
- Copilot review: addressed
- Remote CI: passed
- QA demo: approved
### Cleanup
- Switched to <default-branch>, pulled latest
- <worktree removed / branch deleted / etc.>
If any phase was skipped, note it in the report.
--skip-copilot — Skip the Copilot review phase--skip-review — Skip the self-review phase (Phase 6)--skip-ci — Skip the remote CI verification phase--skip-qa — Skip the QA demo phase--skip-merge — Stop after CI passes; do not merge or clean up--branch NAME — Use a specific branch name instead of auto-generating onenpx claudepluginhub ericboehs/claude-plugins --plugin dev-lifecycleOrchestrates full dev cycle in isolated git worktree: task understanding, TDD implementation, quality review, draft PR, CI/CD monitoring to merge-ready PR. Explicit invoke via /developer-workflow:implement-task.
Coordinates specialist agents through a complete development cycle: requirements, planning, implementation, refactoring, QA, and documentation. Use for systematic feature development with quality checks.
Guides the full SDLC workflow: planning, implementation, testing, and deployment. Automates checklist-driven development for features, bug fixes, refactoring, and releases.