From 5203cba5a7ab53178601abd0c82d2798d1e7bd1f Mon Sep 17 00:00:00 2001 From: Kayvan Sylvan Date: Sun, 27 Jul 2025 21:12:04 -0700 Subject: [PATCH 1/3] feat: add GitHub release description update via `--release` flag ### CHANGES - Add `--release` flag to generate_changelog to update GitHub release - Implement `ReleaseManager` for managing release descriptions - Create `release.go` for handling release updates - Update `release.yml` to run changelog generation - Ensure mutual exclusivity for `--release` with other flags - Modify `Config` struct to include `Release` field - Update `main.go` to handle new release functionality --- .github/workflows/release.yml | 1 + cmd/generate_changelog/changelog.db | Bin 2596864 -> 2596864 bytes .../internal/config/config.go | 1 + cmd/generate_changelog/internal/release.go | 81 ++++++++++++++++++ cmd/generate_changelog/main.go | 15 ++++ 5 files changed, 98 insertions(+) create mode 100644 cmd/generate_changelog/internal/release.go diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e0704056..8f0eafb6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -122,6 +122,7 @@ jobs: else echo "Release ${{ env.latest_tag }} already exists." fi + go run ./cmd/generate_changelog --release ${{ env.latest_tag }} - name: Upload release artifact if: matrix.os == 'windows-latest' diff --git a/cmd/generate_changelog/changelog.db b/cmd/generate_changelog/changelog.db index ecbafbc1d678b21fe24ff062aef6a154f0bb358c..e4daf77c3867e2c0c6ba2325747280b7cc1e19be 100644 GIT binary patch delta 48189 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%0DkIBt*Q{cE6VdcSa6ff)%+`GZanmfYkR9B<@ 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 delta 39420 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 0 || cfg.ProcessPRsVersion != "" || cfg.SyncDB) { + return fmt.Errorf("--release cannot be used with other processing flags") + } + if cfg.GitHubToken == "" { cfg.GitHubToken = os.Getenv("GITHUB_TOKEN") } @@ -70,6 +76,15 @@ func run(cmd *cobra.Command, args []string) error { return generator.SyncDatabase() } + if cfg.Release != "" { + releaseManager, err := internal.NewReleaseManager(cfg) + if err != nil { + return fmt.Errorf("failed to create release manager: %w", err) + } + defer releaseManager.Close() + return releaseManager.UpdateReleaseDescription(cfg.Release) + } + output, err := generator.Generate() if err != nil { return fmt.Errorf("failed to generate changelog: %w", err) From 8ea264e96cabed884c82dedefa417c732ea460d5 Mon Sep 17 00:00:00 2001 From: Kayvan Sylvan Date: Sun, 27 Jul 2025 21:22:30 -0700 Subject: [PATCH 2/3] feat: add GitHub release description update with AI summary ## CHANGES - Add `--release` flag to command line options documentation - Enable AI summary updates for GitHub releases - Support version-specific release description updates - Reorder internal package imports for consistency --- cmd/generate_changelog/README.md | 1 + cmd/generate_changelog/main.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/generate_changelog/README.md b/cmd/generate_changelog/README.md index 80d9c6aa..816ad678 100644 --- a/cmd/generate_changelog/README.md +++ b/cmd/generate_changelog/README.md @@ -101,6 +101,7 @@ generate_changelog --cache /path/to/cache.db | `--force-pr-sync` | | Force a full PR sync from GitHub | false | | `--token` | | GitHub API token | `$GITHUB_TOKEN` | | `--ai-summarize` | | Generate AI-enhanced summaries using Fabric | false | +| `--release` | | Update GitHub release description with AI summary for version | | ## Output Format diff --git a/cmd/generate_changelog/main.go b/cmd/generate_changelog/main.go index 7664e7a7..60fd0221 100644 --- a/cmd/generate_changelog/main.go +++ b/cmd/generate_changelog/main.go @@ -5,9 +5,9 @@ import ( "os" "path/filepath" + internal "github.com/danielmiessler/fabric/cmd/generate_changelog/internal" "github.com/danielmiessler/fabric/cmd/generate_changelog/internal/changelog" "github.com/danielmiessler/fabric/cmd/generate_changelog/internal/config" - internal "github.com/danielmiessler/fabric/cmd/generate_changelog/internal" "github.com/joho/godotenv" "github.com/spf13/cobra" ) From 98968d972f6e3a5289e40e39e51d549a2183e148 Mon Sep 17 00:00:00 2001 From: Changelog Bot Date: Sun, 27 Jul 2025 21:24:46 -0700 Subject: [PATCH 3/3] chore: incoming 1657 changelog entry --- cmd/generate_changelog/incoming/1657.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 cmd/generate_changelog/incoming/1657.txt diff --git a/cmd/generate_changelog/incoming/1657.txt b/cmd/generate_changelog/incoming/1657.txt new file mode 100644 index 00000000..3918139a --- /dev/null +++ b/cmd/generate_changelog/incoming/1657.txt @@ -0,0 +1,7 @@ +### PR [#1657](https://github.com/danielmiessler/Fabric/pull/1657) by [ksylvan](https://github.com/ksylvan): Add GitHub Release Description Update Feature + +- Add GitHub release description update via `--release` flag +- Implement `ReleaseManager` for managing release descriptions +- Create `release.go` for handling release updates +- Update `release.yml` to run changelog generation +- Enable AI summary updates for GitHub releases