Skip to main content

Automated git push with smart commit messages, changelog updates, and version tagging

Project description

Goal

Automated git push with smart commit messages, changelog updates, version tagging, and interactive workflow.

Features

  • 🚀 Interactive workflow - Confirms each stage (test, commit, push, publish) with Y/n prompts
  • 🧠 Smart commit messages - Generates conventional commits based on diff analysis
  • 📦 Multi-language support - Python, Node.js, Rust, Go, Ruby, PHP, .NET, Java
  • 🏷️ Version management - Automatic version bumping and synchronization across project files
  • 📝 Changelog updates - Maintains CHANGELOG.md with version history
  • 🐳 CI/CD ready - --yes flag for automated workflows
  • 🧪 Test integration - Runs project-specific test commands before committing
  • 📦 Publish support - Publishes to package managers (PyPI, npm, crates.io, etc.)

Installation

pip install goal

Quick Start

1. Initialize your repository

goal init

Creates VERSION and CHANGELOG.md files if they don't exist.

2. Run the interactive workflow

goal

This will guide you through:

  • ✅ Run tests? [Y/n]
  • ✅ Commit changes? [Y/n]
  • ✅ Push to remote? [Y/n]
  • ✅ Publish version X.X.X? [Y/n]

Press Enter to accept the default (Yes) for any step.

Usage Examples

Basic interactive workflow

# Run full interactive workflow with default patch bump
goal

# Run with minor version bump
goal --bump minor

# Run without prompts (for CI/CD)
goal --yes

# Automate ALL stages without any prompts
goal --all

Using the push command directly

# Interactive push with prompts
goal push

# Split commits by change type (docs/code/ci/examples)
goal push --split

# Split + auto (CI style)
goal push --split --yes

# Split + add ticket prefix
goal push --split --ticket ABC-123

# Automatic push without prompts
goal push --yes

# Dry run to see what would happen
goal push --dry-run

# Custom commit message
goal push -m "feat: add new authentication system"

# Skip specific steps
goal push --no-tag --no-changelog

Version management

# Check current version
goal version

# Bump specific version type
goal version --bump minor
goal version --bump major

# Check repository status
goal status

Supported Project Types

Goal automatically detects your project type and uses appropriate commands:

Language Test Command Publish Command Version Files
Python pytest python -m build && twine upload dist/* pyproject.toml, setup.py
Node.js npm test npm publish package.json
Rust cargo test cargo publish Cargo.toml
Go go test ./... git push origin --tags go.mod (uses git tags)
Ruby bundle exec rspec gem build *.gemspec && gem push *.gem *.gemspec
PHP composer test composer publish composer.json
.NET dotnet test dotnet pack && dotnet nuget push *.nupkg *.csproj
Java mvn test mvn deploy pom.xml, build.gradle

Markdown Output

Goal outputs structured markdown by default (perfect for LLM consumption and CI/CD logs). Use --ascii to get the legacy console output.

# Default: markdown output
goal push
goal status

# Force legacy output
goal push --ascii
goal status --ascii

# Use with automation
goal --all > release.log

The markdown output includes:

  • Front matter with metadata (command, version, file count)
  • Structured sections for overview, files, and test results
  • Code blocks for command outputs
  • Summary with actions taken and next steps

Example output:

---
command: goal push
project_types: ["python"]
version_bump: "1.0.1 -> 1.0.2"
file_count: 7
---

# Goal Push Result

## Overview
**Project Type:** python
**Files Changed:** 7 (+1140/-99 lines)
**Version:** 1.0.1 → 1.0.2
...

See docs/markdown-output.md for detailed examples.

Command Reference

goal or goal push

Main command for the complete workflow.

Options:

  • --bump, -b: Version bump type [patch|minor|major] (default: patch)
  • --yes, -y: Skip all prompts (run automatically)
  • --all, -a: Automate all stages including tests, commit, push, and publish
  • --markdown/--ascii: Output format (default: markdown)
  • --split: Create separate commits per change type (docs/code/ci/examples)
  • --ticket: Ticket prefix to include in commit titles (overrides TICKERT)
  • --no-tag: Skip creating git tag
  • --no-changelog: Skip updating changelog
  • --no-version-sync: Skip syncing version to project files
  • --message, -m: Custom commit message
  • --dry-run: Show what would be done without doing it

Split commits (per type)

When --split is enabled, Goal will create multiple commits:

  • code: changes in goal/, src/, lib/, *.py
  • docs: docs/*, README.md, *.md
  • ci: .github/*, .gitlab/*, *.yml/*.yaml
  • examples: examples/*
  • other: everything else

Then it will create a final release metadata commit with version bump + changelog (unless disabled).

Ticket prefixing (TICKET)

Create a TICKET file in repository root:

prefix=ABC-123
format=[{ticket}] {title}

You can override it per run:

goal push --ticket ABC-123
goal push --split --ticket ABC-123
goal commit --ticket ABC-123

goal init

Initialize goal in current repository.

Creates:

  • VERSION file with initial version 1.0.0
  • CHANGELOG.md with standard template

goal status

Show current git status and version info.

Displays:

  • Current version
  • Current branch
  • Staged files
  • Unstaged/untracked files

goal version

Show or bump version.

Options:

  • --type, -t: Version bump type [patch|minor|major] (default: patch)

Examples by Use Case

Development Workflow

# Make your changes...
git add some/files

# Run goal with interactive prompts
goal

# Prompts will appear:
# Run tests? [Y/n] - Runs pytest for Python projects
# Commit changes? [Y/n] - Creates smart commit message
# Push to remote? [Y/n] - Pushes to origin with tags
# Publish version 1.2.3? [Y/n] - Publishes to PyPI/npm/etc

Full Automation

# Automate everything - tests, commit, push, publish
goal --all

# Short form
goal -a

# With specific version bump
goal --all --bump minor

CI/CD Pipeline

# GitHub Actions example
- name: Deploy with Goal
  run: |
    goal push --yes --bump minor
    
# Or with --all flag
- name: Full release
  run: |
    goal --all --bump patch

Skip Testing in Quick Fixes

# Skip tests for documentation changes
goal push --yes -m "docs: update README"

Pre-release Workflow

# Check what will be done
goal push --dry-run --bump minor

# Run with specific version bump
goal push --bump minor

# Or skip publishing for internal releases
goal push --yes --no-tag

Configuration

Goal uses goal.yaml for configuration. Run goal init to create it automatically with detected settings.

goal.yaml Structure

# goal.yaml - Goal configuration file
version: "1.0"

project:
  name: "my-project"           # Auto-detected from pyproject.toml/package.json
  type: ["python"]             # Auto-detected project types
  description: "My project"    # Auto-detected description

versioning:
  strategy: "semver"           # semver, calver, or date
  files:                       # Files to sync version to
    - "VERSION"
    - "pyproject.toml:version"
    - "package.json:version"
  bump_rules:                  # Auto-bump thresholds
    patch: 10                  # Files changed
    minor: 50                  # Lines added
    major: 200                 # Large changes

git:
  commit:
    strategy: "conventional"   # conventional, semantic, custom
    scope: "my-project"        # Default scope for commits
    templates:                 # Custom commit templates
      feat: "feat({scope}): {description}"
      fix: "fix({scope}): {description}"
      docs: "docs({scope}): {description}"
    classify_by:               # Classification methods
      - "file_extensions"
      - "directory_paths"
      - "line_stats"
      - "keywords_diff"
  changelog:
    enabled: true
    template: "keep-a-changelog"
    output: "CHANGELOG.md"
    sections: ["Added", "Changed", "Fixed", "Deprecated"]
  tag:
    enabled: true
    prefix: "v"
    format: "{prefix}{version}"

strategies:
  python:
    test: "pytest tests/ -v"
    build: "python -m build"
    publish: "twine upload dist/*"
  nodejs:
    test: "npm test"
    build: "npm run build"
    publish: "npm publish"

registries:
  pypi:
    url: "https://pypi.org/simple/"
    token_env: "PYPI_TOKEN"
  npm:
    url: "https://registry.npmjs.org/"
    token_env: "NPM_TOKEN"

hooks:
  pre_commit: ""               # Command to run before commit
  post_commit: ""              # Command to run after commit
  pre_push: ""                 # Command to run before push
  post_push: ""                # Command to run after push

advanced:
  auto_update_config: true     # Auto-update config on detection changes
  performance:
    max_files: 50              # Split commits if > N files
    timeout_test: 300          # Test timeout in seconds

Config Commands

# Show full configuration
goal config show

# Show specific key (dot notation)
goal config show -k git.commit.strategy

# Get a value
goal config get project.name

# Set a value
goal config set git.commit.scope "my-app"

# Validate configuration
goal config validate

# Update config based on project detection
goal config update

Custom Config File

# Use a custom config file
goal --config custom-goal.yaml push

# Or in CI/CD
goal -c .goal/ci.yaml --all

Conventions (without goal.yaml)

Goal also works without configuration based on conventions:

  1. Version detection: Looks for VERSION file first, then project-specific files
  2. Project detection: Automatically detects project type from files
  3. Commit messages: Uses conventional commit format based on diff analysis
  4. Changelog: Updates CHANGELOG.md in Keep a Changelog format

Integration Examples

Makefile

.PHONY: release patch minor major

# Interactive release
release:
	goal

# Automatic patch release
patch:
	goal push --yes

# Full automation release
all:
	goal --all

# Automatic minor release
minor:
	goal push --yes --bump minor

# Automatic major release
major:
	goal push --yes --bump major

# Dry run
dry-run:
	goal push --dry-run

package.json scripts

{
  "scripts": {
    "release": "goal",
    "release:patch": "goal push --yes",
    "release:all": "goal --all",
    "release:minor": "goal push --yes --bump minor",
    "release:major": "goal push --yes --bump major"
  }
}

pre-commit hook

#!/bin/sh
# .git/hooks/pre-commit
goal push --dry-run

Smart Commit Messages

Goal analyzes your changes to generate appropriate commit messages:

  • feat: New features, additions
  • fix: Bug fixes, patches
  • docs: Documentation changes
  • style: Formatting, linting
  • refactor: Code restructuring
  • perf: Performance improvements
  • test: Test additions/changes
  • build: Build system, CI/CD
  • chore: Dependencies, maintenance

Examples:

  • feat: add user authentication
  • fix: resolve memory leak in parser
  • docs: update API documentation
  • test: add coverage for payment module

Troubleshooting

Tests fail but I want to continue

The interactive workflow will ask if you want to continue when tests fail:

Tests failed. Continue anyway? [y/N]

Custom test/publish commands

If Goal doesn't detect your test command correctly, you can run them manually before using goal push --yes.

Publishing fails

Ensure you're authenticated with the appropriate package manager:

  • PyPI: twine configure or use __token__
  • npm: npm login
  • crates.io: cargo login

License

Apache License 2.0

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

goal-2.1.1.tar.gz (38.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

goal-2.1.1-py3-none-any.whl (35.0 kB view details)

Uploaded Python 3

File details

Details for the file goal-2.1.1.tar.gz.

File metadata

  • Download URL: goal-2.1.1.tar.gz
  • Upload date:
  • Size: 38.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for goal-2.1.1.tar.gz
Algorithm Hash digest
SHA256 5558cc596efaad075b5c8d73f37875f30f7e06faf3b76b3d1a809d3951f2e8d8
MD5 8c66ca5cc2f1f6de05b8541e0d493c46
BLAKE2b-256 1ad2cea600199d268a313cebe703fff6d0866ad6065d3468a58b738684cfe602

See more details on using hashes here.

File details

Details for the file goal-2.1.1-py3-none-any.whl.

File metadata

  • Download URL: goal-2.1.1-py3-none-any.whl
  • Upload date:
  • Size: 35.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for goal-2.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c53bc8566775e475b4455915db779222deea6c4a91e00912bb114c9c84ea8d21
MD5 6a515ca6985a4826ad7cc90779f327c1
BLAKE2b-256 e37f44b64b06724c74dc02ac2b12142e11783f51d6573f01e6b78b71064e9311

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page