Repository navigation
Releases: kunpengtalk/PeakCode
Release list
Peak Code v0.9.0
Full Changelog: v0.8.1...v0.9.0
Peak Code v0.8.1
Full Changelog: v0.8.0...v0.8.1
Peak Code v0.8.0
Full Changelog: v0.7.2...v0.8.0
Peak Code v0.7.2
Full Changelog: v0.7.1...v0.7.2
Peak Code v0.7.1
Full Changelog: v0.7.0...v0.7.1
Peak Code v0.7.0
Full Changelog: v0.6.0...v0.7.0
Peak Code v0.6.0
Full Changelog: v0.5.0...v0.6.0
Peak Code v0.5.0
What's Changed
Full Changelog: v0.4.0...v0.5.0
Peak Code v0.4.0
The changes in this release, from CHANGELOG.md:
Added
-
The agent can use this Mac: the
computertool drives native apps the way a person does.get_statereads the accessibility tree of the app in front — each control's role, name, position, size and the actions it actually supports, with a ref to act on — andactpresses, focuses, raises or writes a value on that ref without moving your pointer or taking your focus.click/type/keypost real input for the targets a tree cannot express (a canvas, a custom-drawn control) and say so, because they do move the cursor and type into your focus. Ascreenshotcomes back as an image with the display's scale already accounted for, so the point you read off the picture goes straight intoclick. Observation is bounded twice so a wedged app cannot hang the socket, element actions through the accessibility API are preferred over coordinates, and a ref from an older observation is refused with an explanation rather than quietly landing on whatever now sits at that position. The work runs in a native helper of its own — a small Peak Code Computer Use app, which is what macOS files the Accessibility and Screen Recording grants against rather than Peak Code itself — installed at a fixed path, launched through LaunchServices, and rebuilt only when its own source changes, so those two switches in System Settings are a once-per-machine decision that survives every rebuild. A packaged build ships the helper inContents/Resources/computer-use; a checkout compiles it on first launch; either way the installed bundle is fingerprinted and left untouched when it is already current. When a permission is missing, the model is told exactly which one and to stop until the user grants it. The same tool moves through a window the way a person does —scrollwith a direction and a distance,dragas one gesture along a path (a slider, a reorder, a selection, a canvas) with modifiers if the gesture needs them, andclickwith double and right-button forms — and the clipboard is part of the desktop rather than a secret behindtype:read_clipboardgets what the user or an app just copied,write_clipboardhands text to an app that wants a paste, andtypecan takestrategy: \"paste\"to enter long text or CJK as one ⌘V instead of hundreds of keystrokes (the user's clipboard is put back afterwards).list_windowsreports every on-screen window with bounds a click can be aimed at,displaysreports the displays and their scale factors, and coordinates are handled properly on both counts: a capture carries where it started on screen and the scale of the display it is on, so a point read off a screenshot of a window on a second monitor lands where it looks like it should — the earlier code divided by the main display's scale and ignored the capture's origin, which put clicks off by the window's distance from the screen's corner. The helper now answers a bug in one of its own handlers with aninternal_errorthat names it instead of taking the process down with it. macOS only. (.docs/computer-use.md) -
Plugins attach to a turn, several at a time. A plugin card in
/plugins— or one of the installed tiles — opens a detail view (long description, capabilities, the skills it ships, example prompts) whose Use plugin / 立即使用 action puts the plugin on the composer of the chat you were last in, opening a new chat when there is none. The composer's+menu lists the discovered plugins too, as checkboxes, so one turn can carry more than one, and each shows up as a removable chip. Chips live on the composer draft next to images, pasted screenshots and assistant selections — attaching a plugin never costs you an attachment — and the turn carries them asmentionsexactly the way an@nametoken does, deduped so a plugin both named in the prompt and picked as a chip is sent once. (.docs/bundled-plugins.md) -
IM channels: a message sent from a chat app opens (or continues) a thread in the workspace and the answer is sent back into the chat, so the run stays a conversation you can open and continue in the app. Six channel ids: personal WeChat (a QR handshake mints its credentials, then a bridge long-polls outward, so no public URL is needed), Feishu/Lark and QQ over their own outbound sockets, 企业微信 and 微信公众号 as signed Tencent callbacks (those two need public HTTPS), and a generic webhook that carries both directions — the push-only group robots that announce a finished run and the secret-guarded inbound bridge. The bridge keeps its conversation index in SQLite (migration
042_ImConversations), starts a fresh thread aftersessionIdleHoursidle (default 12,0= never), resolves workspace and model per turn because an IM run has no composer, queues a message that arrives mid-turn, and withdraws the channel's own "working on it" notice once the answer lands. Config and status traffic is owner-only — these endpoints can mint a pairing link — while the Tencent callbacks authenticate by signature andPOST /api/im/taskby its own secret, which is mandatory as soon as the server is reachable beyond loopback. Settings → 频道 renders the whole surface: per-channel status, the callback URL to paste into Tencent, Save/Test, the remembered conversations and the recent traffic. (.docs/im-channels.md) -
Phone access without a networking project: a Cloudflare quick tunnel (
cloudflared) publishes the server on anhttps://*.trycloudflare.comaddress so a phone reaches it without port forwarding or a public IP, and a pairing QR opens the workspace — or the conversation that was on screen — on the other device, with the one-time credential in the URL hash so it never reaches a server log. The tunnel is refused unless the server requires authentication (the address is public), acts only on realenabledtransitions so an unrelated settings write cannot rotate the address, and stops itself when the backend shuts down. (.docs/im-channels.md) -
Pi packages under Settings → Pi Packages: install, list and remove the packages
pi installunderstands —npm:@scope/pkg,git:host/user/repo, and local paths — from the app. Installs go through pi's own package manager, so sources land in the samesettings.jsonthe CLI reads and a package installed here is visible topi list. The listing reports what each package contributes (skills, prompts, extensions, themes) and where it was installed; new threads load it on their next start, and/reloadpicks it up in an open thread. This is the surface that makes third-party packages like pi-crew usable in Peak Code: its sixcrew_*subagent tools, orchestration skill, and/pi-crew-plan//pi-crew-reviewprompt templates all run in-process. -
Themes and prompt-engineering skills ported from can1357/oh-my-pi (MIT):
bun scripts/generate-oh-my-pi-theme-seeds.tsturns oh-my-pi's 100 pi TUI themes into Peak CodeChromeThemeseeds (apps/web/src/theme/oh-my-pi.seed.generated.ts), selectable in the appearance picker asomp-*; and its two prompt-engineering skills (system-prompts,semantic-compression) ship as a bundled in-tree payload written to the shared skill library at startup, soread_skilland/skill:resolve them with no network. Both are additive: the skills follow the existingAGENT_SKILL_PACKSswitch (the same one that governs the default pack, so turning it off drops both), and the themes have no switch of their own — they are extra options in the picker, and not choosing one changes nothing. (.docs/oh-my-pi-integration.md) -
Skills have a per-skill switch, and the ported content has commands. Settings → Skills now carries a toggle on every local skill: switching one off keeps its files on disk but removes it from the agent's per-turn skill list and makes
read_skillrefuse it, so a skill you do not want cannot be listed or opened. It is stored asAGENT_DISABLED_SKILLS(empty by default — nothing changes until you use it) and keys on the skill's directory name, the same idread_skillresolves. Three composer commands make the ported skills usable without describing them by hand:/compressdrivessemantic-compression,/prompt-reviewdrivessystem-prompts, and/review-prsruns this repository's own gate (bash scripts/pr-review.sh <PR number|--all|nothing to auto-detect>, reporting its verdict). All three insert their instruction into the composer for you to read before sending, like/subagents. (.docs/oh-my-pi-integration.md) -
Extension failures are reported in the thread instead of being dropped: every extension that fails to load, and every extension handler that throws while a turn runs, now emits a
runtime.warningnaming the extension and the event. Extension load errors were previously invisible unless the model happened to notice a missing tool. -
Scheduled tasks (Automations,
/automations): a plan plus one instruction plus the workspace it runs in. When the plan comes due, the server opens a real thread in that workspace and sends it the instruction, so every run leaves a conversation you can read and continue. Plans are once, daily and weekly, evaluated as wall-clock times in an IANA timezone; a task can be paused, resumed or run by hand, a one-off switches itself off once it has run, and a trigger missed by more than six hours is rolled forward instead of firing late. Each task carries the composer's interaction mode (Agent / Plan / Goal) into its runs. (.docs/automations.md) -
The
schedule_taskagent tool: "every morning, summarise what changed here" now schedules the task...
Peak Code v0.3.0
What's Changed
- fix(gateway): tolerate malformed SSE chunks and fix Anthropic tool bl… by @ccbq2010 in #16
- feat(settings): add Model Providers panel to manage pi models.json by @Neonity2020 in #19
- docs(readme): explain the macOS damaged-app prompt and how to unblock it by @jwangkun in #21
- feat(settings): pi model provider dialogs, agent toolkit, kanban boards, and unified app identity by @jwangkun in #20
- fix(web): repair the browser test harness so CI can pass by @jwangkun in #22
New Contributors
Full Changelog: v0.0.2...v0.3.0