From be48ca429d5a6106b6d3b1c12322e7fbd058e594 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:34:18 +0000 Subject: [PATCH 1/9] Initial plan From e90e7f7ec95ab19aa6f41ca2d19fd8ce4c47231c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:40:20 +0000 Subject: [PATCH 2/9] fix(draft-release): support first-release and fail fast on required files --- draft-release/README.md | 7 +++- draft-release/README.qmd | 5 ++- draft-release/action.yml | 1 + src/ccbr_actions/release.py | 41 ++++++++++++++++++--- tests/test_release.py | 73 ++++++++++++++++++++++++++----------- 5 files changed, 97 insertions(+), 30 deletions(-) diff --git a/draft-release/README.md b/draft-release/README.md index 4af6c8a..16cd21e 100644 --- a/draft-release/README.md +++ b/draft-release/README.md @@ -24,7 +24,10 @@ Input files: chronological order. The newest entry should contain a header with the phrase “development version”. - `VERSION` - a single-source version file. -- `CITATION.cff` - a citation file. (optional) +- `CITATION.cff` - a citation file. +- For a repository's first release, set `version-tag` manually (for + example `v0.1.0`), because conventional-commit version detection may + not have a previous release to compare against. When you’re ready to draft a new release, [run the workflow manually](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow). @@ -109,7 +112,7 @@ steps: - `changelog-filepath`: Path to the changelog or news file. Default: `CHANGELOG.md`. - `citation-filepath`: Path to the citation file. Default: - `CITATION.cff`. + `CITATION.cff`. This file must exist. - `dev-header`: Header string to match to find the development version entry in the changelog, typically of the form ‘\## development version’. Default: `development version`. diff --git a/draft-release/README.qmd b/draft-release/README.qmd index 27ed29f..fccf47b 100644 --- a/draft-release/README.qmd +++ b/draft-release/README.qmd @@ -30,7 +30,10 @@ Input files: - `CHANGELOG.md` - a changelog or news file with entries in reverse chronological order. The newest entry should contain a header with the phrase “development version”. - `VERSION` - a single-source version file. -- `CITATION.cff` - a citation file. (optional) +- `CITATION.cff` - a citation file. +- For a repository's first release, set `version-tag` manually (for example + `v0.1.0`), because conventional-commit version detection may not have a + previous release to compare against. When you're ready to draft a new release, [run the workflow manually](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow). After the workflow completes, there will be a new draft release that you can review and choose to publish. diff --git a/draft-release/action.yml b/draft-release/action.yml index d0fb1d8..0439e84 100644 --- a/draft-release/action.yml +++ b/draft-release/action.yml @@ -70,6 +70,7 @@ runs: - name: Get current and next versions id: semver uses: ietf-tools/semver-action@v1 + continue-on-error: true with: token: ${{ inputs.github-token }} branch: ${{ github.ref_name }} diff --git a/src/ccbr_actions/release.py b/src/ccbr_actions/release.py index c8fed28..63e6a9e 100644 --- a/src/ccbr_actions/release.py +++ b/src/ccbr_actions/release.py @@ -224,7 +224,23 @@ def prepare_draft_release( changelog_filepath = path_resolve(changelog_filepath) version_filepath = path_resolve(version_filepath) citation_filepath = path_resolve(citation_filepath) - assert all([f.is_file() for f in (changelog_filepath, version_filepath)]) + required_files = { + "changelog": changelog_filepath, + "version": version_filepath, + "citation": citation_filepath, + } + missing_required_files = [ + f"{name} ({filepath})" + for name, filepath in required_files.items() + if not filepath.is_file() + ] + if missing_required_files: + missing_required_files_str = ", ".join(missing_required_files) + raise FileNotFoundError( + "Missing required release file(s): " + f"{missing_required_files_str}. " + "Please create these files or update draft-release inputs." + ) next_version = get_release_version( next_version_manual=next_version_manual, @@ -236,7 +252,7 @@ def prepare_draft_release( set_output("NEXT_VERSION", next_version) changelog_lines, next_release_lines = get_changelog_lines( - latest_version_strict=current_version.lstrip("v"), + latest_version_strict=current_version.lstrip("v") if current_version else "", next_version_strict=next_version_strict, changelog_filepath=changelog_filepath, dev_header=dev_header, @@ -482,14 +498,25 @@ def get_release_version( ) else: next_version = next_version_convco + if not next_version: + raise ValueError( + "Unable to determine next release version. " + "If this is the first release for this repository, provide version-tag." + ) if not is_strict_semver(next_version, with_leading_v=with_leading_v): raise ValueError( f"Tag {next_version} does not match semantic versioning guidelines.\nView the guidelines here: https://semver.org/" ) # assert semantic version pattern - check_version_increments_by_one( - current_version, next_version, with_leading_v=with_leading_v - ) + if current_version: + if not is_strict_semver(current_version, with_leading_v=with_leading_v): + raise ValueError( + f"Current version {current_version} does not match semantic versioning guidelines.\n" + "If this is the first release for this repository, set current version to blank and provide version-tag." + ) + check_version_increments_by_one( + current_version, next_version, with_leading_v=with_leading_v + ) return next_version @@ -551,6 +578,8 @@ def get_changelog_lines( ValueError: If any of the provided version strings do not match the semantic versioning pattern. """ for version in [latest_version_strict, next_version_strict]: + if not version: + continue if not match_semver(version): raise ValueError( f"Version {version} does not match semantic versioning pattern" @@ -562,7 +591,7 @@ def get_changelog_lines( for line in infile: if line.startswith("#") and dev_header in line: line = line.replace(dev_header, next_version_strict) - elif latest_version_strict in line: + elif latest_version_strict and latest_version_strict in line: for_next = False changelog_lines.append(line) diff --git a/tests/test_release.py b/tests/test_release.py index 1e6b6dd..4ea6165 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -69,25 +69,25 @@ def test_prepare_draft_release(tmp_path, github_output_file, data_dir): ) -def test_prepare_draft_release_no_citation(github_output_file, data_dir_rel): - output = exec_in_context( - prepare_draft_release, - next_version_manual="v1.0.0", - next_version_convco="v1.0.0", - current_version="v0.9.10", - gh_event_name="push", - changelog_filepath=str(data_dir_rel / "example_changelog.md"), - dev_header="development version", - release_notes_filepath=str(data_dir_rel / "latest-release.md"), - version_filepath=str(data_dir_rel / "VERSION"), - citation_filepath="not/a/file.cff", - release_branch="release-draft", - pr_ref_name="PR_BRANCH_NAME", - repo="CCBR/actions", - debug=True, - ) - assert "git add" in output - assert ".cff" not in output +def test_prepare_draft_release_missing_required_file(github_output_file, data_dir_rel): + with pytest.raises(FileNotFoundError) as exc_info: + prepare_draft_release( + next_version_manual="v1.0.0", + next_version_convco="v1.0.0", + current_version="v0.9.10", + gh_event_name="push", + changelog_filepath=str(data_dir_rel / "example_changelog.md"), + dev_header="development version", + release_notes_filepath=str(data_dir_rel / "latest-release.md"), + version_filepath=str(data_dir_rel / "VERSION"), + citation_filepath="not/a/file.cff", + release_branch="release-draft", + pr_ref_name="PR_BRANCH_NAME", + repo="CCBR/actions", + debug=True, + ) + assert "Missing required release file(s)" in str(exc_info.value) + assert "citation" in str(exc_info.value) def test_create_release_draft(data_dir_rel): @@ -135,6 +135,17 @@ def test_get_changelog_lines(data_dir_rel): assert release_notes == ["\n", "development version notes go here\n", "\n"] +def test_get_changelog_lines_first_release(data_dir_rel): + new_changelog, release_notes = get_changelog_lines( + "", + "0.2.0", + changelog_filepath=str(data_dir_rel / "example_changelog.md"), + ) + assert new_changelog[0] == "## actions 0.2.0\n" + assert release_notes[:3] == ["\n", "development version notes go here\n", "\n"] + assert "## actions 0.1.0\n" in release_notes + + def test_get_changelog_lines_sinclair(data_dir_rel): new_changelog, release_notes = get_changelog_lines( "0.3.0", @@ -175,6 +186,14 @@ def test_get_release_version(): ) == "v1.10.0" ) + assert ( + get_release_version( + next_version_manual="v0.1.0", + next_version_convco="", + current_version="", + ) + == "v0.1.0" + ) assert ( get_release_version( next_version_manual="v1.10.0", @@ -185,6 +204,16 @@ def test_get_release_version(): ) +def test_get_release_version_first_release_missing_manual(): + with pytest.raises(ValueError) as exc_info: + get_release_version( + next_version_manual="", + next_version_convco="", + current_version="", + ) + assert "Unable to determine next release version" in str(exc_info.value) + + def test_get_release_version_warning(): with warnings.catch_warnings(): warnings.simplefilter("error") @@ -349,15 +378,17 @@ def test_prepare_draft_release_r_package(github_output_file, tmp_path, data_dir) def test_prepare_draft_release_warns_on_autoformat_trigger_failure( - github_output_file, tmp_path, monkeypatch + github_output_file, tmp_path, monkeypatch, data_dir ): changelog_file = tmp_path / "CHANGELOG.md" version_file = tmp_path / "VERSION" + citation_file = tmp_path / "CITATION.cff" notes_file = tmp_path / "latest-release.md" changelog_file.write_text( "## actions development version\n\nnotes\n\n## actions 0.1.0\n" ) version_file.write_text("0.1.0\n") + citation_file.write_text((data_dir / "CITATION.cff").read_text()) monkeypatch.setattr("ccbr_actions.release.precommit_run", lambda *_: None) monkeypatch.setattr( @@ -386,7 +417,7 @@ def _trigger_workflow_raises(**_): changelog_filepath=str(changelog_file), release_notes_filepath=str(notes_file), version_filepath=str(version_file), - citation_filepath="not/a/file/CITATION.cff", + citation_filepath=str(citation_file), release_branch="release-draft", pr_ref_name="feature/branch", repo="CCBR/actions", From 7763ed846a1977f5f71fd9550e279bf57a5ce400 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:44:19 +0000 Subject: [PATCH 3/9] docs(release): clarify first-release version-tag guidance --- draft-release/README.md | 7 ++++--- draft-release/README.qmd | 7 ++++--- src/ccbr_actions/release.py | 12 +++++++++--- tests/test_release.py | 8 ++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/draft-release/README.md b/draft-release/README.md index 16cd21e..f6261be 100644 --- a/draft-release/README.md +++ b/draft-release/README.md @@ -25,9 +25,10 @@ Input files: phrase “development version”. - `VERSION` - a single-source version file. - `CITATION.cff` - a citation file. -- For a repository's first release, set `version-tag` manually (for - example `v0.1.0`), because conventional-commit version detection may - not have a previous release to compare against. + +For a repository’s first release, set `version-tag` manually (for +example `v0.1.0`), because conventional-commit version detection may not +have a previous release to compare against. When you’re ready to draft a new release, [run the workflow manually](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow). diff --git a/draft-release/README.qmd b/draft-release/README.qmd index fccf47b..437f19e 100644 --- a/draft-release/README.qmd +++ b/draft-release/README.qmd @@ -31,9 +31,10 @@ Input files: - `CHANGELOG.md` - a changelog or news file with entries in reverse chronological order. The newest entry should contain a header with the phrase “development version”. - `VERSION` - a single-source version file. - `CITATION.cff` - a citation file. -- For a repository's first release, set `version-tag` manually (for example - `v0.1.0`), because conventional-commit version detection may not have a - previous release to compare against. + +For a repository's first release, set `version-tag` manually (for example +`v0.1.0`), because conventional-commit version detection may not have a +previous release to compare against. When you're ready to draft a new release, [run the workflow manually](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow). After the workflow completes, there will be a new draft release that you can review and choose to publish. diff --git a/src/ccbr_actions/release.py b/src/ccbr_actions/release.py index 63e6a9e..0b966a8 100644 --- a/src/ccbr_actions/release.py +++ b/src/ccbr_actions/release.py @@ -501,7 +501,8 @@ def get_release_version( if not next_version: raise ValueError( "Unable to determine next release version. " - "If this is the first release for this repository, provide version-tag." + "If this is the first release for this repository, provide a manual next version " + "(draft-release input: version-tag)." ) if not is_strict_semver(next_version, with_leading_v=with_leading_v): raise ValueError( @@ -512,7 +513,8 @@ def get_release_version( if not is_strict_semver(current_version, with_leading_v=with_leading_v): raise ValueError( f"Current version {current_version} does not match semantic versioning guidelines.\n" - "If this is the first release for this repository, set current version to blank and provide version-tag." + "If this is the first release for this repository, set current version to blank " + "and provide a manual next version (draft-release input: version-tag)." ) check_version_increments_by_one( current_version, next_version, with_leading_v=with_leading_v @@ -591,7 +593,11 @@ def get_changelog_lines( for line in infile: if line.startswith("#") and dev_header in line: line = line.replace(dev_header, next_version_strict) - elif latest_version_strict and latest_version_strict in line: + elif ( + latest_version_strict + and line.startswith("#") + and latest_version_strict in line + ): for_next = False changelog_lines.append(line) diff --git a/tests/test_release.py b/tests/test_release.py index 4ea6165..64556c9 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -194,6 +194,14 @@ def test_get_release_version(): ) == "v0.1.0" ) + assert ( + get_release_version( + next_version_manual="", + next_version_convco="v0.1.0", + current_version="", + ) + == "v0.1.0" + ) assert ( get_release_version( next_version_manual="v1.10.0", From 0f0c56fb5c2bd9481486f2193d52b67f02220cd0 Mon Sep 17 00:00:00 2001 From: CCBR-bot <258092125+ccbr-bot@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:07:02 +0000 Subject: [PATCH 4/9] =?UTF-8?q?ci:=20=F0=9F=A4=96=20render=20readme=20&=20?= =?UTF-8?q?format=20everything=20with=20pre-commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- draft-release/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-release/README.md b/draft-release/README.md index f6261be..1df3c11 100644 --- a/draft-release/README.md +++ b/draft-release/README.md @@ -113,7 +113,7 @@ steps: - `changelog-filepath`: Path to the changelog or news file. Default: `CHANGELOG.md`. - `citation-filepath`: Path to the citation file. Default: - `CITATION.cff`. This file must exist. + `CITATION.cff`. - `dev-header`: Header string to match to find the development version entry in the changelog, typically of the form ‘\## development version’. Default: `development version`. From 4280c87af84532f2e71f4dbf82bef14c85c66099 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Jun 2026 15:43:14 +0000 Subject: [PATCH 5/9] fix(release): raise ValueError when next_version_strict is blank --- src/ccbr_actions/release.py | 4 +++- tests/test_release.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ccbr_actions/release.py b/src/ccbr_actions/release.py index 0211430..8759f5b 100644 --- a/src/ccbr_actions/release.py +++ b/src/ccbr_actions/release.py @@ -575,8 +575,10 @@ def get_changelog_lines( - next_release_lines (list): The list of lines that pertain to the next release. Raises: - ValueError: If any of the provided version strings do not match the semantic versioning pattern. + ValueError: If next_version_strict is blank or if any of the provided version strings do not match the semantic versioning pattern. """ + if not next_version_strict: + raise ValueError("next_version_strict must not be blank") for version in [latest_version_strict, next_version_strict]: if not version: continue diff --git a/tests/test_release.py b/tests/test_release.py index fc7e0d2..f99524a 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -170,12 +170,19 @@ def test_get_changelog_lines_error(data_dir_rel): "alpha-0.2.0", changelog_filepath=str(data_dir_rel / "example_changelog.md"), ) + with pytest.raises(ValueError) as exc_info3: + get_changelog_lines( + "0.1.0", + "", + changelog_filepath=str(data_dir_rel / "example_changelog.md"), + ) assert "Version 0.1..9000 does not match semantic versioning pattern" in str( exc_info1.value ) assert "Version alpha-0.2.0 does not match semantic versioning pattern" in str( exc_info2.value ) + assert "next_version_strict must not be blank" in str(exc_info3.value) def test_get_release_version(): From 4f5152215ff7ce83fde075700a9f0f91ee66a961 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Jun 2026 15:44:12 +0000 Subject: [PATCH 6/9] refactor(release): simplify version validation in get_changelog_lines --- src/ccbr_actions/release.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ccbr_actions/release.py b/src/ccbr_actions/release.py index 8759f5b..ac0ec76 100644 --- a/src/ccbr_actions/release.py +++ b/src/ccbr_actions/release.py @@ -579,13 +579,14 @@ def get_changelog_lines( """ if not next_version_strict: raise ValueError("next_version_strict must not be blank") - for version in [latest_version_strict, next_version_strict]: - if not version: - continue - if not match_semver(version): - raise ValueError( - f"Version {version} does not match semantic versioning pattern" - ) + if not match_semver(next_version_strict): + raise ValueError( + f"Version {next_version_strict} does not match semantic versioning pattern" + ) + if latest_version_strict and not match_semver(latest_version_strict): + raise ValueError( + f"Version {latest_version_strict} does not match semantic versioning pattern" + ) changelog_lines = list() next_release_lines = list() for_next = True From 61a190debd850b656f9cef31e9078bb9af93f5f1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:26:15 +0000 Subject: [PATCH 7/9] test(release): add R package missing-NEWS and first-release coverage --- codemeta.json | 9 +++--- tests/test_release.py | 68 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/codemeta.json b/codemeta.json index a66073e..777869b 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "@type": "Person", "affiliation": { "@type": "Organization", - "legalName": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" + "name": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" }, "familyName": "Sovacool", "givenName": "Kelly" @@ -17,17 +17,16 @@ "@type": "Person", "affiliation": { "@type": "Organization", - "legalName": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" + "name": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" }, "familyName": "Koparde", "givenName": "Vishal" } ], "codeRepository": "https://github.com/CCBR/actions", - "datePublished": "2026-06-22", - "identifier": "https://doi.org/10.5281/zenodo.13761059", + "datePublished": "2026-07-02", "license": "https://spdx.org/licenses/MIT", "name": "CCBR actions: GitHub Actions for CCBR repos", "url": "https://ccbr.github.io/actions/", - "version": "v0.7.1" + "version": "v0.2.0" } diff --git a/tests/test_release.py b/tests/test_release.py index f99524a..9350ccd 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -394,6 +394,74 @@ def test_prepare_draft_release_r_package(github_output_file, tmp_path, data_dir) assert str(description_filepath) in output +def test_prepare_draft_release_r_package_missing_news( + github_output_file, tmp_path, data_dir +): + repo_dir = tmp_path / "repo" + repo_dir.mkdir() + description_filepath = repo_dir / "DESCRIPTION" + description_filepath.write_text("Package: mypkg\nVersion: 0.1.0\nTitle: Example\n") + (repo_dir / "CITATION.cff").write_text((data_dir / "CITATION.cff").read_text()) + # NEWS.md intentionally absent + original_cwd = os.getcwd() + os.chdir(repo_dir) + try: + with pytest.raises(FileNotFoundError) as exc_info: + prepare_draft_release( + next_version_manual="v0.2.0", + current_version="v0.1.0", + gh_event_name="push", + changelog_filepath="CHANGELOG.md", + citation_filepath="CITATION.cff", + description_filepath=str(description_filepath), + debug=True, + ) + finally: + os.chdir(original_cwd) + assert "Missing required release file(s)" in str(exc_info.value) + assert "changelog" in str(exc_info.value) + assert "NEWS" in str(exc_info.value) + + +def test_prepare_draft_release_r_package_first_release( + github_output_file, tmp_path, data_dir +): + repo_dir = tmp_path / "repo" + repo_dir.mkdir() + original_cwd = os.getcwd() + os.chdir(repo_dir) + shell_run("git init > /dev/null 2>&1") + shell_run( + "git -c user.name=ci -c user.email=ci@example.com commit --allow-empty -m 'initial commit' > /dev/null 2>&1" + ) + (repo_dir / "NEWS.md").write_text( + "## mypkg development version\n\nnotes\n" + ) + description_filepath = repo_dir / "DESCRIPTION" + description_filepath.write_text("Package: mypkg\nVersion: 0.1.0\nTitle: Example\n") + (repo_dir / "CITATION.cff").write_text((data_dir / "CITATION.cff").read_text()) + try: + output = exec_in_context( + prepare_draft_release, + next_version_manual="v0.1.0", + next_version_convco="", + current_version="", # first release + gh_event_name="push", + changelog_filepath="CHANGELOG.md", + release_notes_filepath=".github/latest-release.md", + version_filepath="VERSION", + citation_filepath="CITATION.cff", + description_filepath=str(description_filepath), + repo="CCBR/mypkg", + debug=True, + ) + finally: + os.chdir(original_cwd) + assert "NEWS.md" in output + assert "DESCRIPTION" in output + assert "Version: 0.1.0" in output + + def test_prepare_draft_release_warns_on_autoformat_trigger_failure( github_output_file, tmp_path, monkeypatch, data_dir ): From c56c6cbede55a9b7b3e4cf86a6260d98f6f0bf1f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:45:28 +0000 Subject: [PATCH 8/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_release.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_release.py b/tests/test_release.py index 9350ccd..b5ce858 100644 --- a/tests/test_release.py +++ b/tests/test_release.py @@ -434,9 +434,7 @@ def test_prepare_draft_release_r_package_first_release( shell_run( "git -c user.name=ci -c user.email=ci@example.com commit --allow-empty -m 'initial commit' > /dev/null 2>&1" ) - (repo_dir / "NEWS.md").write_text( - "## mypkg development version\n\nnotes\n" - ) + (repo_dir / "NEWS.md").write_text("## mypkg development version\n\nnotes\n") description_filepath = repo_dir / "DESCRIPTION" description_filepath.write_text("Package: mypkg\nVersion: 0.1.0\nTitle: Example\n") (repo_dir / "CITATION.cff").write_text((data_dir / "CITATION.cff").read_text()) From ee2d5b71d2dfab99436f7de716f08a786cab0e29 Mon Sep 17 00:00:00 2001 From: CCBR-bot <258092125+ccbr-bot@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:49:16 +0000 Subject: [PATCH 9/9] =?UTF-8?q?ci:=20=F0=9F=A4=96=20render=20readme=20&=20?= =?UTF-8?q?format=20everything=20with=20pre-commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codemeta.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/codemeta.json b/codemeta.json index 777869b..a66073e 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "@type": "Person", "affiliation": { "@type": "Organization", - "name": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" + "legalName": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" }, "familyName": "Sovacool", "givenName": "Kelly" @@ -17,16 +17,17 @@ "@type": "Person", "affiliation": { "@type": "Organization", - "name": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" + "legalName": "Advanced Biomedical Computational Science, Frederick National Laboratory for Cancer Research, Frederick, MD 21702, USA" }, "familyName": "Koparde", "givenName": "Vishal" } ], "codeRepository": "https://github.com/CCBR/actions", - "datePublished": "2026-07-02", + "datePublished": "2026-06-22", + "identifier": "https://doi.org/10.5281/zenodo.13761059", "license": "https://spdx.org/licenses/MIT", "name": "CCBR actions: GitHub Actions for CCBR repos", "url": "https://ccbr.github.io/actions/", - "version": "v0.2.0" + "version": "v0.7.1" }