{"id":34639144,"url":"https://github.com/ionide/keepachangelog","last_synced_at":"2026-01-26T16:01:14.570Z","repository":{"id":38446994,"uuid":"446485706","full_name":"ionide/KeepAChangelog","owner":"ionide","description":"Parser and MSBuild Targets for using Keep-A-Changelog-formatted Changelogs in your Build","archived":false,"fork":false,"pushed_at":"2025-10-13T16:37:44.000Z","size":169,"stargazers_count":37,"open_issues_count":12,"forks_count":7,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-12-26T06:18:11.618Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ionide.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"open_collective":"ionide"}},"created_at":"2022-01-10T15:50:02.000Z","updated_at":"2025-10-25T14:01:20.000Z","dependencies_parsed_at":"2023-12-07T23:34:59.636Z","dependency_job_id":"95632460-d1b7-468e-a0b8-a223f1a2d10c","html_url":"https://github.com/ionide/KeepAChangelog","commit_stats":{"total_commits":50,"total_committers":6,"mean_commits":8.333333333333334,"dds":"0.30000000000000004","last_synced_commit":"7ad0461e29bc3f22aafe971cdb11d61451198531"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/ionide/KeepAChangelog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ionide%2FKeepAChangelog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ionide%2FKeepAChangelog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ionide%2FKeepAChangelog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ionide%2FKeepAChangelog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ionide","download_url":"https://codeload.github.com/ionide/KeepAChangelog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ionide%2FKeepAChangelog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28782084,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-24T17:14:33.894Z","updated_at":"2026-01-26T16:01:14.564Z","avatar_url":"https://github.com/ionide.png","language":"F#","funding_links":["https://opencollective.com/ionide"],"categories":[],"sub_categories":[],"readme":"# Ionide.KeepAChangelog\n\nThis project implements a Changelog parser according to the spec at KeepAChangelog. It also provides MSBuild tasks and targets to automate the setting of **Versions** and **Package Release Notes** for your NuGet packages, so that the Changelogs are your source of truth.\n\nWhen configured, this package will set the `Version`, `PackageVersion`, and `PackageReleaseNotes` of your packable project with the matching data from the latest Changelog release, as well as adding AssemblyMetadata for the `BuildDate` in the `YYYY-mm-dd` format.\n\n## Installation\n\nThe MSBuild package is authored as a set of tasks and targets that are used automatically.  You just have to install the `Ionide.KeepAChangelog.Tasks` package and you're all set!\n\n```xml\n\u003cItemGroup\u003e\n    \u003cPackageReference Include=\"Ionide.KeepAChangelog.Tasks\" Version=\"\u003cinsert here\u003e\" PrivateAssets=\"all\" /\u003e\n\u003c/ItemGroup\u003e\n```\n\n## Examples\n\nIt might be helpful to see how this library can help you.  Imagine you have a project file like this:\n\n```xml\n\u003cProject Sdk=\"Microsoft.NET.Sdk\"\u003e\n  \u003cPropertyGroup\u003e\n    \u003cTargetFramework\u003enetstandard2.0\u003c/TargetFramework\u003e\n    \u003cGenerateDocumentationFile\u003etrue\u003c/GenerateDocumentationFile\u003e\n  \u003c/PropertyGroup\u003e\n  \u003cItemGroup\u003e\n    \u003cCompile Include=\"Main.fs\" /\u003e\n  \u003c/ItemGroup\u003e\n\u003c/Project\u003e\n```\n\nand a CHANGELOG.md file like this:\n\n```md\n# Changelog\n\n## 1.0.0 - 2022-01-14\n\n### Added\n\n* Initial release\n```\n\npackaging the project with this library results in the same result as packing a project that looks like this:\n\n```xml\n\u003cProject Sdk=\"Microsoft.NET.Sdk\"\u003e\n \u003cPropertyGroup\u003e\n   \u003cTargetFramework\u003enetstandard2.0\u003c/TargetFramework\u003e\n   \u003cGenerateDocumentationFile\u003etrue\u003c/GenerateDocumentationFile\u003e\n   \u003cVersion\u003e1.0.0\u003c/Version\u003e\n   \u003cPackageVersion\u003e1.0.0\u003c/PackageVersion\u003e\n   \u003cReleaseNotes\u003e\n## 1.0.0 - 2022-01-14\n\n### Added\n\n* Initial release\n   \u003c/ReleaseNotes\u003e\n \u003c/PropertyGroup\u003e\n \u003cItemGroup\u003e\n   \u003cCompile Include=\"Main.fs\" /\u003e\n \u003c/ItemGroup\u003e\n\u003c/Project\u003e\n```\n\nIf your changelog has multiple versions, the latest one will be used.\n\n## Customization\n\nThere's really only one property that matters for these targets, and that's `ChangelogFile`. This needs to point to the Changelog file you want to read, but it defaults to `CHANGELOG.md` in the root of a given project in case you want to adhere to defaults.\n\n## API\n\nWhen the task runs, it writes several output items and properties:\n\n|Name|Type|Description|\n|----|----|-----------|\n| UnreleasedChangelog | UnreleasedChangelogData option | If present, there was an 'Unreleased' section in the Changelog. This structure will contain the sections present. |\n| CurrentReleaseChangelog | ReleaseChangelogData option | If present, there was at least one released logged in the Changelog. This structure will contain the details of each one. |\n| AllReleasedChangelogs | ReleaseChangelogData list | Contains the ordered list of all released in the ChangelogFile, descending. |\n| LatestReleaseNotes | string option | If present, contains the concatenated list of all Changelog sections for the latest release. This is a convenience property so that you don't have to String.Join all the lines in the `ReleaseChangelogData` yourself! |\n\n### ChangelogData\n\nThis TaskItem has metadata for each of the known sections of a Changelog:\n\n* Added\n* Changed\n* Deprecated\n* Removed\n* Fixed\n* Security\n\nIn each case, the value of the metadata is the newline-concatenated list of all of the Changelog Entries for that section.\n\n### UnreleasedChangelogData\n\nThis structure is a `ChangelogData` with an `Identity` of `\"Unreleased\"`.\n\n### ReleaseChangelogData\n\nThis structure is the same as `ChangelogData`, but it contains two more items of metadata:\n\n* the `Identity` of the `TaskItem` is the Semantic Version of the release\n* the `Date` of the `TaskItem` is the `YYYY-MM-DD`-formatted date of the release\n\n\n## How to contribute\n\n*Imposter syndrome disclaimer*: I want your help. No really, I do.\n\nThere might be a little voice inside that tells you you're not ready; that you need to do one more tutorial, or learn another framework, or write a few more blog posts before you can help me with this project.\n\nI assure you, that's not the case.\n\nThis project has some clear Contribution Guidelines and expectations that you can [read here](https://github.com/ionide/KeepAChangelog/blob/master/CONTRIBUTING.md).\n\nThe contribution guidelines outline the process that you'll need to follow to get a patch merged. By making expectations and process explicit, I hope it will make it easier for you to contribute.\n\nAnd you don't just have to write code. You can help out by writing documentation, tests, or even by giving feedback about this work. (And yes, that includes giving feedback about the contribution guidelines.)\n\nThank you for contributing!\n\n\n## Contributing and copyright\n\nThe project is hosted on [GitHub](https://github.com/ionide/KeepAChangelog) where you can [report issues](https://github.com/ionide/KeepAChangelog/issues), fork\nthe project and submit pull requests.\n\nThe library is available under [MIT license](https://github.com/ionide/KeepAChangelog/blob/master/LICENSE), which allows modification and redistribution for both commercial and non-commercial purposes.\n\nPlease note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fionide%2Fkeepachangelog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fionide%2Fkeepachangelog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fionide%2Fkeepachangelog/lists"}