Feature Wrap-Up with Pull Request

VerifiedCaution

Finalizes feature development by squashing commits, generating PR description, and creating pull request after test validation.

Sby Skills Guide Bot
DevOpsIntermediate
3/4/2026
Claude CodeCursor
#git#pull-request#commit-squash#github-cli#code-review

Recommended for

Automated summary

Automates feature wrap-up: validating the Git environment, running tests, squashing commits, and creating a GitHub pull request using Specimin plan context.

Strengths

  • Chains a complete ordered flow: Git checks, tests, change review, squash, then PR creation
  • Builds the commit message and PR description from the project's spec.md, plan.md, and implementation.md files
  • Fails fast on a dirty working tree, the main branch, no commits ahead, or failing tests
  • Asks for explicit confirmation before squashing and shows the commit history plus changed files

Limitations

  • Tightly coupled to the .specimin/plans/{branch}/ layout and exits if the project was not initialized with /init
  • Targets GitHub only through the gh CLI (install and auth required), not GitLab or Bitbucket
  • Assumes a detectable main or master branch and describes no merge-conflict handling
When to use it

Use it after a feature is implemented, tested, and committed, when you want a clean single-commit history and an open PR ready for review.

When not to use it

Don't invoke it mid-development, from the main branch, while tests are still failing, or in a repo that has not been set up for Specimin.

Security analysis

Caution
Quality score80/100

The skill uses powerful tools (git history rewriting, arbitrary test execution, and GitHub CLI PR creation) but each for an explicitly stated, legitimate purpose and gated behind a user confirmation prompt before the destructive-ish squash step. There is no obfuscation, no curl|sh, no secret/token exfiltration, and no attempt to disable safety. The main residual risks are executing repo-defined test commands and irreversible-ish history squashing, both typical for a wrap-up workflow, so it fits 'caution' rather than 'risky'.

Findings
  • •Executes arbitrary repository test commands (e.g., `npm test`, `pytest`, `make test`) detected from the repo, which run project-supplied scripts/code
  • •Rewrites local git history with `git reset --soft {MAIN_BRANCH}` followed by a new commit (recoverable via reflog, but history-altering)
  • •Creates a remote pull request and may trigger a push via `gh pr create`, modifying server-side state on the user's GitHub repo
  • •Uses `run_terminal_cmd` broadly across stages; no allowlisting or dry-run mode for the squash/PR steps
How this analysis is made

Examples

Wrap up and open PR
The feature is done — wrap it up: run the tests, squash my commits into one, and open a pull request for review.
Prepare branch for review
Prepare this branch for code review with gh, using the spec and plan in .specimin to write the PR description.
Clean history before PR
Squash all my commits since main into a single conventional commit and create the pull request.

name: "specimin-wrap" description: "Squash commits and create a pull request after feature implementation is complete. Only invoke when user explicitly requests to wrap up, create a PR, prepare for review, or finish the feature." allowed-tools:

  • run_terminal_cmd
  • read_file

Feature Wrap-Up Command

Prepare completed work for code review: squash commits, generate PR description, create pull request.

Stage 1: Validate Environment

Actions:

  1. Check uncommitted changes: git status
  2. Get current branch: git rev-parse --abbrev-ref HEAD → store as CURRENT_BRANCH
  3. Detect main branch (try in order):
    git show-ref --verify --quiet refs/heads/main && echo "main" || \
    git show-ref --verify --quiet refs/heads/master && echo "master" || \
    echo "unknown"
    
    Store as MAIN_BRANCH. If "unknown", ask user: "What is your main branch name?"
  4. Verify branch is not main: If CURRENT_BRANCH == MAIN_BRANCH, error and exit
  5. Check initialization: Verify .specimin/plans/{CURRENT_BRANCH}/ exists
  6. Read feature context (for PR description generation):
    • .specimin/plans/{CURRENT_BRANCH}/spec.md
    • .specimin/plans/{CURRENT_BRANCH}/plan.md
    • .specimin/plans/{CURRENT_BRANCH}/implementation.md

Context Extraction Goals (from spec/plan):

  • Feature objective (1-2 sentence summary)
  • High-level changes by phase/component
  • Acceptance criteria
  • Testing approach

Error Handling:

  • Uncommitted changes: Warning: Uncommitted changes detected. Commit or stash before wrapping up. → Exit
  • On main branch: Error: Cannot wrap up main branch. Switch to feature branch first. → Exit
  • Not initialized: Error: Specimin not initialized. Run /init first. → Exit
  • No commits ahead: Error: No commits to squash. Branch up to date with {MAIN_BRANCH}. → Exit
  • gh not installed: Error: GitHub CLI not installed. Install: https://cli.github.com/ → Exit
  • Not authenticated: Error: Not authenticated with GitHub CLI. Run: gh auth login → Exit

Checkpoint: Verify environment valid (no uncommitted changes, on feature branch, has commits to squash) before proceeding.

Stage 2: Run Tests

Actions:

  1. Detect test framework and run appropriate test command:

    • Python: python3 -m pytest or pytest
    • JavaScript/TypeScript: npm test or yarn test
    • Ruby: bundle exec rspec or rake test
    • Go: go test ./...
    • Rust: cargo test
    • Java: mvn test or gradle test
    • Other: Check for Makefile with test target, or ask user
  2. Run tests and capture output

  3. Error Handling:

    • Tests fail: Display failure summary and exit with message:
      ✗ Tests failed. Fix failing tests before wrapping up.
      
      {test failure summary}
      
      Run tests again after fixes and retry wrap.
      
    • Tests pass: Proceed to next stage
    • No tests found: Warn user but continue:
      ⚠ No tests detected. Consider adding tests before creating PR.
      Proceed anyway? (yes/no)
      

Checkpoint: Verify all tests pass before proceeding to review changes.

Stage 3: Review Changes

Show user what will be squashed:

  1. Commit history:

    git log {MAIN_BRANCH}..HEAD --oneline
    
  2. Change summary:

    git diff {MAIN_BRANCH}...HEAD --stat
    
  3. Files changed:

    git diff {MAIN_BRANCH}...HEAD --name-only
    

Present:

I'll squash these commits into one:

[commit history]

Files changed:
[file list]

Proceed with squash and PR creation? (yes/no)

Wait for confirmation. If "no", exit gracefully.

Stage 4: Squash Commits

Once confirmed:

  1. Generate commit message:

    • Use feature objective from spec.md
    • Summarize WHAT changed (not HOW)
    • 1-2 sentences max
    • Follow conventional commits: feat:, fix:, refactor:, docs:
  2. Perform squash:

    git reset --soft {MAIN_BRANCH}
    git commit -m "{COMMIT_MESSAGE}"
    

    CRITICAL: No --author, no Co-Authored-By:, no co-authoring metadata. User authorship only.

  3. Verify squash:

    git log --oneline -1
    

    Confirm only one commit since main branch.

Checkpoint: Verify squash succeeded (single commit, correct message) before creating PR.

Stage 5: Create Pull Request

  1. Generate PR title:

    • Use commit message or feature name from spec
    • Under 72 characters
    • Clear and descriptive
  2. Generate PR description (use template below with extracted context):

## Summary

{1-2 sentence feature objective from spec.md}

## Changes

{Bulleted list of high-level changes from plan.md phases or implementation.md completed tasks}

## Testing

{Testing approach from plan.md, or manual test scenarios}

## Acceptance Criteria

{Criteria from spec.md}
  1. Create PR:

    gh pr create --title "{PR_TITLE}" --body "$(cat <<'EOF'
    {PR_DESCRIPTION}
    EOF
    )"
    
  2. Display result:

    ✓ Squashed {N} commits into 1 commit
    ✓ Created pull request: {PR_URL}
    
    Your feature is ready for review!
    

No upstream remote: gh pr create will prompt to push if needed.

Complete Examples

Example 1: Simple CRUD Feature

Spec objective: "Add user profile management allowing users to update their name and email"

Commit message:

feat: add user profile management with update functionality

PR title:

feat: add user profile management

PR description:

## Summary

Add user profile management allowing users to update their name and email through a settings page.

## Changes

- Added User schema with name and email fields
- Implemented update_user/2 function with validation
- Created ProfileLive page with edit form
- Added integration tests for profile updates

## Testing

- Unit tests: Accounts.update_user/2 with valid/invalid inputs
- Integration tests: ProfileLive form submission and validation errors
- Manual: Navigate to /profile, update name/email, verify saved

## Acceptance Criteria

- [x] Users can view current profile information
- [x] Users can update name and email
- [x] Invalid emails show validation errors
- [x] Changes persist after page refresh

Example 2: Complex Integration Feature

Spec objective: "Integrate Stripe payment processing with retry logic and webhook handling for subscription management"

Commit message:

feat: integrate Stripe payment processing with webhook support

PR title:

feat: integrate Stripe payment processing

PR description:

## Summary

Integrate Stripe payment processing with automatic retry logic for failed charges and webhook handlers for subscription lifecycle events.

## Changes

- Added Stripe client module with exponential backoff retry logic
- Implemented payment processing functions (create_charge, refund_charge)
- Created webhook handler for subscription events (created, updated, canceled)
- Added Payment schema and database migrations
- Implemented error handling for network failures and invalid cards

## Testing

- Unit tests: StripeClient module with mocked HTTP responses
- Integration tests: Payment creation flow with test API keys
- Webhook tests: Event handling for all subscription states
- Manual: Create test charge in Stripe dashboard, verify webhook receipt

## Acceptance Criteria

- [x] Charges created successfully with valid cards
- [x] Network failures retry up to 3 times with backoff
- [x] Invalid cards return clear error messages
- [x] Webhooks update subscription status in database
- [x] Payment history visible to users

Note: This prompt optimized using research-backed principles: token efficiency (-30%), verification checkpoints (Reflexion 91%), consolidated examples (2-5 optimal), explicit context extraction (CGRAG 4x improvement), and minimal preamble (GPT-5-Codex guidance).

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/feature-wrap-up-with-pull-request-mmbizjr5/download' --output '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md.part' && mv '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md.part' '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md' && test -s '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/specimin-wrap' && cp -R '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5' '.claude/skills/specimin-wrap'

Cursor
test -f '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md' && test -s '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/specimin-wrap' && cp -R '.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5' '.cursor/skills/specimin-wrap'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5'

openskills read 'feature-wrap-up-with-pull-request-mmbizjr5'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/feature-wrap-up-with-pull-request-mmbizjr5/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills