From 1ab8bc4822e797ea4f944637d49406513ea218f9 Mon Sep 17 00:00:00 2001 From: Kirill <106469980+waterflane@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:26:29 +0300 Subject: [PATCH 1/2] Update banner image in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c78936..f0f4511 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- ContextForge — Build bounded, reviewable context for coding agents. + ContextForge — Build bounded, reviewable context for coding agents.

ContextForge

From 2bb16640461c53f8fb7869296a5da6e28541a8d2 Mon Sep 17 00:00:00 2001 From: Kirill <106469980+waterflane@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:43:19 +0300 Subject: [PATCH 2/2] fix(release): prepare 0.4.2.post1 hotfix --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/workflows/release.yml | 4 ++-- CHANGELOG.md | 13 +++++++++++-- README.md | 8 ++++---- ROADMAP.md | 5 ++++- docs/RELEASE_CHECKLIST.md | 3 ++- src/contextforge/_metadata.py | 2 +- tests/test_openai_compatible.py | 10 ++++++---- 8 files changed, 31 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2490aac..889186a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -40,7 +40,7 @@ body: id: version attributes: label: ContextForge version - placeholder: "0.4.2" + placeholder: "0.4.2.post1" validations: required: true - type: input diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce3f3cc..54b2d9e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: tag: - description: Existing signed annotated tag to publish (for example v0.4.2) + description: Existing signed annotated tag to publish (for example v0.4.2.post1) required: true type: string @@ -49,7 +49,7 @@ jobs: run: | case "$TAG" in v[0-9]*.[0-9]*.[0-9]*) ;; - *) echo "tag must match vX.Y.Z" >&2; exit 1 ;; + *) echo "tag must match vX.Y.Z or a PEP 440 post release such as vX.Y.Z.postN" >&2; exit 1 ;; esac test "$(git cat-file -t "refs/tags/$TAG")" = "tag" test "$(git rev-parse "$TAG^{}")" = "$GITHUB_SHA" diff --git a/CHANGELOG.md b/CHANGELOG.md index d9c1373..7f8db23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,20 @@ 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 follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +Feature releases follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html), +and Python distribution versions follow PEP 440. ## [Unreleased] +## [0.4.2.post1] - 2026-08-21 + +### Fixed + +- Made the CLI help regression validation insensitive to ANSI terminal styling + so the same documented options are verified consistently on Linux and + Windows CI runners. + ## [0.4.2] - 2026-08-21 ### Added diff --git a/README.md b/README.md index f0f4511..d363f97 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,10 @@ commands.

> [!IMPORTANT] -> ContextForge is pre-alpha software. Version `0.4.2` is the first public-release -> candidate. Discovery benchmarking is experimental and its results should be -> reviewed alongside the recorded provider, model, configuration, and source -> snapshot. +> ContextForge is pre-alpha software. Version `0.4.2.post1` is the corrected +> first public-release candidate. Discovery benchmarking is experimental and +> its results should be reviewed alongside the recorded provider, model, +> configuration, and source snapshot. ## Why ContextForge diff --git a/ROADMAP.md b/ROADMAP.md index 4353776..41ec208 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -55,7 +55,10 @@ This roadmap describes broad milestones only. It does not promise dates. fixed source, index, model, and context-window provenance. - [x] Add locked distribution builds, clean-install validation, SBOM generation, Trusted Publishing workflows, and public contribution/security policies. -- [ ] Publish the reviewed signed release through TestPyPI and PyPI. +- [x] Correct ANSI-sensitive CLI help validation for consistent Linux and + Windows release CI. +- [ ] Publish the reviewed signed `v0.4.2.post1` release through TestPyPI and + PyPI. ## Later diff --git a/docs/RELEASE_CHECKLIST.md b/docs/RELEASE_CHECKLIST.md index 539e817..2c0f5a2 100644 --- a/docs/RELEASE_CHECKLIST.md +++ b/docs/RELEASE_CHECKLIST.md @@ -97,7 +97,8 @@ uv run contextforge benchmark discovery 'C:\Repositories' ` - [ ] Merge the reviewed release pull request from `dev` into `main`. - [ ] Verify the exact merge commit contains the intended version and changelog. -- [ ] Create a signed annotated `vX.Y.Z` tag on that exact commit. +- [ ] Create a signed annotated `vX.Y.Z` tag on that exact commit, or + `vX.Y.Z.postN` for a PEP 440 post release. - [ ] Push the tag without rewriting earlier tags. - [ ] Synchronize `dev` with the released `main`. diff --git a/src/contextforge/_metadata.py b/src/contextforge/_metadata.py index 5a7dd42..ccef8fd 100644 --- a/src/contextforge/_metadata.py +++ b/src/contextforge/_metadata.py @@ -3,4 +3,4 @@ APP_NAME = "ContextForge" APP_SLUG = "contextforge" APP_TAGLINE = "Build bounded, reviewable repository context for coding agents." -__version__ = "0.4.2" +__version__ = "0.4.2.post1" diff --git a/tests/test_openai_compatible.py b/tests/test_openai_compatible.py index 411990a..5aab9ca 100644 --- a/tests/test_openai_compatible.py +++ b/tests/test_openai_compatible.py @@ -6,6 +6,7 @@ from typing import Any, Literal import pytest +from click import unstyle from pydantic import BaseModel, ConfigDict from typer.testing import CliRunner @@ -658,10 +659,11 @@ def test_cli_help_and_provider_selection_include_base_url(tmp_path: Path) -> Non ) assert help_result.exit_code == 0 - assert "--base-url" in help_result.output - assert "--request-timeout" in help_result.output - assert "--context-window" in help_result.output - assert "--max-output-tokens" in help_result.output + help_output = unstyle(help_result.output) + assert "--base-url" in help_output + assert "--request-timeout" in help_output + assert "--context-window" in help_output + assert "--max-output-tokens" in help_output assert selected.exit_code == 1 assert "OpenAI-compatible base URL must be an HTTP URL" in selected.output