amjitk/laravel-ai-changelog
Laravel dev package that reads your Git commits and uses Gemini (via hosseinhezami/laravel-gemini) to generate concise, categorized release notes. Prepends new entries to CHANGELOG.md and supports ranges via tags, SHAs, or branch comparisons—ideal for CI/CD.
Installation:
composer require amjitk/laravel-ai-changelog
php artisan vendor:publish --provider="AmjitK\LaravelAiChangelog\ServiceProvider" --tag="config"
config/ai-changelog.php exists and adjust API keys (e.g., OpenAI) if needed.First Use Case:
use AmjitK\LaravelAiChangelog\Facades\AiChangelog;
$entry = AiChangelog::generate([
'commit_message' => 'feat: add user authentication',
'changes' => ['auth system', 'user model'],
]);
## Features\n- Added user authentication system...).Key Files:
config/ai-changelog.php: API keys, default prompts.app/Providers/AiChangelogServiceProvider.php: Override defaults if needed.Automated Changelog Generation:
post-commit) via a custom Artisan command:
// app/Console/Commands/GenerateChangelog.php
public function handle() {
$commits = $this->getRecentCommits(); // Custom logic
foreach ($commits as $commit) {
AiChangelog::generate(['commit_message' => $commit->message]);
}
}
$schedule->command('changelog:generate')->daily();
Integration with GitHub/GitLab:
// routes/web.php
Route::post('/webhooks/changelog', function (Request $request) {
$payload = $request->json()->all();
AiChangelog::generate([
'commit_message' => $payload['pull_request']['title'],
'changes' => $payload['commits'],
]);
});
Custom Prompts:
'prompts' => [
'feature' => 'Generate a concise changelog entry for this feature: {{commit_message}}',
'bugfix' => 'Describe the fix for: {{commit_message}}',
],
AiChangelog::generate(['commit_message' => 'fix: login bug'], ['prompt' => 'bugfix']);
Storage:
$entry = AiChangelog::generate([...]);
file_put_contents(storage_path('app/changelog.md'), $entry, FILE_APPEND);
API Rate Limits:
$entry = AiChangelog::generate([...], ['cache' => true]); // Uses Laravel cache.
Commit Message Parsing:
feat:, fix:).Cost Management:
AiChangelog::generate([...], ['max_tokens' => 100]);
Dependency on External APIs:
try {
AiChangelog::generate([...]);
} catch (\AmjitK\LaravelAiChangelog\Exceptions\ApiException $e) {
// Retry or fallback to manual entry.
}
Testing:
AiChangelog::shouldReceive('callApi')->andReturn('## Test Entry');
Local Development:
null API keys in .env to bypass calls during testing.Extending Functionality:
breaking_changes):
AiChangelog::extendPrompt(function ($prompt, $data) {
return str_replace('{{changes}}', $data['breaking_changes'] ?? '', $prompt);
});
Performance:
$entries = AiChangelog::batchGenerate([$commit1, $commit2]);
Fallback Mechanism:
$entry = AiChangelog::generate([...], ['fallback' => 'Manual entry here.']);
How can I help you explore Laravel packages today?