From 14ac4f40f8a17dee8f6394d689a862c6fd941181 Mon Sep 17 00:00:00 2001 From: elkaix Date: Mon, 17 Aug 2026 01:18:36 -0400 Subject: [PATCH] docs: rewrite the README around the desktop app and simplify the badges Lead with the desktop download, expand the agent capability sections, and cut the README to the essentials. Replace the heavy for-the-badge row with a flat row: release, desktop downloads, license, macOS/Windows, Node.js, visitors. Use the desktop screenshot as the hero image and point every download link at code.pythinker.com. --- README.md | 349 ++++++++++--------------------------- docs/media/desktop-ui.webp | Bin 0 -> 23606 bytes 2 files changed, 91 insertions(+), 258 deletions(-) create mode 100644 docs/media/desktop-ui.webp diff --git a/README.md b/README.md index cf34b20b..7a3b070e 100644 --- a/README.md +++ b/README.md @@ -2,190 +2,113 @@ # Pythinker logo Pythinker Code -### *Think first, then code. Your terminal-native AI engineering agent.* - -**An intelligent agent that reads your codebase, edits files, runs shell commands, searches the web, and iterates until the job is done.** -**Powered by [Pythinker models](https://pythinker.com) — compatible with other LLM providers. All from the shell you already live in.** - -
- -[![npm version](https://img.shields.io/npm/v/@pymodel/pythinker-code?style=for-the-badge&logo=npm&logoColor=white&color=CB3837&label=pythinker-code)](https://www.npmjs.com/package/@pymodel/pythinker-code) -[![Downloads](https://img.shields.io/npm/dm/@pymodel/pythinker-code?style=for-the-badge&logo=npm&logoColor=white&color=2b89ff&label=downloads)](https://www.npmjs.com/package/@pymodel/pythinker-code) -[![Desktop downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FPyModel%2Fpythinker-code%2Fbadges%2Fdesktop-total.json&style=for-the-badge&logo=github&logoColor=white)](https://github.com/PyModel/pythinker-desktop-releases/releases) -[![macOS .dmg](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FPyModel%2Fpythinker-code%2Fbadges%2Fdesktop-dmg.json&style=for-the-badge&logo=apple&logoColor=white)](https://github.com/PyModel/pythinker-desktop-releases/releases/latest) -[![Windows .exe](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FPyModel%2Fpythinker-code%2Fbadges%2Fdesktop-exe.json&style=for-the-badge&logo=windows&logoColor=white)](https://github.com/PyModel/pythinker-desktop-releases/releases/latest) -[![Node.js](https://img.shields.io/badge/Node.js-26%2B-339933?style=for-the-badge&logo=nodedotjs&logoColor=white)](https://github.com/PyModel/pythinker-code/blob/main/package.json) -[![License: MIT](https://img.shields.io/badge/License-MIT-16a34a.svg?style=for-the-badge)](https://github.com/PyModel/pythinker-code/blob/main/LICENSE) -[![CI](https://img.shields.io/github/actions/workflow/status/PyModel/pythinker-code/ci.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/PyModel/pythinker-code/actions/workflows/ci.yml?query=branch%3Amain) - -[![Built with TypeScript](https://img.shields.io/badge/built%20with-TypeScript-3178c6.svg?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) -[![ACP ready](https://img.shields.io/badge/ACP-ready-7c3aed.svg?style=flat-square)](https://agentclientprotocol.com/) -[![MCP tools](https://img.shields.io/badge/MCP-tools-0891b2.svg?style=flat-square)](https://modelcontextprotocol.io/) -[![Docs](https://img.shields.io/badge/docs-online-0284c7.svg?style=flat-square)](https://pymodel.github.io/pythinker-code/) -[![Homepage](https://img.shields.io/badge/home-code.pythinker.com-ec4899.svg?style=flat-square)](https://code.pythinker.com) - -
- -Website  ·  -Quick Start  ·  -Features  ·  -IDE Integration  ·  -MCP  ·  -Architecture  ·  +### A coding agent you can run as a desktop app + +[![release](https://img.shields.io/npm/v/@pymodel/pythinker-code?style=flat-square&label=release&color=4f46e5)](https://www.npmjs.com/package/@pymodel/pythinker-code) +[![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FPyModel%2Fpythinker-code%2Fbadges%2Fdesktop-total.json&style=flat-square&label=downloads&labelColor=000000&color=dfb317)](https://code.pythinker.com/) +[![license](https://img.shields.io/badge/license-MIT-16a34a?style=flat-square)](LICENSE) +[![macOS](https://img.shields.io/badge/macOS-e5e7eb?style=flat-square&logo=apple&logoColor=000000)](https://code.pythinker.com/) | [![Windows](https://img.shields.io/badge/Windows-e5e7eb?style=flat-square&logo=data:image/svg%2Bxml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+V2luZG93cyAxMTwvdGl0bGU+PHBhdGggZmlsbD0iIzAwNzhENCIgZD0iTTAsMEgxMS4zNzdWMTEuMzcySDBaTTEyLjYyMywwSDI0VjExLjM3MkgxMi42MjNaTTAsMTIuNjIzSDExLjM3N1YyNEgwWm0xMi42MjMsMEgyNFYyNEgxMi42MjMiLz48L3N2Zz4=)](https://code.pythinker.com/) +[![Node.js](https://img.shields.io/badge/Node.js-26.4%2B-339933?style=flat-square&logo=nodedotjs&logoColor=white)](package.json) +[![visitors](https://komarev.com/ghpvc/?username=PyModel-pythinker-code&label=visitors&color=4f46e5&style=flat-square)](https://github.com/PyModel/pythinker-code) + +Download  ·  +Capabilities  ·  +Terminal  ·  +Editor  ·  Development -

+
-Pythinker Code terminal demo +Pythinker Desktop --- -## What is Pythinker? - -**Pythinker Code**is an open-source AI engineering agent that lives in your terminal. Give it a task — refactor a module, trace a bug, scaffold a feature — and it plans, executes tools, observes results, and keeps going until you are satisfied. It runs against **your repo, the shell, the web, and MCP tools**, with the model of your choice. - -It ships with first-class subagents for focused work — `coder` for scoped edits, `explore` for codebase reconnaissance, and `plan` for implementation design — all dispatched in parallel, isolated contexts from a single iterative loop. - -It speaks the [**Agent Client Protocol (ACP)**](https://agentclientprotocol.com/), so it slots cleanly into ACP-aware editors like Zed and JetBrains. It loads [**Model Context Protocol (MCP)**](https://modelcontextprotocol.io/) servers, so the same tools your other agents use just work. And it's hackable: subagents, skills, hooks, and plugins are all first-class extension points. - -> **Plan · Execute · Verify · Iterate.**One agent, one shell, one workflow. No tab-switching. No context loss. No magic. - ---- - -## Features - - - - - - - - - - - - - - - - - - -
- -### Terminal-First +## Get the desktop app -A purpose-built TUI tuned for long, focused agent sessions. Single-binary install, no Node.js required for end users, ready in milliseconds. +**[Download for macOS or Windows](https://code.pythinker.com/)** - +Install it, open it, and describe a task. Pythinker then works on your project the way a colleague would: it reads the code, changes files, runs commands, checks what happened, and keeps going until the job is done. -### Subagents & Skills +The app runs the whole agent on your machine. It starts a local host bound to loopback, so nothing is exposed to your network. Closing the window hides the app to the tray instead of killing it, so a long session survives. -Dispatch `coder`, `explore`, and `plan` subagents in parallel, isolated contexts. Load reusable repo-local instructions via `/skill:`. +If you already use the CLI, the app picks up the same data directory (`~/.pythinker-code/` by default). Your login, providers, MCP servers, and past sessions are already there. Updates install themselves, and Settings has a switch if you would rather they did not. -
+macOS gets a `.dmg`. Windows gets a per-user installer that does not ask for administrator rights. There is no Linux build yet, so on Linux use the terminal version or run `pythinker web` for the browser interface. -### ACP IDE Integration +More detail is in the [desktop guide](https://pymodel.github.io/pythinker-code/guides/desktop). -Run `pythinker acp` and any [Agent Client Protocol](https://agentclientprotocol.com/) editor — Zed, JetBrains, and more — gets a full Pythinker session inline. - - - -### MCP Tool Loading +--- -Add and authenticate MCP servers conversationally with `/mcp-config`. Plus a rich plugin ecosystem: skills, MCP servers, and data sources from the marketplace or GitHub. +## What the agent can do -
+Everything below behaves the same in the app, in the terminal, and in your editor. -### Trust & Control +### Work on a real codebase -Approval flows to review tool calls before they run, a granular permission model, and lifecycle hooks to gate risky calls, audit decisions, and wire automation. +Pythinker searches and reads your repository, edits files, runs shell commands, and reads the output before it decides what to do next. It runs your tests, reads the failures, and tries again. Ask it to refactor a module, trace a bug, or fill in missing tests, and give it as much rope as you are comfortable with. - +### Split work across subagents -### Bring Your Own Model +Large tasks get delegated. A `coder` subagent makes scoped edits, `explore` maps unfamiliar parts of the repo, and `plan` designs the approach. They run in parallel with their own context, so the main conversation stays readable instead of filling with file dumps. -Works out of the box with [Pythinker models](https://pythinker.com); configurable for other compatible LLM APIs. +### Keep control of the tools -
+You see a tool call before it runs, and you approve it. The permission model lets you pre-approve the boring calls and hold the risky ones. Hooks fire on lifecycle events, so you can block a command, record a decision, or trigger something in your own systems. -### Web & Dashboard UIs +### Load your own tools and instructions -A companion browser interface (`apps/pythinker-web`) and a session dashboard for replaying and debugging agent sessions (`apps/dashboard`). +`/mcp-config` adds and authenticates [Model Context Protocol](https://modelcontextprotocol.io/) servers from inside a session, over stdio or HTTP, and remembers them for next time. Skills are repo-local instruction files that load on demand with `/skill:`. Plugins bundle skills, servers, and data sources from the marketplace or straight from GitHub. - +### Use the model you want -### Video Input +Pythinker models work out of the box. Other providers work by configuration, including any OpenAI-compatible endpoint and local ones. -Drop screen recordings into the conversation — let the agent *see* what is hard to describe. +### Show it instead of describing it -
+Drop a screen recording into the conversation when the bug is easier to show than to write down. --- -## Quick Start +## In the terminal -Pythinker ships **native installers**— no Node.js prerequisite. Pick the row that matches your OS: - -| Platform | Recommended install | Source | -|---|---|---| -| macOS Linux **macOS / Linux**| `curl -fsSL https://code.pythinker.com/pythinker-code/install.sh \| bash` | [code.pythinker.com](https://code.pythinker.com) | -| Homebrew **Homebrew**| `brew install pymodel/tap/pythinker-code` | Homebrew | -| Windows **Windows (PowerShell)**| `irm https://code.pythinker.com/pythinker-code/install.ps1 \| iex` | [code.pythinker.com](https://code.pythinker.com) | -| Nix **Nix**| `nix run github:PyModel/pythinker-code` | flake | -| npm **npm / pnpm fallback**| `npm install -g @pymodel/pythinker-code` | requires Node.js ≥ 26.4.0 | - -> [!NOTE] -> **Windows:**install [Git for Windows](https://gitforwindows.org/) before first launch — Pythinker Code uses the bundled Git Bash as its shell. For a custom Git Bash location, set `PYTHINKER_SHELL_PATH` to the absolute path of `bash.exe`. +The CLI ships as a native binary, so there is no Node.js prerequisite. -After install, open a **new shell**: - -```sh -pythinker --version # confirm install -``` - -### Authenticate +| Platform | Command | +|---|---| +| macOS / Linux | `curl -fsSL https://code.pythinker.com/pythinker-code/install.sh \| bash` | +| Homebrew | `brew install pymodel/tap/pythinker-code` | +| Windows (PowerShell) | `irm https://code.pythinker.com/pythinker-code/install.ps1 \| iex` | +| Nix | `nix run github:PyModel/pythinker-code` | +| npm | `npm install -g @pymodel/pythinker-code` (needs Node.js 26.4+) | ```sh cd your-project pythinker ``` -On first launch, run `/login` and choose **[Pythinker Code OAuth](https://pythinker.com/code)**or an **[API key from the console](https://pythinker.com/code/console)**. - -### Try it out - -``` -Take a look at this project and explain its main directories. -``` +Run `/login` on first launch and pick [OAuth](https://pythinker.com/code) or an [API key](https://pythinker.com/code/console). Then ask for something real: -``` +```text Find where authentication is handled and add a unit test for the token refresh path. ``` -``` -Refactor the error handling in src/api/ to use a shared Result type — keep the diff minimal. -``` - -| Command | Description | -|---------|-------------| -| `/login` | Authenticate with OAuth or API key | -| `/mcp-config` | Manage MCP servers conversationally | -| `/skill:` | Invoke an installed skill | -| `/help` | Built-in keyboard shortcut reference | +> [!NOTE] +> On Windows, install [Git for Windows](https://gitforwindows.org/) first. Pythinker uses the bundled Git Bash as its shell. To point at a different one, set `PYTHINKER_SHELL_PATH` to the full path of `bash.exe`. -For upgrade, uninstall, headless/automation usage, and platform-specific notes, see the [Getting Started guide](https://pymodel.github.io/pythinker-code/guides/getting-started). +
+Pythinker Code terminal demo +
--- -## IDE Integration via ACP +## In your editor -Pythinker speaks [**Agent Client Protocol**](https://agentclientprotocol.com/) natively. Log in once via the CLI, then point your ACP-compatible editor at `pythinker acp` for a full agent session inside your IDE. +Pythinker speaks the [Agent Client Protocol](https://agentclientprotocol.com/), so Zed, JetBrains, and other ACP editors can host a full session inline. Log in once from the CLI, then point the editor at `pythinker acp`.
-Configuration for Zed / JetBrains +Zed configuration Add to `~/.config/zed/settings.json`: @@ -204,7 +127,7 @@ Add to `~/.config/zed/settings.json`:
-Open a new conversation in Zed's Agent panel. For JetBrains setup, troubleshooting, and the full capability matrix, see [Using in IDEs](https://pymodel.github.io/pythinker-code/guides/ides) and the [`pythinker acp` reference](https://pymodel.github.io/pythinker-code/reference/pythinker-acp). +[Using in IDEs](https://pymodel.github.io/pythinker-code/guides/ides) covers JetBrains setup and the capability matrix.
ACP IDE integration demo @@ -212,164 +135,74 @@ Open a new conversation in Zed's Agent panel. For JetBrains setup, troubleshooti --- -## MCP Tooling - -Pythinker loads [Model Context Protocol](https://modelcontextprotocol.io/) tools so the same servers your other agents use just work — stdio and HTTP transports, OAuth-backed servers, persistent config. - -Inside a session, `/mcp-config` manages everything conversationally: - -``` -/mcp-config # add, authenticate, test, and remove MCP servers -``` - -See the [configuration docs](https://pymodel.github.io/pythinker-code/configuration/config-files) for config-file based setup. - ---- - -## Architecture - -Pythinker Code is a **pnpm monorepo**. The CLI consumes capabilities through the SDK and never depends directly on internal engine packages. - -

- Pythinker Code architecture -

- -| Package | Role | -|---------|------| -| `apps/pythinker-code` | CLI and terminal UI — the primary user-facing entry point | -| `packages/agent-core` | Unified agent engine: sessions, tools, skills, permissions, plans | -| `packages/kosong` | "Any LLM" — LLM and provider abstraction layer | -| `packages/kaos` | Execution environment and file/process abstractions | -| `packages/server` | Hosts agent sessions over REST + WebSocket (`/api/v1`) | -| `packages/node-sdk` | Public TypeScript SDK for embedding and automation | - ---- - -## Extensibility - -Pythinker is a small, extensible runtime — not a monolith. Build on it. - -| Extension Point | What it does | Where to look | -|---|---|---| -| **Subagents**| Delegate focused work to `coder`, `explore`, and `plan` agents in isolated contexts | built-in | -| **Skills**| `/skill:` loads reusable, repo-local instructions on demand | bundled & user-defined | -| **Hooks**| Observe or block tool execution; integrate policy or automation | lifecycle hook events | -| **Plugins**| Skills, MCP servers, and data sources from the marketplace or GitHub | plugin ecosystem | -| **SDK**| Embed agent capabilities in your own tools | [`@pymodel/pythinker-code-sdk`](packages/node-sdk) | - ---- - ## Documentation | Topic | Link | |-------|------| -| Getting Started | [guides/getting-started](https://pymodel.github.io/pythinker-code/guides/getting-started) | -| Interaction & approvals | [guides/interaction](https://pymodel.github.io/pythinker-code/guides/interaction) | +| Desktop app | [guides/desktop](https://pymodel.github.io/pythinker-code/guides/desktop) | +| Getting started | [guides/getting-started](https://pymodel.github.io/pythinker-code/guides/getting-started) | +| Interaction and approvals | [guides/interaction](https://pymodel.github.io/pythinker-code/guides/interaction) | | Sessions | [guides/sessions](https://pymodel.github.io/pythinker-code/guides/sessions) | -| IDE integration | [guides/ides](https://pymodel.github.io/pythinker-code/guides/ides) | | Configuration | [configuration/config-files](https://pymodel.github.io/pythinker-code/configuration/config-files) | | Command reference | [reference/pythinker-command](https://pymodel.github.io/pythinker-code/reference/pythinker-command) | -| Pythinker Code product | [pythinker.com/code](https://pythinker.com/code) | --- ## Development -### Prepare the workspace +Pythinker Code is a pnpm monorepo. The desktop app and the CLI both talk to the SDK, never to the engine packages directly. -**Requirements:**Node.js ≥ 26.4.0 · pnpm 10.34.3 · Git +

+ Pythinker Code architecture +

+ +| Package | Role | +|---------|------| +| `apps/desktop` | macOS and Windows desktop application | +| `apps/pythinker-code` | CLI and terminal UI | +| `apps/pythinker-web` | Browser interface that the desktop app renders | +| `packages/agent-core` | Agent engine: sessions, tools, skills, permissions, plans | +| `packages/kosong` | LLM and provider abstraction | +| `packages/kaos` | Execution environment, file and process abstractions | +| `packages/server` | REST and WebSocket session host (`/api/v1`) | +| `packages/node-sdk` | Public TypeScript SDK | + +Requirements: Node.js 26.4+, pnpm 10.34.3, Git. ```sh git clone https://github.com/PyModel/pythinker-code.git cd pythinker-code pnpm install -``` - -### Common commands - - - - - - -
- -**▶ Run & iterate** -```sh -pnpm dev:cli # CLI in dev mode -pnpm dev:web # browser UI -pnpm dev:server # agent server -pnpm dashboard # session dashboard -``` - - -**Verify** -```sh -pnpm test # test suite (Vitest) -pnpm typecheck # TypeScript check -pnpm lint # lint with oxlint -pnpm build # build all packages -``` - -
- ---- - -## Project Layout - -``` -pythinker-code/ -├── apps/ -│ ├── pythinker-code/ CLI · TUI · ACP · the primary entry point -│ ├── pythinker-web/ Companion browser UI (Vue 3) -│ └── dashboard/ Session replay & debugging -├── packages/ -│ ├── agent-core/ Unified agent engine: sessions · tools · skills · permissions -│ ├── kosong/ "Any LLM" provider abstraction -│ ├── kaos/ Execution environment & file/process abstractions -│ ├── server/ REST + WebSocket session host (/api/v1) -│ └── node-sdk/ Public TypeScript SDK -└── per-package test suites (Vitest) +pnpm dev:desktop # desktop app in dev mode +pnpm dev:cli # CLI in dev mode +pnpm test # Vitest +pnpm typecheck # TypeScript +pnpm lint # oxlint +pnpm build # build everything ``` --- ## Contributing -Contributions are warmly welcome — bug reports, PRs, plugins, skills, and docs all help. - -- Start with [`CONTRIBUTING.md`](CONTRIBUTING.md) -- See [`SECURITY.md`](SECURITY.md) for responsible disclosure -- **Discuss first**for new features, large refactors, or API changes — open an issue before coding -- **Follow Conventional Commits**(`feat:`, `fix:`, `docs:`, …) and include a changeset (`pnpm changeset`) when your PR affects release artifacts -- **Understand your diff**— AI-assisted PRs are held to the same standard as hand-written ones +Bug reports, PRs, plugins, skills, and docs are all welcome. Start with [`CONTRIBUTING.md`](CONTRIBUTING.md), and read [`SECURITY.md`](SECURITY.md) before reporting a vulnerability. -If Pythinker helps you, **a on GitHub goes a long way.** +Open an issue before large refactors or API changes. Use Conventional Commits, add a changeset (`pnpm changeset`) when your PR affects a release artifact, and be ready to explain your diff. AI-assisted PRs are held to the same standard as hand-written ones. --- ## License -Distributed under the **MIT License**. See [`LICENSE`](LICENSE) for the full text. +MIT. See [`LICENSE`](LICENSE). -Our TUI is built on [`pi-tui`](https://github.com/earendil-works/pi-mono/tree/main/packages/tui) — thank you to the authors for their excellent work. - -
+Our TUI is built on [`pi-tui`](https://github.com/earendil-works/pi-mono/tree/main/packages/tui). Thanks to its authors.
-**Built with for engineers who live in the terminal.** - -[ code.pythinker.com](https://code.pythinker.com)  ·  -[ npm](https://www.npmjs.com/package/@pymodel/pythinker-code)  ·  -[ GitHub](https://github.com/PyModel/pythinker-code)  ·  -[ Docs](https://pymodel.github.io/pythinker-code/)  ·  -[ ACP](https://agentclientprotocol.com/)  ·  -[ MCP](https://modelcontextprotocol.io/) - -

- Thanks for visiting Pythinker! -

+[code.pythinker.com](https://code.pythinker.com)  ·  +[Download](https://code.pythinker.com/)  ·  +[npm](https://www.npmjs.com/package/@pymodel/pythinker-code)  ·  +[Docs](https://pymodel.github.io/pythinker-code/)
diff --git a/docs/media/desktop-ui.webp b/docs/media/desktop-ui.webp new file mode 100644 index 0000000000000000000000000000000000000000..5874c4f1b626408923f55c8ad074d8482f6e469c GIT binary patch literal 23606 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