diff --git a/README.md b/README.md index 0851be86..4248848c 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,8 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr ## ๐Ÿ†• What's New in 0.62.0 -- **A faster, steadier interactive prompt.** Slash commands and file mentions now share one completion engine, workspace indexing runs asynchronously, prompt resources are isolated per session, and awaited lifecycle cleanup prevents stale background work. The prompt also stays within the terminal height and avoids queued-input ghost borders. -- **More provider login options with safer persistence.** Pythinker adds OAuth login for xAI Grok, GitHub Copilot, DigitalOcean Gradient AI, and Snowflake Cortex, backed by a provider-neutral models.dev catalog with curated fallbacks. Credential changes are saved atomically and rolled back if persistence fails. -- **Cleaner reasoning and agent activity.** Reasoning summaries no longer expose Markdown delimiters or duplicate terminal rows after refocus, while individual agents and parallel `RunAgents` calls render as a compact, payload-free activity tree with correctly nested subagent work. +- **Updates surface during long-running sessions.** Pythinker now checks periodically for newly available releases, shows each new update notice once per session, and bounds every check with a watchdog so a stalled attempt cannot prevent later retries. +- **Repository-local agent workflows stay local.** This checkout now treats its root `.agents/` directory as local agent configuration instead of version-controlled project content. Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.62.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest). diff --git a/docs/en/release-notes/breaking-changes.md b/docs/en/release-notes/breaking-changes.md index cfd23ecf..5837943f 100644 --- a/docs/en/release-notes/breaking-changes.md +++ b/docs/en/release-notes/breaking-changes.md @@ -6,6 +6,8 @@ This page documents breaking changes in Pythinker Code releases and provides mig ## 0.62.0 (2026-07-22) +No breaking changes. + ## 0.61.0 (2026-07-22) Shell-mode `!` commands now run through the configured shell (` -c`, or PowerShell diff --git a/packages/linux-installer/README.md b/packages/linux-installer/README.md index 8c74dbe1..2370d461 100644 --- a/packages/linux-installer/README.md +++ b/packages/linux-installer/README.md @@ -36,7 +36,7 @@ file at `/usr/share/doc/pythinker-code/LICENSE`. ## Build ```sh -bash packages/linux-installer/build.sh 0.60.0 +bash packages/linux-installer/build.sh 0.62.0 ``` Outputs to `dist/`: diff --git a/scripts/release.py b/scripts/release.py index 7011b27b..e1b96d48 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -132,7 +132,10 @@ def promote_changelog(path: Path, version: str, *, release_date: str) -> None: def rewrite_version_strings(text: str, *, old: str, new: str) -> str: - """Replace ONLY release-pattern occurrences of `old` with `new`. + """Update release-pattern versions to `new`. + + Most patterns replace `old`; canonical version-bearing commands are + normalized even when their current version is already stale. Deliberately skips `--version ` flag examples (the documented ยง3 exception) so they stay shape-only โ€” the lockstep test enforces this. @@ -145,6 +148,10 @@ def rewrite_version_strings(text: str, *, old: str, new: str) -> str: (rf"(pythinker-code_){o}(_[a-z0-9]+\.deb)", rf"\g<1>{new}\g<2>"), (rf"(pythinker-code-){o}(\.[a-z0-9_]+\.rpm)", rf"\g<1>{new}\g<2>"), (rf"(releases/download/v){o}(/)", rf"\g<1>{new}\g<2>"), + ( + r"(bash packages/linux-installer/build\.sh )\d+\.\d+\.\d+", + rf"\g<1>{new}", + ), ] for pat, repl in patterns: text = re.sub(pat, repl, text) diff --git a/tests/test_release_py.py b/tests/test_release_py.py index 574e2a1a..94670dc4 100644 --- a/tests/test_release_py.py +++ b/tests/test_release_py.py @@ -250,6 +250,7 @@ def test_rewrite_version_strings_targets_only_release_patterns() -> None: "pythinker-code_0.27.0_amd64.deb\n" "pythinker-code-0.27.0.x86_64.rpm\n" "releases/download/v0.27.0/pythinker-code_0.27.0_arm64.deb\n" + "bash packages/linux-installer/build.sh 0.26.0\n" "bash -s -- --version 0.27.0\n" # flag example: MUST be preserved ) out = release_tool.rewrite_version_strings(text, old="0.27.0", new="0.28.0") @@ -259,6 +260,7 @@ def test_rewrite_version_strings_targets_only_release_patterns() -> None: assert "pythinker-code_0.28.0_amd64.deb" in out assert "pythinker-code-0.28.0.x86_64.rpm" in out assert "releases/download/v0.28.0/pythinker-code_0.28.0_arm64.deb" in out + assert "bash packages/linux-installer/build.sh 0.28.0" in out # the flag example is the documented exception โ€” untouched assert "--version 0.27.0" in out assert "--version 0.28.0" not in out diff --git a/tests/test_version_lockstep.py b/tests/test_version_lockstep.py index 60592398..07285f7a 100644 --- a/tests/test_version_lockstep.py +++ b/tests/test_version_lockstep.py @@ -88,6 +88,13 @@ def test_asset_names_match_version_across_files() -> None: assert found == VERSION, f"{path}: {found} != {VERSION}" +def test_linux_installer_build_example_matches_version() -> None: + readme = (REPO_ROOT / "packages" / "linux-installer" / "README.md").read_text(encoding="utf-8") + versions = re.findall(r"bash packages/linux-installer/build\.sh (\d+\.\d+\.\d+)", readme) + assert versions, "missing Linux installer build example" + assert versions == [VERSION] + + def test_no_hardcoded_version_badge_in_readme() -> None: # Guard the contract's "badges" clause: the only version-bearing badge is the # shields.io-live PyPI badge (img.shields.io/pypi/v/...). Fail if a future edit