Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand Down
2 changes: 2 additions & 0 deletions docs/en/release-notes/breaking-changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 (`<shell> -c`, or PowerShell
Expand Down
2 changes: 1 addition & 1 deletion packages/linux-installer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/`:
Expand Down
9 changes: 8 additions & 1 deletion scripts/release.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <old>` flag examples (the documented
§3 exception) so they stay shape-only — the lockstep test enforces this.
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions tests/test_release_py.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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
7 changes: 7 additions & 0 deletions tests/test_version_lockstep.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading