A modern, frontend-only GitLab multi-repository merge request management tool with AI-powered code reviews.
- Multi-Repository Management: View and manage merge requests across multiple GitLab repositories in a unified dashboard
- AI Code Reviews: Integrated Google Gemini 2.5 Flash for intelligent code review and analysis
- Modern UI: Built with Vue.js 3 and Vuetify 3 Material Design components
- Real-time Updates: Efficient data fetching with TanStack Vue Query and automatic caching
- Secure: User-provided tokens stored encrypted in browser localStorage
- No Backend Required: Fully frontend-only architecture
- Frontend: Vue.js 3.4+ with Composition API
- UI Framework: Vuetify 3 with Material Design 3 blueprint
- Build Tool: Vite 5+ for fast development and builds
- State Management: Pinia for reactive state management
- Data Fetching: TanStack Vue Query with intelligent caching
- Icons: Material Design Icons (@mdi/font)
- Markdown: Professional rendering with
marked
library - AI Integration: Google Gemini 2.5 Flash Preview for code reviews
- Architecture: Modular service-based architecture with dependency injection
- Node.js 18+
- GitLab Personal Access Token with
api
,read_repository
,write_repository
scopes - Google Gemini API key (optional, for AI reviews)
- Clone the repository:
git clone https://github.com/yourusername/gitlab-merge-fleet.git
cd gitlab-merge-fleet
- Install dependencies:
npm install
- Start development server:
npm run dev
- Open http://localhost:4000 and configure your GitLab token in Settings
npm run build
npm run preview
- Navigate to Settings page in the application
- Add your GitLab base URL:
https://gitlab.example.com
- Provide your GitLab Personal Access Token
- Configure repository filters as needed
- Obtain a Google Gemini API key
- Add it in the Settings page
- AI review functionality will be enabled automatically
The codebase follows a modular, service-based architecture designed for extensibility and maintainability:
- Configuration Layer: Centralized configuration in
src/config/
- Service Layer: Modular, injectable services in
src/services/
- Utility Layer: Core utilities and analyzers in
src/utils/
- API Layer: External integrations in
src/api/
- Component Layer: Vue.js components in
src/components/
andsrc/pages/
All services support constructor-based dependency injection for testing and customization:
const customFileAnalysis = new CustomFileAnalysisService(options)
const analyzer = new RepositoryAnalyzer(options, customFileAnalysis)
src/
├── components/ # Reusable Vue components
│ ├── FilterBar.vue # Advanced filtering interface
│ ├── Layout.vue # Application layout wrapper
│ └── MergeRequestList.vue # MR list display
├── pages/ # Page components
│ ├── Dashboard.vue # Main dashboard
│ ├── Settings.vue # Configuration page
│ └── Setup.vue # Initial setup wizard
├── stores/ # Pinia state stores
│ └── authStore.js # Authentication state
├── config/ # Centralized configuration
│ └── analysis.js # File analysis & filtering config
├── services/ # Modular business logic services
│ ├── fileAnalysis.js # File filtering & prioritization
│ ├── promptBuilder.js # AI prompt generation
│ └── reviewParser.js # AI response parsing
├── api/ # API integration
│ ├── gitlab.js # GitLab API client
│ └── gemini.js # AI review service
├── utils/ # Utility functions
│ ├── repositoryAnalyzer.js # Repository analysis
│ └── dateUtils.js # Date formatting
└── plugins/ # Vue plugins
└── vuetify.js # Vuetify configuration
# Development server (port 4000)
npm run dev
# Production build
npm run build
# Preview production build
npm run preview
# Lint code
npm run lint
- Use Vuetify 3 components exclusively for UI consistency
- Follow Material Design 3 patterns and spacing
- Use Material Design Icons (mdi-*) for all iconography
- Implement proper loading states and error handling
- Test with GitLab Enterprise Edition 14.9.0-ee compatibility
- Follow the modular service architecture for new features
- Use dependency injection for testable, extensible code
- Unified view of merge requests across selected repositories
- Advanced filtering by state, author, labels, and date ranges
- Real-time pipeline status with GitLab 14.9 compatibility
- Sortable columns and pagination
- Complete diff analysis using Google Gemini 2.5 Flash
- Structured markdown output with professional rendering
- One-click posting of reviews as GitLab comments
- Configurable review parameters
- Create multiple merge requests across repositories
- Bulk branch creation with consistent naming
- Template-based MR descriptions
Designed for GitLab Enterprise Edition 14.9.0-ee with:
- Custom pipeline enrichment for older GitLab versions
- Proper handling of EE-specific features (approval rules, weights)
- Efficient API usage with rate limiting considerations
- Personal Access Tokens encrypted using Web Crypto API
- All sensitive data stored locally in browser
- No server-side storage or transmission of credentials
- HTTPS-only communication with GitLab instance
The project includes GitHub Actions workflow for automatic deployment to GitHub Pages:
- Push changes to the
main
branch - GitHub Actions will automatically build and deploy
- Access your deployment at:
https://[username].github.io/GitLab-Merge-Fleet/
For other static hosting services:
npm run build
The built files will be in the dist/
directory and can be served from any web server or CDN.
For manual GitHub Pages deployment:
npm run deploy
.env.example
- Example environment variables
The codebase is designed for extensibility through a modular service architecture. See EXTENSION_POINTS.md
for detailed documentation on:
- Adding new file analysis strategies
- Implementing custom AI prompt builders
- Creating custom review parsers
- Extending the repository analyzer
- Adding new AI providers
- Implementing custom workflows
// Create custom file analysis for React projects
class ReactFileAnalysisService extends FileAnalysisService {
prioritizeFiles(files, languages) {
const prioritized = super.prioritizeFiles(files, languages)
return prioritized.map(file => {
if (file.path.includes('components/') || file.path.includes('hooks/')) {
file.priority += 10 // Boost React-specific files
}
return file
})
}
}
// Use custom service
const customAnalyzer = new RepositoryAnalyzer({}, new ReactFileAnalysisService())
- Create a feature branch from
main
- Make your changes following the development guidelines
- Follow the modular architecture patterns for new features
- Test thoroughly with the development server
- Run
npm run lint
to ensure code quality - Create a merge request with a clear description
For issues and questions:
- Create an issue in the GitLab repository
- Review the CLAUDE.md file for detailed implementation notes
MIT License - see LICENSE file for details.