diff --git a/.claude/agents/version-control-engineer.md b/.claude/agents/version-control-engineer.md index ae4bcb1..40f6625 100644 --- a/.claude/agents/version-control-engineer.md +++ b/.claude/agents/version-control-engineer.md @@ -69,14 +69,65 @@ chore: bump version to 0.19.0 git status # 2. Update version in pyproject.toml -# Edit: version = "0.19.0" +# Edit: version = "0.20.0" -# 3. Commit version bump -git add pyproject.toml -git commit -m "chore: bump version to 0.19.0" +# 3. Update CHANGELOG.md (see Changelog section below) -# 4. Create git tag -git tag -a v0.19.0 -m "Release v0.19.0" +# 4. Commit version bump and changelog +git add pyproject.toml CHANGELOG.md +git commit -m "chore: bump version to 0.20.0" + +# 5. Create git tag +git tag -a v0.20.0 -m "Release v0.20.0" +``` + +## Changelog Management + +### Changelog Location +- File: `CHANGELOG.md` +- Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) + +### Changelog Structure + +The changelog uses these categories under each version: +- **Added**: New features +- **Changed**: Changes to existing functionality +- **Deprecated**: Features that will be removed +- **Removed**: Features that were removed +- **Fixed**: Bug fixes +- **Security**: Security-related changes + +### Updating the Changelog + +**During Development:** +1. Add changes to the `[Unreleased]` section as they are merged +2. Use the appropriate category (Added, Changed, Fixed, etc.) +3. Write clear, user-focused descriptions + +**During Release:** +1. Rename `[Unreleased]` to `[X.Y.Z] - YYYY-MM-DD` +2. Add a new empty `[Unreleased]` section at the top +3. Update the comparison links at the bottom of the file + +**Example Changelog Entry:** +```markdown +## [Unreleased] + +### Added + +- New bulk delete operation for todos via `client.todo.delete_many()` + +### Fixed + +- Resolved timeout issue in async operations with large payloads +``` + +### Changelog Links + +Keep the comparison links at the bottom of CHANGELOG.md updated: +```markdown +[Unreleased]: https://github.com/franccesco/bloomy-python/compare/vX.Y.Z...HEAD +[X.Y.Z]: https://github.com/franccesco/bloomy-python/compare/vA.B.C...vX.Y.Z ``` ## Pull Request Workflow @@ -141,36 +192,42 @@ uv run mkdocs build --strict # 3. Verify all tests pass # 4. Review recent commits for changelog -git log --oneline v0.18.0..HEAD +git log --oneline v0.19.0..HEAD ``` ### Release Steps ```bash -# 1. Update version in pyproject.toml -# 2. Update CHANGELOG.md (if exists) - -# 3. Commit release -git add pyproject.toml -git commit -m "chore: bump version to 0.19.0" +# 1. Update CHANGELOG.md +# - Move items from [Unreleased] to new version section +# - Add release date: ## [0.20.0] - 2025-12-10 +# - Update comparison links at bottom -# 4. Create annotated tag -git tag -a v0.19.0 -m "Release v0.19.0 +# 2. Update version in pyproject.toml +# version = "0.20.0" -Features: -- Added bulk operations support -- Improved async performance +# 3. Commit release +git add CHANGELOG.md pyproject.toml +git commit -m "chore: release v0.20.0" -Fixes: -- Fixed date parsing issue -" +# 4. Create annotated tag (simple message - changelog is in CHANGELOG.md) +git tag -a v0.20.0 -m "Release v0.20.0" # 5. Push with tags git push origin main --tags ``` -### Post-Release -- Verify GitHub release is created +### Automated GitHub Release + +When you push a tag matching `v*`, the GitHub Actions workflow (`.github/workflows/release.yml`) automatically: +1. Extracts the changelog section for that version from CHANGELOG.md +2. Creates a GitHub Release with the changelog as the release body +3. Names the release after the tag (e.g., "v0.20.0") + +**No manual GitHub Release creation is needed!** + +### Post-Release Verification +- Verify GitHub Release was created at: https://github.com/franccesco/bloomy-python/releases - Documentation auto-deploys via GitHub Actions - Manual PyPI publish if needed @@ -219,6 +276,6 @@ git push origin --delete feature-branch ## Files to Update for Releases +- `CHANGELOG.md` - Release notes (REQUIRED - move items from Unreleased, update links) - `pyproject.toml` - Version number -- `CHANGELOG.md` - Release notes (if maintained) -- `docs/` - Any version-specific documentation +- `docs/` - Any version-specific documentation (if applicable) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..aedec45 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,57 @@ +name: Release + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Extract version from tag + id: version + run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + + - name: Extract changelog for this version + id: changelog + run: | + # Extract the changelog section for this version + version="${{ steps.version.outputs.version }}" + + # Use awk to extract the section between this version and the next + changelog=$(awk -v ver="$version" ' + /^## \[/ { + if (found) exit + if ($0 ~ "\\[" ver "\\]") found=1 + next + } + found && /^## \[/ { exit } + found { print } + ' CHANGELOG.md) + + # Write to file to preserve formatting + echo "$changelog" > /tmp/release_notes.md + + # Set output (escape newlines for GitHub Actions) + { + echo 'notes<> $GITHUB_OUTPUT + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + name: v${{ steps.version.outputs.version }} + body: ${{ steps.changelog.outputs.notes }} + draft: false + prerelease: ${{ contains(steps.version.outputs.version, '-') }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3042df4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,214 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.19.0] - 2025-12-10 + +### Fixed + +- Made `Position.name` field optional to handle null API responses from Bloom Growth API +- Fixes Pydantic validation errors in `UserOperations.positions()`, `details(include_positions=True)`, and `details(all=True)` + +## [0.18.0] - 2025-12-08 + +### Added + +- Async bulk operations with rate limiting for goals, todos, issues, and meetings +- Performance benchmarks documentation for async operations + +### Fixed + +- Corrected API endpoints and field mappings in async operations + +## [0.17.0] - 2025-12-07 + +### Added + +- Batch read operation for meetings via `client.meeting.get_many()` +- Documentation and examples for batch operations + +## [0.16.0] - 2025-12-06 + +### Added + +- Claude AI agent configurations and settings for development workflow +- Specialized subagents for manager-mode workflow + +### Changed + +- Streamlined CLAUDE.md to focus on architecture and development commands + +## [0.15.0] - 2025-12-05 + +### Added + +- Comprehensive VS Code devcontainer support for consistent development environment +- GitHub CLI integration in devcontainer + +## [0.14.0] - 2025-12-04 + +### Added + +- Bulk creation methods for issues, todos, goals, and meetings +- Comprehensive test suite for bulk operations +- Bulk operations guide documentation + +## [0.13.2] - 2025-12-03 + +### Fixed + +- Adjusted scorecard typing expectations + +## [0.13.1] - 2025-12-02 + +### Added + +- Comprehensive ruff linting rules with preview features enabled + +### Fixed + +- All linting issues identified by new ruff rules + +## [0.13.0] - 2025-12-01 + +### Added + +- Full async/await support with `AsyncClient` +- Async operations for goals, headlines, issues, and scorecard +- `pytest-asyncio` for async test support + +## [0.12.0] - 2025-11-30 + +### Fixed + +- Documentation to match actual SDK implementation +- GitHub/PyPI URLs in documentation +- Authentication guide documentation +- API key retrieval documentation examples + +### Removed + +- Incorrect licensing information + +## [0.11.0] - 2025-11-29 + +### Added + +- Informational badges to README + +### Changed + +- Simplified API description in documentation + +### Removed + +- Ruby workflows from GitHub Actions + +## [0.10.0] - 2025-11-28 + +### Fixed + +- Documentation and implementation mismatches +- SDK models to match actual API responses +- Client API key initialization priority + +## [0.9.0] - 2025-11-27 + +### Added + +- MkDocs documentation with Material theme +- Dynamic version loading from pyproject.toml + +### Fixed + +- Docstring example formatting for mkdocs +- Documentation to accurately reflect Pydantic model returns + +## [0.8.0] - 2025-11-26 + +### Changed + +- Switched to pyright strict mode for enhanced type safety + +### Fixed + +- All type and linting issues for strict mode compliance + +## [0.7.0] - 2025-11-25 + +### Added + +- Pydantic for enhanced data validation and type safety + +### Fixed + +- Ruff line length configuration +- Pyright TypedDict access issues + +### Removed + +- Examples folder + +## [0.6.0] - 2025-11-24 + +### Added + +- Claude AI instructions for development assistance + +## [0.5.0] - 2025-11-23 + +### Added + +- Python version specification in pyproject.toml + +### Fixed + +- Removed tracked files that should be ignored + +## [0.4.0] - 2025-11-22 + +### Fixed + +- All ruff check issues + +## [0.1.0] - 2025-11-21 + +### Added + +- Initial Python SDK implementation migrated from Ruby +- Core client with authentication support +- User operations: get details, search, list all users, get direct reports/positions +- Meeting operations: CRUD operations, get attendees/issues/todos/metrics +- Todo operations: CRUD for user or meeting todos +- Goal (Rock) operations: CRUD, archive/restore functionality +- Scorecard operations: get current week, list/update scores +- Issue operations: create, list, solve issues +- Headline operations: CRUD for meeting headlines +- Configuration management with multiple API key sources +- httpx-based HTTP client with bearer token authentication + +[Unreleased]: https://github.com/franccesco/bloomy-python/compare/v0.19.0...HEAD +[0.19.0]: https://github.com/franccesco/bloomy-python/compare/v0.18.0...v0.19.0 +[0.18.0]: https://github.com/franccesco/bloomy-python/compare/v0.17.0...v0.18.0 +[0.17.0]: https://github.com/franccesco/bloomy-python/compare/v0.16.0...v0.17.0 +[0.16.0]: https://github.com/franccesco/bloomy-python/compare/v0.15.0...v0.16.0 +[0.15.0]: https://github.com/franccesco/bloomy-python/compare/v0.14.0...v0.15.0 +[0.14.0]: https://github.com/franccesco/bloomy-python/compare/v0.13.2...v0.14.0 +[0.13.2]: https://github.com/franccesco/bloomy-python/compare/v0.13.1...v0.13.2 +[0.13.1]: https://github.com/franccesco/bloomy-python/compare/v0.13.0...v0.13.1 +[0.13.0]: https://github.com/franccesco/bloomy-python/compare/v0.12.0...v0.13.0 +[0.12.0]: https://github.com/franccesco/bloomy-python/compare/v0.11.0...v0.12.0 +[0.11.0]: https://github.com/franccesco/bloomy-python/compare/v0.10.0...v0.11.0 +[0.10.0]: https://github.com/franccesco/bloomy-python/compare/v0.9.0...v0.10.0 +[0.9.0]: https://github.com/franccesco/bloomy-python/compare/v0.8.0...v0.9.0 +[0.8.0]: https://github.com/franccesco/bloomy-python/compare/v0.7.0...v0.8.0 +[0.7.0]: https://github.com/franccesco/bloomy-python/compare/v0.6.0...v0.7.0 +[0.6.0]: https://github.com/franccesco/bloomy-python/compare/v0.5.0...v0.6.0 +[0.5.0]: https://github.com/franccesco/bloomy-python/compare/v0.4.0...v0.5.0 +[0.4.0]: https://github.com/franccesco/bloomy-python/compare/v0.1.0...v0.4.0 +[0.1.0]: https://github.com/franccesco/bloomy-python/releases/tag/v0.1.0