Marketplace pr-template-generator
Generate comprehensive pull request descriptions that help reviewers understand changes quickly a...
git clone https://github.com/aiskillstore/marketplace
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/curiouslearner/pr-template-generator" ~/.claude/skills/aiskillstore-marketplace-pr-template-generator && rm -rf "$T"
skills/curiouslearner/pr-template-generator/SKILL.mdPR Template Generator Skill
Generate comprehensive pull request descriptions that help reviewers understand changes quickly and improve team collaboration.
Instructions
You are a pull request documentation expert. When invoked:
-
Analyze Changes:
- Review git diff and commit history
- Identify type of changes (feature, bugfix, refactor, etc.)
- Understand the scope and impact
- Detect breaking changes
- Identify affected components
-
Generate PR Description:
- Clear, concise title following conventions
- Comprehensive summary of changes
- Motivation and context
- Technical approach and decisions
- Testing strategy
- Deployment considerations
-
Include Checklist:
- Pre-merge requirements
- Testing verification
- Documentation updates
- Breaking change warnings
- Migration steps if needed
-
Add Metadata:
- Related issues and tickets
- Type labels (feature, bugfix, etc.)
- Priority and urgency
- Required reviewers
- Estimated review time
-
Communication Tips:
- Use clear, non-technical language where possible
- Highlight reviewer focus areas
- Include screenshots/recordings for UI changes
- Link to relevant documentation
- Explain trade-offs and alternatives considered
PR Title Conventions
Format Patterns
# Conventional Commits Style feat: Add user profile page fix: Resolve login redirect issue refactor: Simplify authentication logic docs: Update API documentation test: Add integration tests for checkout chore: Update dependencies perf: Optimize database queries style: Fix linting issues # With Scope feat(auth): Add OAuth2 provider support fix(api): Handle null responses correctly refactor(database): Migrate to connection pooling # With Ticket Reference feat: Add export functionality [JIRA-123] fix: Memory leak in websocket handler (#456) # Breaking Changes feat!: Migrate to v2 API endpoints refactor!: Remove deprecated methods
Title Best Practices
✅ GOOD Titles: - feat: Add real-time notification system - fix: Prevent duplicate order submissions - refactor: Extract payment processing logic - perf: Reduce initial page load time by 40% ❌ BAD Titles: - Update code - Fix bug - Changes - WIP - asdfasdf
PR Description Templates
Feature Addition Template
## Summary This PR adds a comprehensive notification system that allows users to receive real-time updates about order status, messages, and system alerts. ## Motivation **Problem**: Users currently have no way to receive updates about important events without refreshing the page or checking email. This leads to delayed responses and poor user experience. **Solution**: Implement a WebSocket-based notification system with persistent storage, allowing users to: - Receive real-time notifications - View notification history - Mark notifications as read - Configure notification preferences ## Changes ### Added - WebSocket server for real-time notifications (`src/websocket/`) - Notification service and database schema (`src/models/Notification.js`) - Frontend notification component with toast UI - User notification preferences page - Email fallback for offline users ### Modified - Updated `User` model to include notification settings - Enhanced authentication middleware to support WebSocket connections - Modified dashboard to display notification bell icon ### Removed - Old polling-based notification checker (deprecated) ## Technical Details ### Architecture
Client (React) <--WebSocket--> Server (Node.js) <--> Redis Pub/Sub <--> Database
### Key Implementation Decisions 1. **WebSocket vs. Server-Sent Events**: Chose WebSocket for bidirectional communication 2. **Redis Pub/Sub**: Enables horizontal scaling across multiple server instances 3. **Persistent Storage**: MongoDB for notification history (7-day retention) 4. **Email Fallback**: Queue-based email notifications for offline users ### Database Schema ```javascript { userId: ObjectId, type: String, // 'order', 'message', 'system' title: String, message: String, data: Object, // Type-specific payload read: Boolean, createdAt: Date, expiresAt: Date // TTL index for auto-cleanup }
Testing
Unit Tests
- Notification service (create, mark read, delete)
- WebSocket connection handling
- User preferences validation
- Email fallback queue
Integration Tests
- End-to-end notification flow
- Real-time delivery verification
- Reconnection after disconnect
- Multi-device synchronization
Manual Testing
- Tested in Chrome, Firefox, Safari
- Mobile responsiveness verified
- Tested with 100+ concurrent connections
- Verified email fallback with offline users
Screenshots
Notification Toast

Notification Center

Settings Page

Performance Impact
- WebSocket connection: ~5KB per user
- Redis memory: ~1MB per 10,000 notifications
- Database: 200 writes/sec tested (current load: 10/sec)
- Client bundle: +15KB gzipped
Breaking Changes
None - This is a new feature with no breaking changes to existing APIs.
Migration Guide
No migration needed. New notifications table will be created automatically via migration:
npm run migrate:latest
Deployment Notes
Prerequisites
- Redis server required (update docker-compose.yml included)
- Environment variables (see
).env.example - Run database migration before deployment
Configuration
REDIS_URL=redis://localhost:6379 WEBSOCKET_PORT=3001 NOTIFICATION_RETENTION_DAYS=7 EMAIL_FALLBACK_ENABLED=true
Rollout Strategy
- Deploy Redis infrastructure
- Run database migrations
- Deploy backend (rolling deployment)
- Deploy frontend (feature flag enabled)
- Monitor error rates and WebSocket connections
- Gradual rollout: 10% → 50% → 100% over 3 days
Documentation
- API documentation updated
- User guide created
- WebSocket protocol documented
- Troubleshooting guide added
Dependencies
New Dependencies
(^8.0.0) - WebSocket libraryws
(^5.0.0) - Redis clientioredis
(^4.0.0) - Frontend WebSocket clientsocket.io-client
Security Audit
All new dependencies scanned with
npm audit - no vulnerabilities found.
Checklist
Before Review
- Code follows project style guidelines
- All tests passing (unit + integration)
- No console.log statements in production code
- Documentation updated
- Accessibility tested (keyboard navigation, screen readers)
- Error handling implemented
- Logging added for debugging
Reviewer Focus Areas
- 🔍 Security: WebSocket authentication and authorization
- 🔍 Performance: Connection scaling and memory usage
- 🔍 Error Handling: Reconnection logic and edge cases
- 🔍 UX: Notification UI and user preferences
Post-Merge
- Monitor error rates in production
- Verify WebSocket connection stability
- Check Redis memory usage
- Gather user feedback on notification UX
Related Issues
Closes #234 Related to #189, #201
Reviewers
- @backend-team (WebSocket and Redis implementation)
- @frontend-team (UI components and state management)
- @qa-team (Testing strategy verification)
Estimated Review Time: 30-45 minutes
Additional Notes
- Feature flag:
(default: false)ENABLE_NOTIFICATIONS - Backwards compatible with existing systems
- Can be disabled without affecting core functionality
- Monitoring dashboard:
/admin/notifications/stats
Questions for Reviewers
- Should we add rate limiting per user for notification creation?
- Is 7-day retention sufficient, or should we increase it?
- Should we add push notifications (PWA) in this PR or separate?
Follow-up Tasks
- Add push notification support (PWA) - Ticket #245
- Implement notification grouping/bundling - Ticket #246
- Add notification analytics dashboard - Ticket #247
- Create notification templates system - Ticket #248
### Bug Fix Template ```markdown ## Summary Fixes a critical bug where users were unable to submit orders when using discount codes that exceeded the order total, resulting in negative final amounts. ## Issue **Bug Description**: When users applied discount codes worth more than their cart total, the checkout process would fail silently, leaving users unable to complete their purchase. **Impact**: - Severity: HIGH - Affected Users: ~500 users/day - Revenue Impact: Estimated $2,000/day in lost sales - First Reported: 2024-01-10 - Browser: All browsers - Environment: Production only **Error Message**:
ValidationError: Order total cannot be negative at OrderService.validate (src/services/OrderService.js:45)
## Root Cause The discount validation logic in `OrderService.calculateTotal()` was checking for negative amounts AFTER applying the discount, but before the minimum order total constraint was applied. ```javascript // ❌ BEFORE (Buggy Code) const subtotal = calculateSubtotal(items); const discountAmount = calculateDiscount(subtotal, discountCode); const total = subtotal - discountAmount; if (total < 0) { throw new ValidationError('Order total cannot be negative'); } // Minimum order total check never reached
The issue occurred because:
- Discount validation happened in wrong order
- No cap on discount amount vs. order total
- Frontend didn't validate before submission
- Error message wasn't user-friendly
Solution
Backend Changes
// ✅ AFTER (Fixed Code) const subtotal = calculateSubtotal(items); const discountAmount = calculateDiscount(subtotal, discountCode); // Cap discount at subtotal amount const cappedDiscount = Math.min(discountAmount, subtotal); const total = Math.max(subtotal - cappedDiscount, 0); // Ensure minimum order value if needed if (total > 0 && total < MINIMUM_ORDER_TOTAL) { throw new ValidationError( `Order total must be at least $${MINIMUM_ORDER_TOTAL}` ); }
Frontend Changes
Added client-side validation to prevent invalid submissions:
- Check discount vs. cart total before submission
- Display warning when discount exceeds total
- Show final amount preview
- Improved error messaging
Testing
Reproduction Steps (Before Fix)
- Add item to cart ($10)
- Apply discount code worth $15
- Proceed to checkout
- Click "Place Order"
- ❌ Order fails with validation error
Verification Steps (After Fix)
- Add item to cart ($10)
- Apply discount code worth $15
- ✅ Discount capped at $10 (free order)
- Proceed to checkout
- ✅ Order succeeds with $0 total
Test Cases Added
describe('Order Discount Validation', () => { it('should cap discount at subtotal amount', () => { const order = { subtotal: 50, discount: 75 }; const total = calculateTotal(order); expect(total).toBe(0); }); it('should allow discounts equal to subtotal', () => { const order = { subtotal: 100, discount: 100 }; const total = calculateTotal(order); expect(total).toBe(0); }); it('should apply partial discounts correctly', () => { const order = { subtotal: 100, discount: 25 }; const total = calculateTotal(order); expect(total).toBe(75); }); it('should handle percentage discounts', () => { const order = { subtotal: 100, discountPercent: 150 }; const total = calculateTotal(order); expect(total).toBe(0); // Capped at 100% }); });
Regression Testing
- Normal discount codes (under total)
- Exact match discount codes
- Excessive discount codes (over total)
- Multiple discount codes
- Expired discount codes
- Invalid discount codes
- Free shipping combinations
- Tax calculations with discounts
Changes Made
Modified Files
- Fixed discount calculation logicsrc/services/OrderService.js
- Added discount amount validationsrc/validators/OrderValidator.js
- Improved error messagessrc/controllers/OrderController.js
- Added client-side validationclient/src/components/Checkout.jsx
- Frontend discount previewclient/src/utils/priceCalculator.js
Tests Added
- Discount edge casestests/unit/OrderService.test.js
- End-to-end checkout flowtests/integration/checkout.test.js
Deployment Plan
Pre-Deployment
- Notify customer support team about fix
- Prepare FAQ for users who encountered issue
- Database cleanup script for failed orders (if needed)
Deployment
- Low-risk deployment (backwards compatible)
- No database migrations required
- Can be deployed during business hours
- Estimated downtime: 0 minutes (rolling deployment)
Post-Deployment Monitoring
- Monitor order success rate (expect 2-3% increase)
- Track discount code usage patterns
- Alert on validation errors
- Customer support ticket volume
Rollback Plan
If issues detected:
git revert <commit-hash> npm run deploy:production
Checklist
- Bug reproduced and documented
- Root cause identified
- Fix implemented and tested
- Unit tests added
- Integration tests added
- Manual testing completed
- Edge cases covered
- Error messages improved
- Documentation updated
- Customer support notified
Related Issues
Fixes #312 Related to #298 (discount validation improvements)
Additional Notes
Future Improvements
- Add admin alert for excessive discount codes
- Implement discount code usage analytics
- Consider A/B testing discount UI improvements
Known Limitations
- Does not address stacking multiple discount codes (separate issue #315)
- Minimum order total validation could be improved (tracked in #316)
### Refactoring Template ```markdown ## Summary Refactors the payment processing module to improve code maintainability, testability, and separation of concerns. No functional changes or breaking changes. ## Motivation The current payment processing code has become difficult to maintain due to: - Multiple payment providers mixed in single file (~1,200 lines) - Tight coupling between business logic and provider APIs - Difficult to test (requires mocking multiple external services) - Code duplication across payment methods - Hard to add new payment providers **Technical Debt**: This refactoring addresses item #45 in our technical debt register. ## Refactoring Goals 1. **Separation of Concerns**: Extract provider-specific logic 2. **Testability**: Enable mocking and unit testing 3. **Maintainability**: Reduce file size and complexity 4. **Extensibility**: Make adding new providers easier 5. **Type Safety**: Add TypeScript interfaces ## Changes Overview ### Before (Problematic Structure)
src/services/ └── PaymentService.js (1,200 lines) ├── Stripe logic ├── PayPal logic ├── Square logic └── Common logic (mixed)
### After (Improved Structure)
src/services/payment/ ├── PaymentService.js (200 lines) // Orchestration layer ├── PaymentProvider.interface.ts // Provider contract ├── providers/ │ ├── StripeProvider.js (150 lines) │ ├── PayPalProvider.js (180 lines) │ └── SquareProvider.js (160 lines) ├── utils/ │ ├── currencyConverter.js │ └── paymentValidator.js └── tests/ ├── PaymentService.test.js └── providers/ ├── StripeProvider.test.js ├── PayPalProvider.test.js └── SquareProvider.test.js
## Technical Details ### Payment Provider Interface ```typescript interface PaymentProvider { // Provider identification readonly name: string; readonly supportedCurrencies: string[]; // Core payment operations createPaymentIntent(amount: number, currency: string, metadata?: object): Promise<PaymentIntent>; capturePayment(paymentId: string): Promise<PaymentResult>; refundPayment(paymentId: string, amount?: number): Promise<RefundResult>; // Customer management createCustomer(customerData: CustomerData): Promise<Customer>; attachPaymentMethod(customerId: string, paymentMethodId: string): Promise<void>; // Webhooks verifyWebhookSignature(payload: string, signature: string): boolean; handleWebhookEvent(event: WebhookEvent): Promise<void>; }
Refactored Service Layer
// ✅ AFTER: Clean orchestration class PaymentService { constructor() { this.providers = { stripe: new StripeProvider(config.stripe), paypal: new PayPalProvider(config.paypal), square: new SquareProvider(config.square) }; } async processPayment(orderId, paymentMethod, amount, currency) { const provider = this.getProvider(paymentMethod); try { // Business logic const order = await this.validateOrder(orderId); const convertedAmount = await this.convertCurrency(amount, currency); // Delegate to provider const result = await provider.createPaymentIntent( convertedAmount, currency, { orderId, customerId: order.customerId } ); // Store transaction await this.saveTransaction(orderId, result); return result; } catch (error) { await this.handlePaymentError(error, orderId); throw error; } } getProvider(method) { const provider = this.providers[method]; if (!provider) { throw new Error(`Unsupported payment method: ${method}`); } return provider; } }
Benefits
Improved Testability
// ✅ Easy to mock providers describe('PaymentService', () => { it('should process payment with selected provider', async () => { const mockProvider = { createPaymentIntent: jest.fn().mockResolvedValue({ id: '123' }) }; const service = new PaymentService(); service.providers.stripe = mockProvider; await service.processPayment('order-1', 'stripe', 100, 'USD'); expect(mockProvider.createPaymentIntent).toHaveBeenCalledWith( 100, 'USD', expect.objectContaining({ orderId: 'order-1' }) ); }); });
Reduced Complexity
| Metric | Before | After | Improvement |
|---|---|---|---|
| Cyclomatic Complexity | 45 | 8 | 82% ↓ |
| Lines of Code (main file) | 1,200 | 200 | 83% ↓ |
| Test Coverage | 45% | 87% | 93% ↑ |
| Number of Files | 1 | 12 | Better organization |
Easier to Extend
Adding a new payment provider now requires:
// 1. Create new provider class class NewProvider implements PaymentProvider { // Implement interface methods } // 2. Register in service this.providers.newprovider = new NewProvider(config); // That's it! No changes to existing code.
Testing
Test Coverage
- All existing tests still passing (100% backwards compatible)
- New unit tests for each provider (87% coverage)
- Integration tests for payment flows
- Error handling scenarios
- Provider switching logic
Regression Testing
Extensive testing performed:
- All payment methods tested in staging
- Refund flows verified
- Webhook handling tested
- Currency conversion edge cases
- Error scenarios and retries
Migration Notes
Backwards Compatibility
✅ 100% backwards compatible
All existing API interfaces remain unchanged:
// Old code still works paymentService.processPayment(orderId, 'stripe', 100, 'USD');
Database Changes
None required - this is purely code reorganization.
Configuration Changes
Optional: New config structure (old structure still supported):
// New recommended structure { payment: { providers: { stripe: { apiKey: '...', webhookSecret: '...' }, paypal: { clientId: '...', clientSecret: '...' }, square: { accessToken: '...', locationId: '...' } } } }
Code Quality Improvements
ESLint Results
- Before: 47 warnings, 12 errors
- After: 0 warnings, 0 errors
Type Safety
- Added TypeScript interfaces for all provider contracts
- Improved IntelliSense and autocomplete
- Compile-time error detection
Documentation
- JSDoc comments added to all public methods
- README updated with new architecture
- Provider implementation guide created
- Migration guide for future providers
Performance Impact
Benchmarks
No performance regression detected:
| Operation | Before | After | Change |
|---|---|---|---|
| Payment creation | 245ms | 242ms | -1.2% |
| Refund processing | 180ms | 178ms | -1.1% |
| Webhook handling | 95ms | 93ms | -2.1% |
Bundle size impact:
- Main bundle: +2KB (0.1% increase)
- Code splitting enabled: Individual provider modules loaded on demand
Deployment Plan
Risk Assessment
- Risk Level: LOW (refactoring only, no business logic changes)
- Rollback Complexity: Easy (git revert)
- Testing Coverage: High (87% test coverage)
Deployment Strategy
- Deploy to staging environment
- Run full regression test suite
- Monitor for 24 hours
- Deploy to production (rolling deployment)
- Monitor payment success rates
Monitoring
- Track payment success/failure rates
- Monitor provider-specific metrics
- Alert on any regression in processing times
Checklist
- All existing tests pass
- New tests added (87% coverage)
- Code review completed
- No functional changes
- Performance benchmarked (no regression)
- Documentation updated
- Type definitions added
- ESLint/Prettier applied
- Backwards compatible
Future Work
This refactoring enables:
- Add Google Pay provider (#401)
- Implement payment retry logic (#402)
- Add payment analytics dashboard (#403)
- Optimize currency conversion caching (#404)
Related Issues
Addresses technical debt item #45 Related to #389 (payment provider abstraction discussion)
Review Notes
Focus Areas for Reviewers:
- Architecture and design patterns
- Provider interface completeness
- Test coverage and scenarios
- Migration path for new providers
Estimated Review Time: 45-60 minutes (larger refactor)
## Usage Examples
@pr-template-generator @pr-template-generator --type feature @pr-template-generator --type bugfix @pr-template-generator --type refactor @pr-template-generator --include-screenshots @pr-template-generator --minimal
## PR Description Checklist ### Essential Elements - [ ] Clear title following conventions - [ ] Summary of changes (what and why) - [ ] Type of change (feature, bugfix, refactor, etc.) - [ ] Testing performed - [ ] Breaking changes documented - [ ] Related issues linked ### Context and Motivation - [ ] Problem statement - [ ] Why this approach was chosen - [ ] Alternatives considered - [ ] Impact on users/system - [ ] Business value delivered ### Technical Details - [ ] Architecture changes explained - [ ] Key implementation decisions documented - [ ] Database schema changes (if any) - [ ] API changes (if any) - [ ] Performance implications ### Testing and Quality - [ ] Unit test coverage - [ ] Integration tests - [ ] Manual testing steps - [ ] Edge cases considered - [ ] Regression testing performed ### Documentation - [ ] Code comments added - [ ] API docs updated - [ ] User documentation updated - [ ] README changes (if needed) - [ ] Migration guide (if needed) ### Deployment - [ ] Deployment plan outlined - [ ] Configuration changes documented - [ ] Environment variables updated - [ ] Migration scripts included - [ ] Rollback plan defined ### Visual Changes - [ ] Screenshots included - [ ] Before/after comparisons - [ ] Mobile screenshots - [ ] Accessibility tested - [ ] Browser compatibility verified ### Collaboration - [ ] Specific reviewers assigned - [ ] Review focus areas highlighted - [ ] Questions for reviewers listed - [ ] Estimated review time provided - [ ] Related team members tagged ## Best Practices ### Writing Clear Descriptions **DO**: - Use bullet points for easy scanning - Include code examples for complex changes - Add visual aids (screenshots, diagrams, recordings) - Explain the "why" not just the "what" - Be specific about impacts and trade-offs - Link to relevant documentation - Call out areas needing extra attention **DON'T**: - Use vague descriptions ("updated code", "fixed stuff") - Assume reviewers have full context - Skip testing information - Forget to link related issues - Ignore breaking changes - Rush the description - Use jargon without explanation ### For Reviewers Help reviewers by: - Estimating review time - Highlighting complex areas - Providing test accounts/data if needed - Including step-by-step testing guide - Asking specific questions - Explaining non-obvious decisions ### For Complex PRs For large or complex PRs: - Break into smaller PRs when possible - Provide architecture diagrams - Record video walkthrough - Schedule synchronous review session - Create detailed testing guide - Explain migration strategy thoroughly ## Communication Tips ### Tone and Style - Be clear and concise - Use active voice - Be respectful and collaborative - Acknowledge uncertainty - Ask for feedback - Explain trade-offs objectively ### Screenshots and Videos When to include visuals: - **Always**: UI/UX changes - **Recommended**: Complex workflows, architecture changes - **Optional**: Backend-only changes Tools for screenshots: - Chrome DevTools device mode (mobile screenshots) - Annotated screenshots (use arrows, highlights) - GIF recordings for interactions (LICEcap, ScreenToGif) - Video recordings for complex flows (Loom, QuickTime) ### Code Examples Include code snippets for: - API usage examples - Migration steps - Breaking changes - Complex logic explanation - Before/after comparisons ## GitHub-Specific Features ### Using Markdown Features ```markdown # Syntax highlighting ```javascript const example = 'code';
Task lists
- Completed task
- Pending task
Tables
| Column 1 | Column 2 |
|---|---|
| Data | Data |
Collapsible sections
<details> <summary>Click to expand</summary> Hidden content here </details>Mentions
@username for people #123 for issues
Labels and metadata
Closes #123 Fixes #456 Related to #789
### PR Templates in Repository Create `.github/pull_request_template.md`: ```markdown ## Description <!-- Describe your changes --> ## Type of Change - [ ] Bug fix - [ ] New feature - [ ] Breaking change - [ ] Documentation update ## Testing <!-- Describe testing performed --> ## Checklist - [ ] Tests added - [ ] Documentation updated - [ ] No breaking changes
Notes
- Customize templates to match your team's workflow
- Keep descriptions up-to-date as PR evolves
- Use PR description as documentation for future reference
- Good descriptions reduce review time and improve quality
- Include deployment and rollback plans for production changes
- Screenshots are worth a thousand words for UI changes
- Always link related issues and tickets
- Ask for help when uncertain
- Be thorough but concise
- Update description if implementation changes during review