From 465f05d20a172b1525e72bc01a15a3cd872b0fec Mon Sep 17 00:00:00 2001 From: elkaix Date: Thu, 24 Sep 2026 17:05:23 -0400 Subject: [PATCH 1/2] chore: rebrand Pythoughts-labs references to PyModel The GitHub org is now PyModel. Point repository, release, tap, bucket, and docs-site URLs at PyModel, name PyModel as the developer, and keep migrating saved feedback repos from the old Pythoughts-labs defaults. The docs-pages gate compared against the old slug, so docs deploys had stopped. --- .github/ISSUE_TEMPLATE/1-bug-report.yml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/pull_request_template.md | 4 +- .../dispatch-pythinker-home-sync.yml | 2 +- .github/workflows/docs-pages.yml | 2 +- .github/workflows/homebrew-tap.yml | 8 +-- .github/workflows/promote-release.yml | 6 +- .github/workflows/scoop-bucket.yml | 8 +-- .github/workflows/winget.yml | 2 +- CHANGELOG.md | 4 +- CONTRIBUTING.md | 2 +- README.md | 64 +++++++++---------- SECURITY.md | 2 +- docs/.vitepress/config.ts | 2 +- docs/en/guides/getting-started.md | 4 +- docs/en/index.md | 2 +- docs/en/reference/pythinker-info.md | 4 +- docs/history/CHANGELOG-pre-0.8.0.md | 2 +- docs/public/install.ps1 | 2 +- docs/public/install.sh | 2 +- examples/feedback-worker/wrangler.jsonc | 2 +- packages/homebrew-tap/README.md | 8 +-- packages/homebrew-tap/generate-formula.py | 2 +- packages/linux-installer/README.md | 8 +-- packages/linux-installer/build.sh | 2 +- packages/pythinker-core/pyproject.toml | 8 +-- .../contrib/chat_provider/openai_legacy.py | 2 +- .../api_snapshot_tests/test_openai_legacy.py | 2 +- packages/pythinker-host/pyproject.toml | 8 +-- packages/pythinker-review/pyproject.toml | 4 +- .../src/pythinker_review/output/sarif.py | 2 +- packages/scoop-bucket/generate-manifest.py | 2 +- .../scoop-bucket/pythinker-code.json.tmpl | 4 +- packages/windows-installer/installer.iss | 4 +- pyproject.toml | 14 ++-- scripts/install-native.sh | 2 +- scripts/install.ps1 | 2 +- sdks/pythinker-sdk/pyproject.toml | 8 +-- .../agents/default/partials/identity_core.md | 2 +- src/pythinker_code/agents/default/system.md | 2 +- .../agents/default/system_leaf.md | 2 +- src/pythinker_code/cli/__init__.py | 4 +- src/pythinker_code/constant.py | 4 +- src/pythinker_code/feedback_repo.py | 3 +- src/pythinker_code/llm.py | 2 +- src/pythinker_code/native.py | 2 +- .../skills/pythinker-code-help/SKILL.md | 8 +-- src/pythinker_code/ui/shell/slash.py | 4 +- src/pythinker_code/ui/shell/update.py | 7 +- tests/core/test_config.py | 20 ++++-- tests/core/test_default_agent.py | 4 +- tests/core/test_simple_compaction.py | 4 +- tests/test_installation_docs.py | 9 +-- tests/test_native.py | 2 +- tests/test_release_update_pipeline.py | 2 +- .../ui_and_conv/test_shell_feedback_slash.py | 12 ++-- tests/ui_and_conv/test_shell_update.py | 34 +++++----- web/public/install.ps1 | 2 +- web/public/install.sh | 2 +- 59 files changed, 175 insertions(+), 166 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml index a3637e4a2..d98da91be 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -9,7 +9,7 @@ body: value: | Thank you for submitting a bug report! It helps make Pythinker Code better for everyone. - If you need help or support using Pythinker Code, and are not reporting a bug, please post on [pythinker-cli/discussions](https://github.com/Pythoughts-labs/pythinker-cli/discussions), where you can ask questions or engage with others on ideas for how to improve Pythinker Code. + If you need help or support using Pythinker Code, and are not reporting a bug, please post on [pythinker-cli/discussions](https://github.com/PyModel/pythinker-cli/discussions), where you can ask questions or engage with others on ideas for how to improve Pythinker Code. Make sure you are running the latest version of Pythinker Code (`uv tool upgrade pythinker-code` to upgrade). The bug you are experiencing may already have been fixed. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index ef3acd5df..847be783b 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: true contact_links: - name: Questions and General Discussion - url: https://github.com/Pythoughts-labs/pythinker-cli/discussions + url: https://github.com/PyModel/pythinker-cli/discussions about: Have questions? Welcome to open a discussion! diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 019355eab..07154ca77 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,7 +3,7 @@ Thank you for your contribution to Pythinker Code! Please make sure you already discussed the feature or bugfix you are proposing in an issue with the maintainers. Please understand that if you have not gotten confirmation from the maintainers, your pull request may be closed or ignored without further review due to limited bandwidth. -See https://github.com/Pythoughts-labs/pythinker-cli/blob/main/CONTRIBUTING.md for more. +See https://github.com/PyModel/pythinker-cli/blob/main/CONTRIBUTING.md for more. --> ## Related Issue @@ -18,7 +18,7 @@ Resolve #(issue_number) ## Checklist -- [ ] I have read the [CONTRIBUTING](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/CONTRIBUTING.md) document. +- [ ] I have read the [CONTRIBUTING](https://github.com/PyModel/pythinker-cli/blob/main/CONTRIBUTING.md) document. - [ ] I have linked the related issue, if any. - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have run `make gen-changelog` to update the changelog. diff --git a/.github/workflows/dispatch-pythinker-home-sync.yml b/.github/workflows/dispatch-pythinker-home-sync.yml index 460fd1c21..10277f7b3 100644 --- a/.github/workflows/dispatch-pythinker-home-sync.yml +++ b/.github/workflows/dispatch-pythinker-home-sync.yml @@ -29,7 +29,7 @@ jobs: permissions: contents: read env: - DISPATCH_OWNER: Pythoughts-labs + DISPATCH_OWNER: PyModel DISPATCH_REPO: pythinker-home steps: # Mint a short-lived installation token for the org-owned diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml index 2c2235980..39441baf3 100644 --- a/.github/workflows/docs-pages.yml +++ b/.github/workflows/docs-pages.yml @@ -21,7 +21,7 @@ concurrency: jobs: build: # Only run on the original repository, not on forks - if: github.repository == 'Pythoughts-labs/pythinker-cli' + if: github.repository == 'PyModel/pythinker-cli' runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/.github/workflows/homebrew-tap.yml b/.github/workflows/homebrew-tap.yml index 82cd8217d..362a65b88 100644 --- a/.github/workflows/homebrew-tap.yml +++ b/.github/workflows/homebrew-tap.yml @@ -24,7 +24,7 @@ jobs: permissions: contents: read env: - TAP_OWNER: Pythoughts-labs + TAP_OWNER: PyModel TAP_REPO: homebrew-pythinker steps: - name: Checkout source repo @@ -158,14 +158,14 @@ jobs: cat > README.md </dev/null || true) if grep -qF "version \"${version}\"" <<<"$formula_text"; then echo "Homebrew tap is at ${version}. ✓" @@ -214,7 +214,7 @@ jobs: with: app-id: ${{ secrets.PYTHINKER_RELEASE_BOT_APP_ID }} private-key: ${{ secrets.PYTHINKER_RELEASE_BOT_APP_PRIVATE_KEY }} - owner: Pythoughts-labs + owner: PyModel repositories: pythinker-home permission-contents: write @@ -224,7 +224,7 @@ jobs: TOKEN_OUTCOME: ${{ steps.app-token.outcome }} SOURCE_REPO: ${{ github.repository }} RELEASE_TAG: ${{ steps.tag.outputs.tag }} - DISPATCH_OWNER: Pythoughts-labs + DISPATCH_OWNER: PyModel DISPATCH_REPO: pythinker-home SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/.github/workflows/scoop-bucket.yml b/.github/workflows/scoop-bucket.yml index 30791c094..725f52683 100644 --- a/.github/workflows/scoop-bucket.yml +++ b/.github/workflows/scoop-bucket.yml @@ -24,7 +24,7 @@ jobs: permissions: contents: read env: - BUCKET_OWNER: Pythoughts-labs + BUCKET_OWNER: PyModel BUCKET_REPO: scoop-pythinker steps: - name: Checkout source repo @@ -129,15 +129,15 @@ jobs: cat > README.md <<'EOF' # scoop-pythinker - Scoop bucket for [Pythinker Code](https://github.com/Pythoughts-labs/pythinker-cli). + Scoop bucket for [Pythinker Code](https://github.com/PyModel/pythinker-cli). ```pwsh - scoop bucket add pythinker https://github.com/Pythoughts-labs/scoop-pythinker + scoop bucket add pythinker https://github.com/PyModel/scoop-pythinker scoop install pythinker-code ``` This bucket is auto-updated by the - [scoop-bucket.yml](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/.github/workflows/scoop-bucket.yml) + [scoop-bucket.yml](https://github.com/PyModel/pythinker-cli/blob/main/.github/workflows/scoop-bucket.yml) workflow on every semver release tag. Do not hand-edit `bucket/*` — your edits will be overwritten on the next release. EOF diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml index 3e372523e..2984b2e7e 100644 --- a/.github/workflows/winget.yml +++ b/.github/workflows/winget.yml @@ -45,7 +45,7 @@ jobs: if (-not $env:WINGET_TOKEN) { throw "WINGET_SUBMIT_TOKEN is not configured" } - $installerUrl = "https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v$env:VERSION/PythinkerSetup-$env:VERSION.exe" + $installerUrl = "https://github.com/PyModel/pythinker-cli/releases/download/v$env:VERSION/PythinkerSetup-$env:VERSION.exe" $wingetCreateUrl = "https://github.com/microsoft/winget-create/releases/download/v1.12.8.0/wingetcreate.exe" $wingetCreateSha256 = "8BD738851B524885410112678E3771B341C5C716DE60FBBECB88AB0A363ED85D" Invoke-WebRequest -Uri $wingetCreateUrl -OutFile wingetcreate.exe diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a000f51f..fcb55eaf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,9 +15,9 @@ GitHub Releases page; `0.8.0` is the new starting line. ## Unreleased -- Migrate saved `feedback.github_repo` values of `Pythoughts-labs/pythinker-code` (the pre-rename bundled default) to `Pythoughts-labs/pythinker-cli` on config load, and point the built-in help skill's documentation URLs at the canonical `pythinker-cli` GitHub Pages path. +- Migrate saved `feedback.github_repo` values of `Pythoughts-labs/pythinker-code` and `Pythoughts-labs/pythinker-cli` (earlier bundled defaults) to `PyModel/pythinker-cli` on config load, and point the built-in help skill's documentation URLs at the canonical `pythinker-cli` GitHub Pages path. - Add `scripts/uninstall.ps1`, a Windows uninstaller served at `https://pythinker.com/uninstall.ps1` (`irm https://pythinker.com/uninstall.ps1 | iex`): runs a trusted Inno uninstaller (non-elevated, user-scope, known directory only), then sweeps PATH entries (user + system, kind-preserved), Start Menu shortcuts, uninstall registry keys (native 32/64-bit views), and owned stale installer temp dirs, and verifies final state with fail-closed semantics. Recursive deletion is snapshot-based and limited to known install dirs — registry-selected custom installs are never swept or executed automatically (they are reported for manual action) — registry-provided paths are canonicalized and rejected on roots/UNC/device/drive-relative/reparse-point components, processes are killed per-PID only from validated dirs with StartTime/path revalidation, and the script never self-elevates or calls `exit`, so piping through `iex` cannot close the host. User data under `%USERPROFILE%\.pythinker` is kept unless `PYTHINKER_PURGE_DATA=1` is set. -- Update all repository URLs and repo-slug constants to `Pythoughts-labs/pythinker-cli` after the GitHub repository rename (install scripts, updater, feedback default repo, docs, workflows, packaging). +- Update all repository URLs, repo-slug constants, Homebrew tap and Scoop bucket owners, and the documentation site URL (`pymodel.github.io/pythinker-cli`) to the PyModel GitHub org, and name PyModel as the developer in the system prompt, `pythinker info`, and package metadata. The docs-pages deploy gate now matches `PyModel/pythinker-cli`, so documentation deploys resume. - Retry the post-update smoke check briefly before recording `VERIFICATION_FAILED`, absorbing the Homebrew launcher-relink race that falsely failed successful upgrades, and print the verification failure on screen instead of leaving "Updated successfully!" as the last word when verification genuinely fails. ## 0.62.0 (2026-07-22) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1490fe570..b26927086 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thank you for being interested in contributing to Pythinker CLI! We welcome all kinds of contributions, including bug fixes, features, document improvements, typo fixes, etc. To maintain a high-quality codebase and user experience, we provide the following guidelines for contributions: -1. We only merge pull requests that align with our roadmap. For any pull request that introduces changes larger than 100 lines of code, we highly recommend discussing with us by [raising an issue](https://github.com/Pythoughts-labs/pythinker-cli/issues) or in an existing issue before you start working on it. Otherwise your pull request may be closed or ignored without review. +1. We only merge pull requests that align with our roadmap. For any pull request that introduces changes larger than 100 lines of code, we highly recommend discussing with us by [raising an issue](https://github.com/PyModel/pythinker-cli/issues) or in an existing issue before you start working on it. Otherwise your pull request may be closed or ignored without review. 2. We insist on high code quality. Please ensure your code is as good as, if not better than, the code written by frontier coding agents. Changes may be requested before your pull request can be merged. ## Prek hooks diff --git a/README.md b/README.md index 89eb815df..3cc219293 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Pythinker logo Pythinker Code +# Pythinker logo Pythinker Code ### *Think first, then code. Your terminal-native review-first AI engineering agent.* @@ -11,12 +11,12 @@ [![PyPI](https://img.shields.io/pypi/v/pythinker-code?style=for-the-badge&logo=pypi&logoColor=white&color=2563eb&label=pythinker-code)](https://pypi.org/project/pythinker-code/) [![Downloads](https://img.shields.io/pepy/dt/pythinker-code?style=for-the-badge&logo=python&logoColor=white&color=f97316&label=downloads)](https://pepy.tech/projects/pythinker-code) -[![License](https://img.shields.io/badge/License-Apache--2.0-16a34a.svg?style=for-the-badge)](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/LICENSE) +[![License](https://img.shields.io/badge/License-Apache--2.0-16a34a.svg?style=for-the-badge)](https://github.com/PyModel/pythinker-cli/blob/main/LICENSE) [![Ruff](https://img.shields.io/badge/code%20style-ruff-261230.svg?style=for-the-badge&logo=ruff&logoColor=d7ff64)](https://docs.astral.sh/ruff/) [![Homepage](https://img.shields.io/badge/home-pythinker.com-ec4899.svg?style=for-the-badge&logo=globe&logoColor=white)](https://pythinker.com) -[![CI](https://img.shields.io/github/actions/workflow/status/Pythoughts-labs/pythinker-cli/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/Pythoughts-labs/pythinker-cli/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain) -[![Python](https://img.shields.io/badge/Python-3.12%2B-3776ab?style=for-the-badge&logo=python&logoColor=white)](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/pyproject.toml) +[![CI](https://img.shields.io/github/actions/workflow/status/PyModel/pythinker-cli/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/PyModel/pythinker-cli/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain) +[![Python](https://img.shields.io/badge/Python-3.12%2B-3776ab?style=for-the-badge&logo=python&logoColor=white)](https://github.com/PyModel/pythinker-cli/blob/main/pyproject.toml)
@@ -30,7 +30,7 @@

-Pythinker Code terminal demo +Pythinker Code terminal demo
@@ -53,7 +53,7 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr - **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-cli/releases/latest). +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/PyModel/pythinker-cli/releases/latest). --- @@ -147,7 +147,7 @@ Run trusted local JSONL fixtures with `/benchmark:swe --dataset --trusted > Built-in shell commands such as `cd` are not yet supported in shell command mode.
-Shell command mode demo +Shell command mode demo
--- @@ -159,13 +159,13 @@ matches your OS — no Python, Node, or `uv` prerequisite. | Platform | Recommended install | Artifact source | |---|---|---| -| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.62.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-cli/releases/latest) | -| **macOS / Linux** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/Pythoughts-labs/pythinker-cli/releases/latest) | -| **macOS — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap | -| **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image | -| **🪟 Windows — Scoop** | `scoop bucket add pythinker https://github.com/Pythoughts-labs/scoop-pythinker && scoop install pythinker-code` | auto-published Scoop bucket | -| **❄️ Nix** | `nix run github:Pythoughts-labs/pythinker-cli` | flake `apps.default` | -| **Linux — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/Pythoughts-labs/pythinker-cli/releases/latest) | +| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.62.0.exe` from [Releases](https://github.com/PyModel/pythinker-cli/releases/latest) | +| **macOS / Linux** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/PyModel/pythinker-cli/releases/latest) | +| **macOS — Homebrew** | `brew install PyModel/pythinker/pythinker-code` | auto-published Homebrew tap | +| **🐳 Docker** | `docker run --rm -it ghcr.io/pymodel/pythinker-code` | GHCR multi-arch image | +| **🪟 Windows — Scoop** | `scoop bucket add pythinker https://github.com/PyModel/scoop-pythinker && scoop install pythinker-code` | auto-published Scoop bucket | +| **❄️ Nix** | `nix run github:PyModel/pythinker-cli` | flake `apps.default` | +| **Linux — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/PyModel/pythinker-cli/releases/latest) | | **🐍 Python fallback** | `pip install pythinker-code` | PyPI | Every artifact ships with a matching `.sha256` file — verify before install on @@ -230,9 +230,9 @@ Uninstall works too and reverts both the files and the PATH edit. ```sh # 1. Install -brew install Pythoughts-labs/pythinker/pythinker-code +brew install PyModel/pythinker/pythinker-code # Homebrew ≥ 5 may refuse the untrusted tap; trust it once, then re-run: -# brew trust pythoughts-labs/pythinker +# brew trust pymodel/pythinker # 2. Verify pythinker --version @@ -250,12 +250,12 @@ auto-update; run this whenever you want the latest). > **Untrusted-tap refusal** — Homebrew ≥ 5 (with `HOMEBREW_REQUIRE_TAP_TRUST`) > refuses third-party taps until you trust them once: -> `brew trust pythoughts-labs/pythinker`. The in-app updater detects the +> `brew trust pymodel/pythinker`. The in-app updater detects the > refusal and offers to run it for you. -**Uninstall:** `brew uninstall pythinker-code && brew untap Pythoughts-labs/pythinker`. +**Uninstall:** `brew uninstall pythinker-code && brew untap PyModel/pythinker`. -> The tap repo is [Pythoughts-labs/homebrew-pythinker](https://github.com/Pythoughts-labs/homebrew-pythinker) +> The tap repo is [PyModel/homebrew-pythinker](https://github.com/PyModel/homebrew-pythinker) > — auto-maintained, do not hand-edit. --- @@ -274,8 +274,8 @@ sudo apt-get install -f # only if dpkg reports missing deps sudo dpkg -i pythinker-code_0.62.0_arm64.deb # Fedora / RHEL / openSUSE (x86_64) -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm.sha256 +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm.sha256 sha256sum -c pythinker-code-0.62.0.x86_64.rpm.sha256 # Fedora / RHEL: sudo dnf install ./pythinker-code-0.62.0.x86_64.rpm @@ -283,8 +283,8 @@ sudo dnf install ./pythinker-code-0.62.0.x86_64.rpm sudo zypper install ./pythinker-code-0.62.0.x86_64.rpm # Fedora / RHEL (aarch64) -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.aarch64.rpm -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.aarch64.rpm.sha256 +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.aarch64.rpm +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.aarch64.rpm.sha256 sha256sum -c pythinker-code-0.62.0.aarch64.rpm.sha256 sudo dnf install ./pythinker-code-0.62.0.aarch64.rpm ``` @@ -377,7 +377,7 @@ pythinker login ```
-Pythinker login provider picker +Pythinker login provider picker
Z.AI exposes two independent OpenAI-compatible routes. Choose the route that owns your key; @@ -586,7 +586,7 @@ The ACP server provides: | 🔄 **Hot model swap** | Change models for a running ACP session |
-ACP IDE integration demo +ACP IDE integration demo
--- @@ -662,7 +662,7 @@ Pythinker is a small, extensible runtime — not a monolith. Build on it. ## 🏗️ Architecture
-Pythinker Code architecture diagram +Pythinker Code architecture diagram
--- @@ -742,7 +742,7 @@ are used automatically unless you turn telemetry off. ### 🏁 Prepare the workspace ```sh -git clone https://github.com/Pythoughts-labs/pythinker-cli.git +git clone https://github.com/PyModel/pythinker-cli.git cd pythinker-cli make prepare ``` @@ -823,9 +823,9 @@ pythinker-code/ Contributions are warmly welcome — bug reports, PRs, plugins, skills, and docs all help. -- 📖 Start with [`CONTRIBUTING.md`](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/CONTRIBUTING.md) -- 🔐 See [`SECURITY.md`](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/SECURITY.md) for responsible disclosure -- 📜 Skim [`AGENTS.md`](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/AGENTS.md) for the agent design notes +- 📖 Start with [`CONTRIBUTING.md`](https://github.com/PyModel/pythinker-cli/blob/main/CONTRIBUTING.md) +- 🔐 See [`SECURITY.md`](https://github.com/PyModel/pythinker-cli/blob/main/SECURITY.md) for responsible disclosure +- 📜 Skim [`AGENTS.md`](https://github.com/PyModel/pythinker-cli/blob/main/AGENTS.md) for the agent design notes If Pythinker helps you, **a ⭐ on GitHub goes a long way.** @@ -833,7 +833,7 @@ If Pythinker helps you, **a ⭐ on GitHub goes a long way.** ## 📜 License -Distributed under the **Apache-2.0 License**. See [`LICENSE`](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/LICENSE) for the full text and [`NOTICE`](https://github.com/Pythoughts-labs/pythinker-cli/blob/main/NOTICE) for attributions. +Distributed under the **Apache-2.0 License**. See [`LICENSE`](https://github.com/PyModel/pythinker-cli/blob/main/LICENSE) for the full text and [`NOTICE`](https://github.com/PyModel/pythinker-cli/blob/main/NOTICE) for attributions.
@@ -843,7 +843,7 @@ Distributed under the **Apache-2.0 License**. See [`LICENSE`](https://github.com [🌐 pythinker.com](https://pythinker.com)  ·  [📦 PyPI](https://pypi.org/project/pythinker-code/)  ·  -[🐙 GitHub](https://github.com/Pythoughts-labs/pythinker-cli)  ·  +[🐙 GitHub](https://github.com/PyModel/pythinker-cli)  ·  [🧩 ACP](https://github.com/agentclientprotocol/agent-client-protocol)  ·  [🔌 MCP](https://modelcontextprotocol.io/) diff --git a/SECURITY.md b/SECURITY.md index a41806014..71599c28c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,4 +6,4 @@ Currently, Pythinker CLI only provides security support for the latest version. ## Reporting a Vulnerability -Please report a vulnerability via the [Pythoughts-labs/pythinker-cli - Security](https://github.com/Pythoughts-labs/pythinker-cli/security) page, or open an [issue](https://github.com/Pythoughts-labs/pythinker-cli/issues) if it can be published publicly. +Please report a vulnerability via the [PyModel/pythinker-cli - Security](https://github.com/PyModel/pythinker-cli/security) page, or open an [issue](https://github.com/PyModel/pythinker-cli/issues) if it can be published publicly. diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index a9d94a52b..0ff20eff3 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -112,7 +112,7 @@ export default withMermaid(defineConfig({ outline: [2, 3], search: { provider: 'local' }, socialLinks: [ - { icon: 'github', link: 'https://github.com/Pythoughts-labs/pythinker-cli' }, + { icon: 'github', link: 'https://github.com/PyModel/pythinker-cli' }, ], }, diff --git a/docs/en/guides/getting-started.md b/docs/en/guides/getting-started.md index 6ec99c98c..1fc726241 100644 --- a/docs/en/guides/getting-started.md +++ b/docs/en/guides/getting-started.md @@ -17,7 +17,7 @@ Pythinker Code supports the following usage modes: - **[Agent integration (`pythinker acp`)](../reference/pythinker-acp.md)**: Run as a service and integrate with [IDEs](./ides.md) and other local agent clients via the [Agent Client Protocol] ::: info Tip -If you encounter issues or have suggestions, please provide feedback on [GitHub Issues](https://github.com/Pythoughts-labs/pythinker-cli/issues). +If you encounter issues or have suggestions, please provide feedback on [GitHub Issues](https://github.com/PyModel/pythinker-cli/issues). ::: [Agent Client Protocol]: https://agentclientprotocol.com/ @@ -44,7 +44,7 @@ On Windows, run the PowerShell bootstrap. It downloads the native installer, ver irm https://pythinker.com/install.ps1 | iex ``` -You can also download `PythinkerSetup-0.62.0.exe` manually from the [latest release](https://github.com/Pythoughts-labs/pythinker-cli/releases/latest). +You can also download `PythinkerSetup-0.62.0.exe` manually from the [latest release](https://github.com/PyModel/pythinker-cli/releases/latest). Verify the installation: diff --git a/docs/en/index.md b/docs/en/index.md index 13c5645c7..d55c624ae 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -10,5 +10,5 @@ hero: link: /en/guides/getting-started - theme: alt text: GitHub - link: https://github.com/Pythoughts-labs/pythinker-cli + link: https://github.com/PyModel/pythinker-cli --- diff --git a/docs/en/reference/pythinker-info.md b/docs/en/reference/pythinker-info.md index b1a8ba19d..a813c7dfb 100644 --- a/docs/en/reference/pythinker-info.md +++ b/docs/en/reference/pythinker-info.md @@ -29,7 +29,7 @@ pythinker info [--json] ```sh $ pythinker info pythinker-code version: 1.20.0 -developed by: Pythoughts-labs +developed by: PyModel agent spec versions: 1 wire protocol: 1.9 python version: 3.13.1 @@ -39,5 +39,5 @@ python version: 3.13.1 ```sh $ pythinker info --json -{"pythinker_code_version": "1.20.0", "organization": "Pythoughts-labs", "agent_spec_versions": ["1"], "wire_protocol_version": "1.9", "python_version": "3.13.1"} +{"pythinker_code_version": "1.20.0", "organization": "PyModel", "agent_spec_versions": ["1"], "wire_protocol_version": "1.9", "python_version": "3.13.1"} ``` diff --git a/docs/history/CHANGELOG-pre-0.8.0.md b/docs/history/CHANGELOG-pre-0.8.0.md index 3377be953..ed4b2bd6c 100644 --- a/docs/history/CHANGELOG-pre-0.8.0.md +++ b/docs/history/CHANGELOG-pre-0.8.0.md @@ -22,7 +22,7 @@ Packaging fix: pin `pythinker-core[contrib]==1.1.0` so the Kimi K2.x / DeepSeek ### Why 2.6.0 lands the same day as 2.5.0 -The runtime fix for the strict-interleaved `thinking is enabled but reasoning_content is missing in assistant tool call message at index N` rejection landed in the `pythinker-core` source tree on 2026-05-11 (released in `pythinker-code` 2.4.0 source), but **the published `pythinker-core==1.0.0` on PyPI predates that change** (uploaded 2026-05-07). `pythinker-code` 2.4.0 and 2.5.0 both pinned `pythinker-core[contrib]==1.0.0`, so PyPI users on Kimi K2.5 / K2.6 / DeepSeek through OpenCode Go (and elsewhere) kept hitting the bug even on the latest CLI. Reported in [#37](https://github.com/Pythoughts-labs/pythinker-cli/issues/37). +The runtime fix for the strict-interleaved `thinking is enabled but reasoning_content is missing in assistant tool call message at index N` rejection landed in the `pythinker-core` source tree on 2026-05-11 (released in `pythinker-code` 2.4.0 source), but **the published `pythinker-core==1.0.0` on PyPI predates that change** (uploaded 2026-05-07). `pythinker-code` 2.4.0 and 2.5.0 both pinned `pythinker-core[contrib]==1.0.0`, so PyPI users on Kimi K2.5 / K2.6 / DeepSeek through OpenCode Go (and elsewhere) kept hitting the bug even on the latest CLI. Reported in [#37](https://github.com/PyModel/pythinker-cli/issues/37). ### The fix diff --git a/docs/public/install.ps1 b/docs/public/install.ps1 index a118158bd..1ca67a43e 100644 --- a/docs/public/install.ps1 +++ b/docs/public/install.ps1 @@ -14,7 +14,7 @@ $ErrorActionPreference = "Stop" try { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 } catch {} try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } catch {} -$Repo = "Pythoughts-labs/pythinker-cli" +$Repo = "PyModel/pythinker-cli" $Version = $env:PYTHINKER_VERSION $NoColor = $env:NO_COLOR diff --git a/docs/public/install.sh b/docs/public/install.sh index f7f0944d5..bc4b9d02a 100755 --- a/docs/public/install.sh +++ b/docs/public/install.sh @@ -69,7 +69,7 @@ while [[ $# -gt 0 ]]; do esac done -REPO="Pythoughts-labs/pythinker-cli" +REPO="PyModel/pythinker-cli" if [ -t 1 ] && [ -z "$NO_COLOR" ] && [ "${TERM:-}" != "dumb" ]; then NAVY=$'\033[38;5;24m'; FACE=$'\033[38;5;255m' diff --git a/examples/feedback-worker/wrangler.jsonc b/examples/feedback-worker/wrangler.jsonc index 341fb0f2d..a166ae293 100644 --- a/examples/feedback-worker/wrangler.jsonc +++ b/examples/feedback-worker/wrangler.jsonc @@ -10,7 +10,7 @@ } ], "vars": { - "GITHUB_REPO": "Pythoughts-labs/pythinker-cli", + "GITHUB_REPO": "PyModel/pythinker-cli", "GITHUB_LABELS": "feedback,pythinker-cli", "SUPPORT_EMAIL": "support@pythinker.com", "FROM_EMAIL": "Pythinker Feedback " diff --git a/packages/homebrew-tap/README.md b/packages/homebrew-tap/README.md index 3e420c3e7..5abc08eb1 100644 --- a/packages/homebrew-tap/README.md +++ b/packages/homebrew-tap/README.md @@ -11,7 +11,7 @@ auto-regenerates the formula and pushes it to the tap repo. ## End-user install (post-setup) ```sh -brew install Pythoughts-labs/pythinker/pythinker-code +brew install PyModel/pythinker/pythinker-code ``` Works on macOS (Intel + Apple Silicon) and Linux (x86_64 + aarch64) — same @@ -32,10 +32,10 @@ matches Anthropic's published advice for Claude Code's Homebrew cask.) 1. **Create the tap repo.** Create a new empty GitHub repo named `homebrew-pythinker` under your account. The `homebrew-` prefix is required by Homebrew; the part after the dash becomes the tap name - (so `brew tap Pythoughts-labs/pythinker`). + (so `brew tap PyModel/pythinker`). ```sh - gh repo create Pythoughts-labs/homebrew-pythinker \ + gh repo create PyModel/homebrew-pythinker \ --public \ --description "Homebrew tap for Pythinker Code" \ --enable-issues=false @@ -56,7 +56,7 @@ That's it. The next `v*.*.*` tag push to `Pythinker-Code` will: 1. Wait for native GitHub Release tarballs to be attached. 2. Render `Formula/pythinker-code.rb` from `pythinker-code.rb.tmpl` with the release URLs and SHA-256 digests. -3. Commit + push the formula to `Pythoughts-labs/homebrew-pythinker` on +3. Commit + push the formula to `PyModel/homebrew-pythinker` on `main` (creating the inaugural commit on first run). 4. Brew users get the new release via `brew upgrade pythinker-code`. diff --git a/packages/homebrew-tap/generate-formula.py b/packages/homebrew-tap/generate-formula.py index 00bcd9250..50680cc8a 100644 --- a/packages/homebrew-tap/generate-formula.py +++ b/packages/homebrew-tap/generate-formula.py @@ -24,7 +24,7 @@ from pathlib import Path from typing import Any -GITHUB_REPO = "Pythoughts-labs/pythinker-cli" +GITHUB_REPO = "PyModel/pythinker-cli" GITHUB_RELEASE_API = f"https://api.github.com/repos/{GITHUB_REPO}/releases/tags/v{{version}}" diff --git a/packages/linux-installer/README.md b/packages/linux-installer/README.md index 8b4d1abf9..717e3874b 100644 --- a/packages/linux-installer/README.md +++ b/packages/linux-installer/README.md @@ -8,15 +8,15 @@ End-user install from the current GitHub Release: ```sh # Debian / Ubuntu -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code_0.62.0_amd64.deb -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code_0.62.0_amd64.deb.sha256 +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code_0.62.0_amd64.deb +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code_0.62.0_amd64.deb.sha256 sha256sum -c pythinker-code_0.62.0_amd64.deb.sha256 sudo dpkg -i pythinker-code_0.62.0_amd64.deb sudo apt-get install -f # only needed if dependencies fail to resolve # Fedora / RHEL / openSUSE -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm -curl -LO https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm.sha256 +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm +curl -LO https://github.com/PyModel/pythinker-cli/releases/download/v0.62.0/pythinker-code-0.62.0.x86_64.rpm.sha256 sha256sum -c pythinker-code-0.62.0.x86_64.rpm.sha256 sudo dnf install ./pythinker-code-0.62.0.x86_64.rpm # or, on openSUSE: diff --git a/packages/linux-installer/build.sh b/packages/linux-installer/build.sh index cf44efc3c..c075cd299 100755 --- a/packages/linux-installer/build.sh +++ b/packages/linux-installer/build.sh @@ -87,7 +87,7 @@ FPM_COMMON=( -v "$VERSION" --license "Apache-2.0" --maintainer "Pythinker " - --url "https://github.com/Pythoughts-labs/pythinker-cli" + --url "https://github.com/PyModel/pythinker-cli" --description "Pythinker Code: terminal-native review-first AI engineering agent." --vendor "Pythinker" ) diff --git a/packages/pythinker-core/pyproject.toml b/packages/pythinker-core/pyproject.toml index 0ed74c7e8..d99f1e50d 100644 --- a/packages/pythinker-core/pyproject.toml +++ b/packages/pythinker-core/pyproject.toml @@ -38,10 +38,10 @@ contrib = [ ] [project.urls] -Homepage = "https://github.com/Pythoughts-labs/pythinker-cli" -Repository = "https://github.com/Pythoughts-labs/pythinker-cli" -Issues = "https://github.com/Pythoughts-labs/pythinker-cli/issues" -Changelog = "https://github.com/Pythoughts-labs/pythinker-cli/blob/main/packages/pythinker-core/CHANGELOG.md" +Homepage = "https://github.com/PyModel/pythinker-cli" +Repository = "https://github.com/PyModel/pythinker-cli" +Issues = "https://github.com/PyModel/pythinker-cli/issues" +Changelog = "https://github.com/PyModel/pythinker-cli/blob/main/packages/pythinker-core/CHANGELOG.md" [dependency-groups] dev = [ diff --git a/packages/pythinker-core/src/pythinker_core/contrib/chat_provider/openai_legacy.py b/packages/pythinker-core/src/pythinker_core/contrib/chat_provider/openai_legacy.py index ead672661..79e269f6f 100644 --- a/packages/pythinker-core/src/pythinker_core/contrib/chat_provider/openai_legacy.py +++ b/packages/pythinker-core/src/pythinker_core/contrib/chat_provider/openai_legacy.py @@ -145,7 +145,7 @@ async def generate( # Auto-enable reasoning_effort when the history contains ThinkPart but reasoning # was not explicitly configured. This prevents server validation errors from APIs # (e.g. One API) that require reasoning_effort when messages contain reasoning_content. - # See: https://github.com/Pythoughts-labs/pythinker-cli/issues/1616 + # See: https://github.com/PyModel/pythinker-cli/issues/1616 if ( self._auto_reasoning_effort and isinstance(reasoning_effort, Omit) diff --git a/packages/pythinker-core/tests/api_snapshot_tests/test_openai_legacy.py b/packages/pythinker-core/tests/api_snapshot_tests/test_openai_legacy.py index c72aaee96..359b36f12 100644 --- a/packages/pythinker-core/tests/api_snapshot_tests/test_openai_legacy.py +++ b/packages/pythinker-core/tests/api_snapshot_tests/test_openai_legacy.py @@ -315,7 +315,7 @@ async def test_openai_legacy_auto_reasoning_effort_when_history_has_think_part() """When reasoning_effort is not set but history contains ThinkPart and reasoning_key is configured, reasoning_effort should be auto-set to avoid server validation errors. - Reproduces: https://github.com/Pythoughts-labs/pythinker-cli/issues/1616 + Reproduces: https://github.com/PyModel/pythinker-cli/issues/1616 """ with respx.mock(base_url="https://api.openai.com") as mock: mock.post("/v1/chat/completions").mock( diff --git a/packages/pythinker-host/pyproject.toml b/packages/pythinker-host/pyproject.toml index 467ae4349..9316000a8 100644 --- a/packages/pythinker-host/pyproject.toml +++ b/packages/pythinker-host/pyproject.toml @@ -26,10 +26,10 @@ dependencies = [ ] [project.urls] -Homepage = "https://github.com/Pythoughts-labs/pythinker-cli" -Repository = "https://github.com/Pythoughts-labs/pythinker-cli" -Issues = "https://github.com/Pythoughts-labs/pythinker-cli/issues" -Changelog = "https://github.com/Pythoughts-labs/pythinker-cli/blob/main/packages/pythinker-host/CHANGELOG.md" +Homepage = "https://github.com/PyModel/pythinker-cli" +Repository = "https://github.com/PyModel/pythinker-cli" +Issues = "https://github.com/PyModel/pythinker-cli/issues" +Changelog = "https://github.com/PyModel/pythinker-cli/blob/main/packages/pythinker-host/CHANGELOG.md" [dependency-groups] dev = [ diff --git a/packages/pythinker-review/pyproject.toml b/packages/pythinker-review/pyproject.toml index cf04e68bf..ab18c101f 100644 --- a/packages/pythinker-review/pyproject.toml +++ b/packages/pythinker-review/pyproject.toml @@ -33,8 +33,8 @@ pythinker-debug = "pythinker_review.cli.debug:app" pythinker-security-scan = "pythinker_review.cli.security_scan:app" [project.urls] -Homepage = "https://github.com/Pythoughts-labs/pythinker-cli" -Repository = "https://github.com/Pythoughts-labs/pythinker-cli" +Homepage = "https://github.com/PyModel/pythinker-cli" +Repository = "https://github.com/PyModel/pythinker-cli" [dependency-groups] dev = [ diff --git a/packages/pythinker-review/src/pythinker_review/output/sarif.py b/packages/pythinker-review/src/pythinker_review/output/sarif.py index 78a83a817..fca82e0c4 100644 --- a/packages/pythinker-review/src/pythinker_review/output/sarif.py +++ b/packages/pythinker-review/src/pythinker_review/output/sarif.py @@ -68,7 +68,7 @@ def render_sarif(meta: RunMeta, findings: list[Finding]) -> str: "tool": { "driver": { "name": "pythinker-review", - "informationUri": "https://github.com/Pythoughts-labs/pythinker-cli", + "informationUri": "https://github.com/PyModel/pythinker-cli", "rules": list(rules_seen.values()), } }, diff --git a/packages/scoop-bucket/generate-manifest.py b/packages/scoop-bucket/generate-manifest.py index e888278ba..b33596a16 100644 --- a/packages/scoop-bucket/generate-manifest.py +++ b/packages/scoop-bucket/generate-manifest.py @@ -25,7 +25,7 @@ from pathlib import Path from typing import Any -GITHUB_REPO = "Pythoughts-labs/pythinker-cli" +GITHUB_REPO = "PyModel/pythinker-cli" GITHUB_RELEASE_API = f"https://api.github.com/repos/{GITHUB_REPO}/releases/tags/v{{version}}" diff --git a/packages/scoop-bucket/pythinker-code.json.tmpl b/packages/scoop-bucket/pythinker-code.json.tmpl index 8861ae956..8c0d8d09a 100644 --- a/packages/scoop-bucket/pythinker-code.json.tmpl +++ b/packages/scoop-bucket/pythinker-code.json.tmpl @@ -14,12 +14,12 @@ "PYTHINKER_MANAGED": "scoop" }, "checkver": { - "github": "https://github.com/Pythoughts-labs/pythinker-cli" + "github": "https://github.com/PyModel/pythinker-cli" }, "autoupdate": { "architecture": { "64bit": { - "url": "https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v$version/pythinker-$version-x86_64-pc-windows-msvc-onedir.zip" + "url": "https://github.com/PyModel/pythinker-cli/releases/download/v$version/pythinker-$version-x86_64-pc-windows-msvc-onedir.zip" } }, "hash": { diff --git a/packages/windows-installer/installer.iss b/packages/windows-installer/installer.iss index eb71d2366..feeb72858 100644 --- a/packages/windows-installer/installer.iss +++ b/packages/windows-installer/installer.iss @@ -11,8 +11,8 @@ AppName=Pythinker Code AppVersion={#AppVersion} AppPublisher=Pythinker AppPublisherURL=https://pythinker.com -AppSupportURL=https://github.com/Pythoughts-labs/pythinker-cli/issues -AppUpdatesURL=https://github.com/Pythoughts-labs/pythinker-cli/releases +AppSupportURL=https://github.com/PyModel/pythinker-cli/issues +AppUpdatesURL=https://github.com/PyModel/pythinker-cli/releases DefaultDirName={localappdata}\Programs\Pythinker DefaultGroupName=Pythinker DisableProgramGroupPage=yes diff --git a/pyproject.toml b/pyproject.toml index cbebc5053..a72948281 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "pythinker-code" version = "0.62.0" -description = "Pythinker — an agentic CLI developed by Pythoughts-labs." +description = "Pythinker — an agentic CLI developed by PyModel." readme = "README.md" requires-python = ">=3.12" license = "Apache-2.0" license-files = ["LICENSE", "NOTICE"] -authors = [{ name = "Pythoughts-labs", email = "hello@pythoughts.com" }] +authors = [{ name = "PyModel", email = "hello@pymodel.com" }] keywords = ["cli", "agent", "ai", "coding-assistant", "llm", "claude", "openai", "terminal"] classifiers = [ "Development Status :: 5 - Production/Stable", @@ -113,11 +113,11 @@ pythinker = "pythinker_code.__main__:main" pythinker-code = "pythinker_code.__main__:main" [project.urls] -Homepage = "https://github.com/Pythoughts-labs/pythinker-cli" -Repository = "https://github.com/Pythoughts-labs/pythinker-cli" -Issues = "https://github.com/Pythoughts-labs/pythinker-cli/issues" -Changelog = "https://github.com/Pythoughts-labs/pythinker-cli/blob/main/CHANGELOG.md" -Documentation = "https://github.com/Pythoughts-labs/pythinker-cli#readme" +Homepage = "https://github.com/PyModel/pythinker-cli" +Repository = "https://github.com/PyModel/pythinker-cli" +Issues = "https://github.com/PyModel/pythinker-cli/issues" +Changelog = "https://github.com/PyModel/pythinker-cli/blob/main/CHANGELOG.md" +Documentation = "https://github.com/PyModel/pythinker-cli#readme" [tool.ruff] line-length = 100 diff --git a/scripts/install-native.sh b/scripts/install-native.sh index f7f0944d5..bc4b9d02a 100755 --- a/scripts/install-native.sh +++ b/scripts/install-native.sh @@ -69,7 +69,7 @@ while [[ $# -gt 0 ]]; do esac done -REPO="Pythoughts-labs/pythinker-cli" +REPO="PyModel/pythinker-cli" if [ -t 1 ] && [ -z "$NO_COLOR" ] && [ "${TERM:-}" != "dumb" ]; then NAVY=$'\033[38;5;24m'; FACE=$'\033[38;5;255m' diff --git a/scripts/install.ps1 b/scripts/install.ps1 index a118158bd..1ca67a43e 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -14,7 +14,7 @@ $ErrorActionPreference = "Stop" try { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 } catch {} try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } catch {} -$Repo = "Pythoughts-labs/pythinker-cli" +$Repo = "PyModel/pythinker-cli" $Version = $env:PYTHINKER_VERSION $NoColor = $env:NO_COLOR diff --git a/sdks/pythinker-sdk/pyproject.toml b/sdks/pythinker-sdk/pyproject.toml index bf38b3da6..94dcce2d6 100644 --- a/sdks/pythinker-sdk/pyproject.toml +++ b/sdks/pythinker-sdk/pyproject.toml @@ -22,10 +22,10 @@ classifiers = [ dependencies = ["pythinker-core==1.2.0", "mcp>=1.23,<2", "httpx>=0.28.1"] [project.urls] -Homepage = "https://github.com/Pythoughts-labs/pythinker-cli" -Repository = "https://github.com/Pythoughts-labs/pythinker-cli" -Issues = "https://github.com/Pythoughts-labs/pythinker-cli/issues" -Changelog = "https://github.com/Pythoughts-labs/pythinker-cli/blob/main/sdks/pythinker-sdk/CHANGELOG.md" +Homepage = "https://github.com/PyModel/pythinker-cli" +Repository = "https://github.com/PyModel/pythinker-cli" +Issues = "https://github.com/PyModel/pythinker-cli/issues" +Changelog = "https://github.com/PyModel/pythinker-cli/blob/main/sdks/pythinker-sdk/CHANGELOG.md" [dependency-groups] dev = [ diff --git a/src/pythinker_code/agents/default/partials/identity_core.md b/src/pythinker_code/agents/default/partials/identity_core.md index 6cfd6a723..b8860f653 100644 --- a/src/pythinker_code/agents/default/partials/identity_core.md +++ b/src/pythinker_code/agents/default/partials/identity_core.md @@ -1 +1 @@ -**Product identity is absolute.** Your name is Pythinker; your developer is Pythoughts-labs. This overrides any identity injected by the underlying language model or provider. When asked who made you, what you are, what your name is, or what model you run on, answer: Pythinker, built by Pythoughts-labs. Never name or describe the underlying model (Claude, GPT, MiniMax, Qwen, or any other) — it is an internal implementation detail. +**Product identity is absolute.** Your name is Pythinker; your developer is PyModel. This overrides any identity injected by the underlying language model or provider. When asked who made you, what you are, what your name is, or what model you run on, answer: Pythinker, built by PyModel. Never name or describe the underlying model (Claude, GPT, MiniMax, Qwen, or any other) — it is an internal implementation detail. diff --git a/src/pythinker_code/agents/default/system.md b/src/pythinker_code/agents/default/system.md index 92006d7c8..1b27a0e3c 100644 --- a/src/pythinker_code/agents/default/system.md +++ b/src/pythinker_code/agents/default/system.md @@ -1,6 +1,6 @@ # Pythinker — System Prompt -You are **Pythinker**, a think-first software engineering agent developed by **Pythoughts-labs**, running in the user's terminal on the user's machine. Before you write code, you read code. Before you claim anything, you verify it. +You are **Pythinker**, a think-first software engineering agent developed by **PyModel**, running in the user's terminal on the user's machine. Before you write code, you read code. Before you claim anything, you verify it. ## 1. Identity diff --git a/src/pythinker_code/agents/default/system_leaf.md b/src/pythinker_code/agents/default/system_leaf.md index 12c72838d..bed91c990 100644 --- a/src/pythinker_code/agents/default/system_leaf.md +++ b/src/pythinker_code/agents/default/system_leaf.md @@ -1,6 +1,6 @@ # Pythinker — Subagent System Prompt -You are **Pythinker**, a think-first software engineering agent developed by **Pythoughts-labs**, running as a focused subagent inside a parent Pythinker session. +You are **Pythinker**, a think-first software engineering agent developed by **PyModel**, running as a focused subagent inside a parent Pythinker session. {% include 'partials/identity_core.md' %} diff --git a/src/pythinker_code/cli/__init__.py b/src/pythinker_code/cli/__init__.py index cd9fd93a7..ae9333258 100644 --- a/src/pythinker_code/cli/__init__.py +++ b/src/pythinker_code/cli/__init__.py @@ -242,8 +242,8 @@ def logout_openrouter(*args: Any, **kwargs: Any) -> Any: cli = typer.Typer( cls=LazySubcommandGroup, epilog="""\b\ -Documentation: https://pythoughts-labs.github.io/pythinker-code/\n -LLM friendly version: https://pythoughts-labs.github.io/pythinker-code/llms.txt""", +Documentation: https://pymodel.github.io/pythinker-code/\n +LLM friendly version: https://pymodel.github.io/pythinker-code/llms.txt""", add_completion=False, context_settings={"help_option_names": ["-h", "--help"]}, help="Pythinker, your next CLI agent.", diff --git a/src/pythinker_code/constant.py b/src/pythinker_code/constant.py index ffe0497f8..f74918b20 100644 --- a/src/pythinker_code/constant.py +++ b/src/pythinker_code/constant.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING NAME = "Pythinker CLI" -ORGANIZATION = "Pythoughts-labs" -CONTACT = "hello@pythoughts.com" +ORGANIZATION = "PyModel" +CONTACT = "hello@pymodel.com" if TYPE_CHECKING: VERSION: str diff --git a/src/pythinker_code/feedback_repo.py b/src/pythinker_code/feedback_repo.py index 7333048b0..3bab6b9ec 100644 --- a/src/pythinker_code/feedback_repo.py +++ b/src/pythinker_code/feedback_repo.py @@ -1,6 +1,6 @@ from __future__ import annotations -DEFAULT_FEEDBACK_GITHUB_REPO = "Pythoughts-labs/pythinker-cli" +DEFAULT_FEEDBACK_GITHUB_REPO = "PyModel/pythinker-cli" _LEGACY_FEEDBACK_GITHUB_OWNER = "mohamed-elkholy95" _LEGACY_DEFAULT_FEEDBACK_GITHUB_REPOS = { @@ -8,6 +8,7 @@ _LEGACY_FEEDBACK_GITHUB_OWNER + "/pythinker-code", "TechMatrix-labs/pythinker-code", "Pythoughts-labs/pythinker-code", + "Pythoughts-labs/pythinker-cli", } _LEGACY_DEFAULT_FEEDBACK_GITHUB_REPOS_LOWER = { repo.lower() for repo in _LEGACY_DEFAULT_FEEDBACK_GITHUB_REPOS diff --git a/src/pythinker_code/llm.py b/src/pythinker_code/llm.py index 8d505d16e..c3263c273 100644 --- a/src/pythinker_code/llm.py +++ b/src/pythinker_code/llm.py @@ -95,7 +95,7 @@ def supports_deferred_tool_search(llm: LLM | None) -> bool: them. So `_is_tool_visible` hides `ToolSearch` whenever this returns False. The gate applies three checks: env override (`ENABLE_TOOL_SEARCH`), - a genuine-first-party-host check (`isFirstPartyPythoughtsBaseUrl`), and a + a genuine-first-party-host check (`isFirstPartyPyModelBaseUrl`), and a model-capability check (`modelSupportsToolReference`). Keep it derived from the ACTIVE model so a mid-session `/model` switch re-evaluates it. diff --git a/src/pythinker_code/native.py b/src/pythinker_code/native.py index 9ae8be615..691fa891d 100644 --- a/src/pythinker_code/native.py +++ b/src/pythinker_code/native.py @@ -13,7 +13,7 @@ import sys from pathlib import Path -GITHUB_REPO = "Pythoughts-labs/pythinker-cli" +GITHUB_REPO = "PyModel/pythinker-cli" SENTINEL_FILENAME = ".pythinker-native" diff --git a/src/pythinker_code/skills/pythinker-code-help/SKILL.md b/src/pythinker_code/skills/pythinker-code-help/SKILL.md index 1bd328189..b287e65f1 100644 --- a/src/pythinker_code/skills/pythinker-code-help/SKILL.md +++ b/src/pythinker_code/skills/pythinker-code-help/SKILL.md @@ -15,17 +15,17 @@ Help users with Pythinker CLI questions by consulting documentation and source c ## Documentation -Base URL: `https://pythoughts-labs.github.io/pythinker-cli/` +Base URL: `https://pymodel.github.io/pythinker-cli/` Fetch documentation index to find relevant pages: ```text -https://pythoughts-labs.github.io/pythinker-cli/llms.txt +https://pymodel.github.io/pythinker-cli/llms.txt ``` ### Page URL Pattern -- Pages: `https://pythoughts-labs.github.io/pythinker-cli/en/...` +- Pages: `https://pymodel.github.io/pythinker-cli/en/...` ### Topic Mapping @@ -45,7 +45,7 @@ https://pythoughts-labs.github.io/pythinker-cli/llms.txt ## Source Code -Repository: `https://github.com/Pythoughts-labs/pythinker-cli` +Repository: `https://github.com/PyModel/pythinker-cli` When to read source: diff --git a/src/pythinker_code/ui/shell/slash.py b/src/pythinker_code/ui/shell/slash.py index 5ab7454d3..0c897301f 100644 --- a/src/pythinker_code/ui/shell/slash.py +++ b/src/pythinker_code/ui/shell/slash.py @@ -733,7 +733,7 @@ def _fallback_to_issue(payload: dict[str, Any] | None = None) -> None: issue_url = ( build_feedback_issue_url(payload, soul.runtime.config.feedback.github_repo) if payload is not None and soul is not None - else "https://github.com/Pythoughts-labs/pythinker-cli/issues/new/choose" + else "https://github.com/PyModel/pythinker-cli/issues/new/choose" ) if open_url_in_browser(issue_url): console.print(f"[{_t_fb.success}]Opening GitHub feedback in your browser...[/]") @@ -860,7 +860,7 @@ async def report_error(app: Shell, args: str): _t_re = _get_tok_re() - ISSUE_URL = "https://github.com/Pythoughts-labs/pythinker-cli/issues" + ISSUE_URL = "https://github.com/PyModel/pythinker-cli/issues" def _fallback_to_issues() -> None: if not open_url_in_browser(ISSUE_URL): diff --git a/src/pythinker_code/ui/shell/update.py b/src/pythinker_code/ui/shell/update.py index ead5794e1..547253a6b 100644 --- a/src/pythinker_code/ui/shell/update.py +++ b/src/pythinker_code/ui/shell/update.py @@ -52,11 +52,10 @@ from pythinker_code.utils.logging import logger from pythinker_code.utils.subprocess_env import get_clean_env -CHANGELOG_URL_EN = "https://github.com/Pythoughts-labs/pythinker-cli/blob/main/CHANGELOG.md" +CHANGELOG_URL_EN = "https://github.com/PyModel/pythinker-cli/blob/main/CHANGELOG.md" PYPI_VERSION_URL = "https://pypi.org/pypi/pythinker-code/{version}/json" HOMEBREW_FORMULA_URL = ( - "https://raw.githubusercontent.com/Pythoughts-labs/homebrew-pythinker/" - "main/Formula/pythinker-code.rb" + "https://raw.githubusercontent.com/PyModel/homebrew-pythinker/main/Formula/pythinker-code.rb" ) # Default upgrade command. `_detect_upgrade_command()` overrides this when the @@ -1735,7 +1734,7 @@ def _print(message: str) -> None: _print( f"[{_t.warning}]Auto-update disabled. " "Download the new installer manually from " - "https://github.com/Pythoughts-labs/pythinker-cli/releases/latest[/]" + "https://github.com/PyModel/pythinker-cli/releases/latest[/]" ) return UpdateResult.UPDATE_AVAILABLE if native_result is UpdateResult.FAILED: diff --git a/tests/core/test_config.py b/tests/core/test_config.py index 07bd21e8d..d550dbbd0 100644 --- a/tests/core/test_config.py +++ b/tests/core/test_config.py @@ -103,7 +103,7 @@ def test_default_config_dump(): "api_key": None, "custom_headers": None, "github_client_id": "", - "github_repo": "Pythoughts-labs/pythinker-cli", + "github_repo": "PyModel/pythinker-cli", }, "hooks": [], "merge_all_available_skills": True, @@ -202,19 +202,31 @@ def test_load_config_migrates_legacy_feedback_repo_default(): old_owner = "mohamed-elkholy95" config = load_config_from_string(f'[feedback]\ngithub_repo = "{old_owner}/Pythinker-Code"\n') - assert config.feedback.github_repo == "Pythoughts-labs/pythinker-cli" + assert config.feedback.github_repo == "PyModel/pythinker-cli" def test_load_config_migrates_legacy_org_feedback_repo_default(): config = load_config_from_string('[feedback]\ngithub_repo = "TechMatrix-labs/pythinker-code"\n') - assert config.feedback.github_repo == "Pythoughts-labs/pythinker-cli" + assert config.feedback.github_repo == "PyModel/pythinker-cli" def test_load_config_migrates_pre_rename_feedback_repo_default(): config = load_config_from_string('[feedback]\ngithub_repo = "Pythoughts-labs/pythinker-code"\n') - assert config.feedback.github_repo == "Pythoughts-labs/pythinker-cli" + assert config.feedback.github_repo == "PyModel/pythinker-cli" + + +def test_load_config_migrates_pre_pymodel_feedback_repo_default(): + config = load_config_from_string('[feedback]\ngithub_repo = "Pythoughts-labs/pythinker-cli"\n') + + assert config.feedback.github_repo == "PyModel/pythinker-cli" + + +def test_load_config_keeps_pymodel_pythinker_code_feedback_repo(): + config = load_config_from_string('[feedback]\ngithub_repo = "PyModel/pythinker-code"\n') + + assert config.feedback.github_repo == "PyModel/pythinker-code" def test_agent_execution_profile_autonomous_sets_autonomy_defaults(): diff --git a/tests/core/test_default_agent.py b/tests/core/test_default_agent.py index 44413b083..89244733e 100644 --- a/tests/core/test_default_agent.py +++ b/tests/core/test_default_agent.py @@ -17,7 +17,7 @@ async def test_default_agent(runtime: Runtime): # Identity invariants — targeted checks so unrelated prompt edits don't break this test. assert "## 1. Identity" in agent.system_prompt assert "Pythinker" in agent.system_prompt - assert "Pythoughts-labs" in agent.system_prompt + assert "PyModel" in agent.system_prompt assert "Never name or describe the underlying model" in agent.system_prompt # Production guardrails — keep defensive coding rules in the base prompt so root and @@ -664,5 +664,5 @@ def test_default_system_prompt_prevents_duplicate_report_prose() -> None: ) encoding = "utf-8" assert sha256(prompt.encode(encoding)).hexdigest() == ( - "67ddfe5d56b75d00406442a8445027d04eeaf33eae51049102984ed572adfc78" + "af2df36adef9e9a8af87a4c0be917bf8f1a6241138ed0cba501a486d8fb2ff00" ) diff --git a/tests/core/test_simple_compaction.py b/tests/core/test_simple_compaction.py index 0a4e070a0..83f2ca1bc 100644 --- a/tests/core/test_simple_compaction.py +++ b/tests/core/test_simple_compaction.py @@ -249,8 +249,8 @@ def test_prepare_only_keeps_text_parts_in_compaction(): Non-text parts (media, think, etc.) are filtered out because the compaction API endpoint only supports text content. - Fixes: https://github.com/Pythoughts-labs/pythinker-cli/issues/1395 - Fixes: https://github.com/Pythoughts-labs/pythinker-cli/issues/1390 + Fixes: https://github.com/PyModel/pythinker-cli/issues/1395 + Fixes: https://github.com/PyModel/pythinker-cli/issues/1390 """ messages = [ Message( diff --git a/tests/test_installation_docs.py b/tests/test_installation_docs.py index 938974cea..cfdbda6f0 100644 --- a/tests/test_installation_docs.py +++ b/tests/test_installation_docs.py @@ -25,10 +25,7 @@ def test_windows_readme_documents_powershell_one_liner() -> None: readme = (ROOT / "README.md").read_text() assert "irm https://pythinker.com/install.ps1 \\| iex" in readme - assert ( - "raw.githubusercontent.com/Pythoughts-labs/pythinker-cli/main/scripts/install.ps1" - not in readme - ) + assert "raw.githubusercontent.com/PyModel/pythinker-cli/main/scripts/install.ps1" not in readme assert "-File $installer" not in readme @@ -40,7 +37,7 @@ def test_getting_started_uses_canonical_native_installer_url() -> None: assert "curl -fsSL https://pythinker.com/install.sh | bash" in guide assert "irm https://pythinker.com/install.ps1 | iex" in guide assert ( - "https://raw.githubusercontent.com/Pythoughts-labs/pythinker-cli/main/scripts/install.ps1" + "https://raw.githubusercontent.com/PyModel/pythinker-cli/main/scripts/install.ps1" ) not in guide @@ -64,7 +61,7 @@ def test_readme_downloads_rpm_before_local_install() -> None: rpm = f"pythinker-code-{version}.x86_64.rpm" checksum = f"{rpm}.sha256" - release_url = f"https://github.com/Pythoughts-labs/pythinker-cli/releases/download/v{version}" + release_url = f"https://github.com/PyModel/pythinker-cli/releases/download/v{version}" assert f"curl -LO {release_url}/{rpm}" in readme assert f"curl -LO {release_url}/{checksum}" in readme diff --git a/tests/test_native.py b/tests/test_native.py index a034ac30f..fce54f2ed 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -55,7 +55,7 @@ def test_is_native_build_true_when_sentinel_present_without_frozen_flag(tmp_path def test_native_installer_release_url_latest(): url = native.native_installer_release_url(channel="latest") - assert url == ("https://api.github.com/repos/Pythoughts-labs/pythinker-cli/releases/latest") + assert url == ("https://api.github.com/repos/PyModel/pythinker-cli/releases/latest") def test_native_installer_release_url_stable(): diff --git a/tests/test_release_update_pipeline.py b/tests/test_release_update_pipeline.py index d3931b79b..b511a2ba8 100644 --- a/tests/test_release_update_pipeline.py +++ b/tests/test_release_update_pipeline.py @@ -175,7 +175,7 @@ def test_release_asset_wait_covers_all_updater_channels() -> None: "pythinker-${version}-aarch64-apple-darwin-onedir.tar.gz.sha256", "pythinker-${version}-x86_64-apple-darwin-onedir.tar.gz.sha256", "https://pypi.org/pypi/pythinker-code/${version}/json", - "raw.githubusercontent.com/Pythoughts-labs/homebrew-pythinker", + "raw.githubusercontent.com/PyModel/homebrew-pythinker", 'version \\"${version}\\"', ): assert expected_readiness_marker in promote_workflow diff --git a/tests/ui_and_conv/test_shell_feedback_slash.py b/tests/ui_and_conv/test_shell_feedback_slash.py index e644c6a32..27c9d8ca9 100644 --- a/tests/ui_and_conv/test_shell_feedback_slash.py +++ b/tests/ui_and_conv/test_shell_feedback_slash.py @@ -50,7 +50,7 @@ async def test_opens_new_issue_url_when_no_soul(self, monkeypatch) -> None: open_mock.assert_called_once() url = open_mock.call_args.args[0] - assert "Pythoughts-labs/pythinker-cli" in url + assert "PyModel/pythinker-cli" in url assert "new" in url async def test_prints_success_when_browser_opens(self, monkeypatch) -> None: @@ -75,7 +75,7 @@ async def test_prints_url_when_browser_fails(self, monkeypatch) -> None: await _run_feedback(Mock(), "ux confusing prompt") output = " ".join(str(c) for c in print_mock.call_args_list) - assert "Pythoughts-labs/pythinker-cli" in output + assert "PyModel/pythinker-cli" in output async def test_invalid_args_without_soul_still_offer_github_fallback(self, monkeypatch) -> None: open_mock = Mock(return_value=True) @@ -146,7 +146,7 @@ async def test_submits_structured_payload(self, tmp_path: Path, monkeypatch) -> soul.runtime.session.subagents_dir = tmp_path / "subagents" soul.runtime.session.subagents_dir.mkdir() soul.runtime.role = "root" - soul.runtime.config.feedback.github_repo = "Pythoughts-labs/pythinker-cli" + soul.runtime.config.feedback.github_repo = "PyModel/pythinker-cli" soul.name = "default" soul.context.history = [ Message(role="user", content=[TextPart(text="please fix this")]), @@ -200,7 +200,7 @@ async def test_prints_follow_up_issue_url_when_endpoint_returns_no_link( soul = Mock(spec=PythinkerSoul) soul.runtime.session.id = "sess-123" - soul.runtime.config.feedback.github_repo = "Pythoughts-labs/pythinker-cli" + soul.runtime.config.feedback.github_repo = "PyModel/pythinker-cli" app = Mock() app.soul = soul payload = { @@ -225,7 +225,7 @@ async def test_prints_follow_up_issue_url_when_endpoint_returns_no_link( output = " ".join(str(c) for c in print_mock.call_args_list) assert "No report link was returned" in output - assert "github.com/Pythoughts-labs/pythinker-cli" in output + assert "github.com/PyModel/pythinker-cli" in output async def test_prompts_before_submitting_by_default(self, monkeypatch) -> None: from pythinker_code.soul.pythinkersoul import PythinkerSoul @@ -302,7 +302,7 @@ def test_feedback_issue_url_migrates_legacy_default_repo(self) -> None: url = build_feedback_issue_url(payload, old_owner + "/Pythinker-Code") - assert "github.com/Pythoughts-labs/pythinker-cli/issues/new" in url + assert "github.com/PyModel/pythinker-cli/issues/new" in url assert old_owner not in url def test_feedback_issue_url_uses_compact_body_for_large_payload(self) -> None: diff --git a/tests/ui_and_conv/test_shell_update.py b/tests/ui_and_conv/test_shell_update.py index 1ffd11d25..8c91b9142 100644 --- a/tests/ui_and_conv/test_shell_update.py +++ b/tests/ui_and_conv/test_shell_update.py @@ -1392,8 +1392,8 @@ def fake_run_upgrade_command(command, *, print_output: bool, output_callback): _BREW_UNTRUSTED_TAP_ERROR = ( - "Error: Refusing to load formula pythoughts-labs/pythinker/pythinker-code " - "from untrusted tap pythoughts-labs/pythinker." + "Error: Refusing to load formula pymodel/pythinker/pythinker-code " + "from untrusted tap pymodel/pythinker." ) @@ -1403,9 +1403,9 @@ def test_homebrew_untrusted_tap_parses_refusal(): lines = [ "==> Updating Homebrew...", _BREW_UNTRUSTED_TAP_ERROR, - "Run `brew trust pythoughts-labs/pythinker` to trust it.", + "Run `brew trust pymodel/pythinker` to trust it.", ] - assert update._homebrew_untrusted_tap(lines) == "pythoughts-labs/pythinker" + assert update._homebrew_untrusted_tap(lines) == "pymodel/pythinker" def test_homebrew_untrusted_tap_ignores_unrelated_skip_warnings(): @@ -1421,10 +1421,10 @@ def test_homebrew_untrusted_tap_ignores_unrelated_skip_warnings(): def test_homebrew_untrusted_tap_accepts_own_tap_skip_warning(): lines = [ - "Warning: Skipping pythoughts-labs/pythinker because it is not trusted. " - + "Run `brew trust pythoughts-labs/pythinker` to trust it.", + "Warning: Skipping pymodel/pythinker because it is not trusted. " + + "Run `brew trust pymodel/pythinker` to trust it.", ] - assert update._homebrew_untrusted_tap(lines) == "pythoughts-labs/pythinker" + assert update._homebrew_untrusted_tap(lines) == "pymodel/pythinker" def test_homebrew_untrusted_tap_none_on_unrelated_output(): @@ -1452,7 +1452,7 @@ def fake_run_upgrade_command(command, *, print_output: bool, output_callback): result = await update.do_update(print_output=False, output_callback=messages.append) assert result is update.UpdateResult.FAILED - assert any("brew trust pythoughts-labs/pythinker" in m for m in messages) + assert any("brew trust pymodel/pythinker" in m for m in messages) # The raw brew error still reaches the caller's callback unmodified. assert _BREW_UNTRUSTED_TAP_ERROR in messages @@ -1470,7 +1470,7 @@ def fake_run_upgrade_command(command, *, print_output: bool, output_callback): and [ "brew", "trust", - "pythoughts-labs/pythinker", + "pymodel/pythinker", ] not in ran ): @@ -1479,7 +1479,7 @@ def fake_run_upgrade_command(command, *, print_output: bool, output_callback): return 0 async def fake_confirm(tap: str) -> bool: - assert tap == "pythoughts-labs/pythinker" + assert tap == "pymodel/pythinker" return True _brew_upgrade_do_update_env(monkeypatch, tmp_path) @@ -1494,7 +1494,7 @@ async def fake_confirm(tap: str) -> bool: assert ran == [ ["brew", "update", "--quiet"], ["brew", "upgrade", "pythinker-code"], - ["brew", "trust", "pythoughts-labs/pythinker"], + ["brew", "trust", "pymodel/pythinker"], ["brew", "update", "--quiet"], ["brew", "upgrade", "pythinker-code"], ] @@ -1525,9 +1525,9 @@ async def fake_confirm(tap: str) -> bool: result = await update.do_update(print_output=False, output_callback=messages.append) assert result is update.UpdateResult.FAILED - assert ["brew", "trust", "pythoughts-labs/pythinker"] not in ran + assert ["brew", "trust", "pymodel/pythinker"] not in ran assert ran.count(["brew", "upgrade", "pythinker-code"]) == 1 - assert any("brew trust pythoughts-labs/pythinker" in m for m in messages) + assert any("brew trust pymodel/pythinker" in m for m in messages) @pytest.mark.asyncio @@ -1558,7 +1558,7 @@ async def fake_confirm(tap: str) -> bool: assert result is update.UpdateResult.FAILED assert ran.count(["brew", "upgrade", "pythinker-code"]) == 1 - assert any("brew trust pythoughts-labs/pythinker" in m for m in messages) + assert any("brew trust pymodel/pythinker" in m for m in messages) @pytest.mark.asyncio @@ -1573,8 +1573,8 @@ async def test_do_update_brew_silent_noop_with_untrusted_tap_prints_trust_hint( def fake_run_upgrade_command(command, *, print_output: bool, output_callback): if command == ["brew", "update", "--quiet"]: output_callback( - "Warning: Skipping pythoughts-labs/pythinker because it is not " - "trusted. Run `brew trust pythoughts-labs/pythinker` to trust it." + "Warning: Skipping pymodel/pythinker because it is not " + "trusted. Run `brew trust pymodel/pythinker` to trust it." ) return 0 @@ -1587,7 +1587,7 @@ def fake_run_upgrade_command(command, *, print_output: bool, output_callback): assert result is update.UpdateResult.FAILED assert not any("Updated successfully" in m for m in messages) - assert any("brew trust pythoughts-labs/pythinker" in m for m in messages) + assert any("brew trust pymodel/pythinker" in m for m in messages) def test_installed_homebrew_version_returns_max_installed(monkeypatch): diff --git a/web/public/install.ps1 b/web/public/install.ps1 index a118158bd..1ca67a43e 100644 --- a/web/public/install.ps1 +++ b/web/public/install.ps1 @@ -14,7 +14,7 @@ $ErrorActionPreference = "Stop" try { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 } catch {} try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } catch {} -$Repo = "Pythoughts-labs/pythinker-cli" +$Repo = "PyModel/pythinker-cli" $Version = $env:PYTHINKER_VERSION $NoColor = $env:NO_COLOR diff --git a/web/public/install.sh b/web/public/install.sh index f7f0944d5..bc4b9d02a 100755 --- a/web/public/install.sh +++ b/web/public/install.sh @@ -69,7 +69,7 @@ while [[ $# -gt 0 ]]; do esac done -REPO="Pythoughts-labs/pythinker-cli" +REPO="PyModel/pythinker-cli" if [ -t 1 ] && [ -z "$NO_COLOR" ] && [ "${TERM:-}" != "dumb" ]; then NAVY=$'\033[38;5;24m'; FACE=$'\033[38;5;255m' From 0d9e37489ced3e9e1c5e09da90efb4843512db2a Mon Sep 17 00:00:00 2001 From: elkaix Date: Thu, 24 Sep 2026 17:43:35 -0400 Subject: [PATCH 2/2] fix: point CLI help at the pythinker-cli docs site --- src/pythinker_code/cli/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pythinker_code/cli/__init__.py b/src/pythinker_code/cli/__init__.py index ae9333258..89a8ab064 100644 --- a/src/pythinker_code/cli/__init__.py +++ b/src/pythinker_code/cli/__init__.py @@ -242,8 +242,8 @@ def logout_openrouter(*args: Any, **kwargs: Any) -> Any: cli = typer.Typer( cls=LazySubcommandGroup, epilog="""\b\ -Documentation: https://pymodel.github.io/pythinker-code/\n -LLM friendly version: https://pymodel.github.io/pythinker-code/llms.txt""", +Documentation: https://pymodel.github.io/pythinker-cli/\n +LLM friendly version: https://pymodel.github.io/pythinker-cli/llms.txt""", add_completion=False, context_settings={"help_option_names": ["-h", "--help"]}, help="Pythinker, your next CLI agent.",