8000 GitHub - stacksjs/logsmith: πŸ“ Forge beautiful changelogs from your commits.
[go: up one dir, main page]

Skip to content

stacksjs/logsmith

Social Card of this repo

npm version GitHub Actions Commitizen friendly

Logsmith

Forge beautiful changelogs automatically from conventional commits.

Features

  • πŸš€ Automatic changelog generation from conventional commits
  • 🎨 Beautiful formatting with emojis and proper grouping
  • πŸ”„ Multiple output formats - Markdown, JSON, and HTML
  • πŸ“Š Repository statistics with comprehensive trend analysis
  • βš™οΈ Highly configurable with TypeScript config files
  • πŸ”§ CLI and programmatic API for all use cases
  • πŸ“ Conventional commits parsing and analysis
  • πŸ‘₯ Author filtering and management
  • πŸ”— Git repository integration with compare URLs
  • 🌍 Multi-repository support

Quick Start

CLI Usage

Generate a changelog and display in console:

logsmith
```text

Generate a changelog and save to CHANGELOG.md:

```bash
logsmith --output CHANGELOG.md
```text

Generate changelog from specific commit range:

```bash
logsmith --from v1.0.0 --to HEAD
```typescript

Generate changelog in different formats:

```bash
# JSON format
logsmith --format json --output changelog.json

# HTML format
logsmith --format html --output changelog.html

# Auto-detect format from file extension
logsmith --output changelog.json  # Automatically uses JSON format
logsmith --output changelog.html  # Automatically uses HTML format
```text

### Programmatic Usage

```typescript
import { generateChangelog } from 'logsmith'

// Generate changelog
const result = await generateChangelog({
  dir: process.cwd(),
  from: 'v1.0.0',
  to: 'HEAD',
  output: 'CHANGELOG.md',
  verbose: true,
  // ... other options
})

console.log(result.content) // Changelog content
console.log(result.outputPath) // Path where changelog was written
```text

## CLI Commands

### Main Command

```bash
logsmith [options]
```text

**Core Options:**

- `--from <ref>` - Start commit reference (default: latest git tag)
- `--to <ref>` - End commit reference (default: HEAD)
- `--dir <dir>` - Path to git repository (default: current directory)
- `--output <file>` - Changelog file name (default: CHANGELOG.md)
- `--format <format>` - Output format: markdown, json, html (default: markdown)
- `--no-output` - Write to console only
- `--verbose` - Enable verbose logging

**Author Filtering:**

- `--exclude-authors <authors>` - Skip contributors (comma-separated)
- `--include-authors <authors>` - Include only specific contributors (comma-separated)
- `--hide-author-email` - Do not include author email in changelog

**Advanced Filtering:**

- `--exclude-types <types>` - Exclude commit types (comma-separated)
- `--include-types <types>` - Include only specific commit types (comma-separated)
- `--exclude-scopes <scopes>` - Exclude commit scopes (comma-separated)
- `--include-scopes <scopes>` - Include only specific commit scopes (comma-separated)
- `--min-commits <number>` - Minimum commits required to include a section
- `--max-commits <number>` - Maximum commits per section (0 = unlimited)
- `--max-length <number>` - Maximum description length (0 = unlimited)

**Formatting Options:**

- `--no-dates` - Hide dates from changelog
- `--no-breaking-group` - Don't group breaking changes separately
- `--include-body` - Include commit body in changelog entries
- `--no-linkify` - Don't linkify issues and PRs

### Repository Statistics

```bash
logsmith stats [options]
```text

Analyze your repository and display comprehensive statistics with trend analysis.

**Options:**

- `--from <ref>` - Start commit reference (default: latest git tag)
- `--to <ref>` - End commit reference (default: HEAD)
- `--dir <dir>` - Path to git repository (default: current directory)
- `--json` - Output in JSON format
- `--verbose` - Enable verbose logging

**Example Output:**

```text
πŸ“Š Repository Statistics
─────────────────────────
Range: v1.0.0 β†’ HEAD
Total commits: 127
Contributors: 8
Breaking changes: 3

πŸ“ˆ Commit Frequency
───────────────────
Total days with commits: 45
Average commits per day: 2.82
Peak day: 2024-03-15 (12 commits)
Recent activity:
  2024-03-20: β–ˆβ–ˆβ–ˆβ–ˆ 4
  2024-03-19: β–ˆβ–ˆ 2
  2024-03-18: β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 6

πŸ‘₯ Contributors
──────────────
Most active: John Doe (42 commits)
New contributors: 3
Top contributors:
  John Doe: 42 commits (33.1%)
  Jane Smith: 28 commits (22.0%)
  Bob Johnson: 19 commits (15.0%)

πŸ“‹ Commit Types
──────────────
Most common: feat (35.4%)
Least common: revert (0.8%)
Distribution:
  feat      : β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 35.4% (45)
  fix       : β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 24.4% (31)
  docs      : β–ˆβ–ˆ 11.8% (15)
  refactor  : β–ˆβ–ˆ 9.4% (12)

Configuration

Logsmith can be configured using a logsmith.config.ts file:

import { defineConfig } from 'logsmith'

export default defineConfig({
  output: 'CHANGELOG.md',

  // Changelog options
  hideAuthorEmail: false,
  excludeAuthors: ['dependabot[bot]', 'github-actions[bot]'],

  // Templates and formatting
  templates: {
    commitFormat: '- {{scope}}{{description}} ([{{hash}}]({{repoUrl}}/commit/{{hash}}))',
    typeFormat: {
      feat: 'πŸš€ Features',
      fix: 'πŸ› Bug Fixes',
      docs: 'πŸ“š Documentation',
      // ... customize as needed
    },
  },

  // Repository configuration
  repo: 'https://github.com/your-org/your-repo',

  verbose: true,
})

Configuration Options

interface LogsmithConfig {
  // Core options
  verbose: boolean
  output: string | false
  from?: string
  to: string
  dir: string

  // Changelog options
  clean: boolean
  excludeAuthors: string[]
  includeAuthors: string[]
  excludeEmail: boolean
  hideAuthorEmail: boolean

  // Repository configuration
  repo?: string
  github: {
    repo?: string
    token?: string
  }

  // Templates and formatting
  templates: {
    commitFormat: string
    groupFormat: string
    typeFormat: Record<string, string>
  }
}

Conventional Commits

Logsmith parses conventional commits and groups them by type:

feat: add new authentication system
fix: resolve memory leak in parser
docs: update API documentation
style: fix code formatting
refactor: simplify user service
perf: optimize database queries
test: add integration tests
build: update dependencies
ci: improve GitHub Actions workflow
chore: update development tools

Breaking Changes

Breaking changes are detected and highlighted:

feat!: remove deprecated API endpoints
feat: add new feature

BREAKING CHANGE: The old API has been removed

Output Formats

Logsmith supports multiple output formats to meet different needs:

Markdown (Default)

Standard markdown format perfect for GitHub repositories:

### πŸš€ Features

- **auth**: add OAuth integration ([abc123d](https://github.com/your-org/your-repo/commit/abc123d))
- **api**: implement rate limiting ([def456a](https://github.com/your-org/your-repo/commit/def456a))

### πŸ› Bug Fixes

- **parser**: fix memory leak in token processing ([ghi789b](https://github.com/your-org/your-repo/commit/ghi789b))

### Contributors

- John Doe <john@example.com>
- Jane Smith <jane@example.com>

JSON Format

Structured data format for automation and tooling:

{
  "date": "2024-03-20",
  "sections": [
    {
      "title": "πŸš€ Features",
      "commits": [
        {
          "type": "feat",
          "scope": "auth",
          "description": "add OAuth integration",
          "hash": "abc123d",
          "author": "John Doe <john@example.com>",
          "breaking": false,
          "references": []
        }
      ]
    }
  ],
  "contributors": ["John Doe <john@example.com>"],
  "stats": {
    "totalCommits": 15,
    "sectionsCount": 3,
    "contributorsCount": 4,
    "breakingChanges": 1
  }
}

HTML Format

Beautiful web-ready format with modern styling:

  • Clean, responsive design
  • Syntax highlighting for commit hashes
  • Interactive links to commits and issues
  • Mobile-friendly layout
  • Professional typography
  • Breaking change indicators

API Reference

generateChangelog(config: LogsmithConfig): Promise<ChangelogResult>

Generate changelog content with optional file output.

Returns:

interface ChangelogResult {
  content: string // Generated changelog content
  outputPath?: string // Path where changelog was written (if output option used)
}

defineConfig(config: LogsmithConfig): LogsmithConfig

TypeScript helper for configuration files.

Integration with Version Bumping

Logsmith focuses solely on changelog generation. For version bumping functionality, use it together with @stacksjs/bumpx:

# First bump the version
bunx bumpx patch

# Then generate changelog
logsmith --output CHANGELOG.md

Or use them together in your build scripts:

{
  "scripts": {
    "release": "logsmith patch && logsmith --output CHANGELOG.md"
  }
}

Credits

Sponsors

We would like to extend our thanks to the following sponsors for funding Stacks development. If you are interested in becoming a sponsor, please reach out to us.

License

The MIT License (MIT). Please see LICENSE for more information.

Made with πŸ’™

About

πŸ“ Forge beautiful changelogs from your commits.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

3D76

Contributors 5

0