pcode 0.1.0__tar.gz → 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pcode-0.1.0 → pcode-0.1.2}/PKG-INFO +44 -27
- {pcode-0.1.0 → pcode-0.1.2}/README.md +37 -20
- {pcode-0.1.0 → pcode-0.1.2}/pyproject.toml +23 -8
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/app.py +214 -29
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/aside_ui.py +2 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cli.py +3 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/compaction.py +12 -7
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/config.py +19 -7
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/controller.py +53 -8
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/listener.py +2 -2
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extension_guide.md +2 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/host.py +37 -12
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/job_notices.py +3 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/jobs.py +124 -18
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/logins.py +5 -2
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/mcp_notice.py +1 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian_reminders.py +16 -3
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/models.py +11 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/planning.py +1 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/popup_ui.py +13 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/preferences.py +11 -4
- pcode-0.1.2/src/pcode/proctitle.py +60 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/remote.py +78 -18
- pcode-0.1.2/src/pcode/retries.py +36 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/sandbox.py +2 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/sessions.py +196 -8
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/stall_log.py +49 -11
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/steering.py +14 -2
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/stream_display.py +2 -1
- pcode-0.1.2/src/pcode/terminal_text.py +20 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/thinking_markdown.py +3 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tool_panel.py +37 -5
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tree_ui.py +2 -1
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/ui.py +8 -27
- pcode-0.1.0/src/pcode/retries.py +0 -28
- {pcode-0.1.0 → pcode-0.1.2}/.gitignore +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/LICENSE +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/__init__.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/_job_supervisor.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/agent.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/anthropic_oauth.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/appearance.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/aside.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/aside_guard.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/auth.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/block.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/browser.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cache_diagnostics.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cache_settings.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cache_warnings.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/__init__.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/cli.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/errors.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/messages.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/model.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/resume.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/session.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/session_pool.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/workspace.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/clipboard.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/code_mode.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/codex_login.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/command_transcript.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/commands.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/completion.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/context_breakdown.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/context_usage.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/conversation_ids.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/conversation_tree.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/copy_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/delegation.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/delta.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/diagnostics.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edit_preview.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edit_transcript.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edit_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edits.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/__init__.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/cli.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/mailbox.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/outbound.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/parsing.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/render.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/state.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/error_report.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/ext.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/browser.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/ponytail.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/sandbox.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/session_history.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/web_research.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/file_refs.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/filesystem.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/frame.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/gateway.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/git_diff.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/history.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/history_cursor.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/history_embeddings.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/host_protocol.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/host_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/input_keys.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/inspection.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/inspector_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/isolated_delegation.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/jobs_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/keymap.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/layout_speed.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/links.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/links_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/live.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/llm_proxy.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/mcp.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/mcp_oauth.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian_process.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian_setup.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/model_metadata.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/model_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/native_results.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/oauth_pages.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/output_limits.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/paste.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/path_completion.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/plan_preview.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/plan_sizes.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/prefix_keys.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/profile_benchmark.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/profiling.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/project_trust.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/prompt_keys.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/remote_print.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/remote_profile.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/replay_benchmark.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/repo_context.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/rpc.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/runtime.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/session_naming.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/session_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/shell.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/shell_mode.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/shell_tools.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/skills.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/startup_input.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/stream_events.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/strict_tools.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/syntax.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/syntax_colors.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/task_prompt.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/task_worktrees.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/terminal_notify.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/theme.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/theme_gallery.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/token_accounting.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tool_display.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tool_output_limits.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/transcript_log.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/transcript_notice.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/turn.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/usage.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/word_wrap.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/worker_ui.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/workers.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/workspace.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/workspace_filesystem.py +0 -0
- {pcode-0.1.0 → pcode-0.1.2}/src/pcode/worktree.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pcode
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Terminal-native AI coding agent with background jobs, parallel worktrees, forkable sessions, and multi-model support
|
|
5
5
|
Project-URL: Homepage, https://github.com/cruxwell/pcode
|
|
6
6
|
Project-URL: Documentation, https://cruxwell.github.io/pcode/
|
|
@@ -21,29 +21,34 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
22
|
Classifier: Topic :: Software Development
|
|
23
23
|
Requires-Python: >=3.11
|
|
24
|
-
Requires-Dist: filelock<4
|
|
24
|
+
Requires-Dist: filelock<5,>=4
|
|
25
25
|
Requires-Dist: genai-prices<0.2,>=0.1.7
|
|
26
|
-
Requires-Dist: httpx2<3,>=2.13
|
|
26
|
+
Requires-Dist: httpx2<3,>=2.13.1
|
|
27
27
|
Requires-Dist: prompt-toolkit==3.0.53
|
|
28
28
|
Requires-Dist: psutil<8,>=6
|
|
29
|
-
Requires-Dist: pydantic-ai-harness[codemode,coder,exa,playwright]<0.
|
|
30
|
-
Requires-Dist: pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]<3,>=2.
|
|
31
|
-
Requires-Dist: rich<15
|
|
29
|
+
Requires-Dist: pydantic-ai-harness[codemode,coder,exa,playwright]<0.55,>=0.54.0
|
|
30
|
+
Requires-Dist: pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]<3,>=2.54.0
|
|
31
|
+
Requires-Dist: rich<16,>=15
|
|
32
32
|
Requires-Dist: websockets<17,>=15.0.1
|
|
33
33
|
Requires-Dist: yappi<2,>=1.7.6
|
|
34
34
|
Provides-Extra: claude
|
|
35
|
-
Requires-Dist: claude-agent-sdk<0.3,>=0.2.
|
|
35
|
+
Requires-Dist: claude-agent-sdk<0.3,>=0.2.164; extra == 'claude'
|
|
36
36
|
Description-Content-Type: text/markdown
|
|
37
37
|
|
|
38
|
-
<img width="
|
|
39
|
-
|
|
38
|
+
<img width="1392" height="1522" alt="pcode in a dark terminal" src="docs/assets/screenshots/pcode-dark.png" />
|
|
39
|
+
|
|
40
|
+
<img width="1392" height="1522" alt="pcode in a light terminal" src="docs/assets/screenshots/pcode-light.png" />
|
|
40
41
|
|
|
41
42
|
# pcode
|
|
42
43
|
|
|
43
|
-
pcode is a terminal-native coding agent
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
pcode is a terminal-native coding agent that lets you change what's visible in
|
|
45
|
+
your scrollback, even after the work is done. Expand commands, output, and diffs
|
|
46
|
+
when you need the details; hide them when you want to read the conversation.
|
|
47
|
+
The same history, with the detail you choose.
|
|
48
|
+
|
|
49
|
+
Long-running commands continue in the background and wake the agent when they
|
|
50
|
+
finish. Run sessions in separate git worktrees, or rewind and branch a
|
|
51
|
+
conversation to try another approach.
|
|
47
52
|
|
|
48
53
|
- **Slow work doesn't block you.** Long commands become background jobs, and a
|
|
49
54
|
finished job wakes the agent, so it can watch tests or CI and fix what fails.
|
|
@@ -51,8 +56,9 @@ tool call stays inspectable.
|
|
|
51
56
|
on one repo at once.
|
|
52
57
|
- **Rewind and fork.** `/tree` returns to any point in a conversation and
|
|
53
58
|
branches from there. Every session is kept, so you can resume or search it.
|
|
54
|
-
- **
|
|
55
|
-
|
|
59
|
+
- **Change your view, not your history.** Show or hide commands, output, and
|
|
60
|
+
diffs throughout the conversation. Hidden output stays available, and `/tools`
|
|
61
|
+
lets you inspect every tool call and its full output.
|
|
56
62
|
|
|
57
63
|
It runs on any model [Pydantic AI](https://ai.pydantic.dev/) supports, or on
|
|
58
64
|
your Claude or ChatGPT subscription.
|
|
@@ -65,29 +71,38 @@ With [Homebrew](https://brew.sh/):
|
|
|
65
71
|
|
|
66
72
|
```sh
|
|
67
73
|
brew tap cruxwell/pcode https://github.com/cruxwell/pcode.git
|
|
68
|
-
brew install
|
|
74
|
+
brew install cruxwell/pcode/pcode
|
|
69
75
|
```
|
|
70
76
|
|
|
77
|
+
Or from [PyPI](https://pypi.org/project/pcode/) with [uv](https://docs.astral.sh/uv/):
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
uv tool install 'pcode[claude]'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`brew install --HEAD` tracks `master` instead of the latest release.
|
|
84
|
+
|
|
71
85
|
## Quick start
|
|
72
86
|
|
|
73
87
|
```sh
|
|
74
|
-
|
|
75
|
-
pcode -m openai-codex:gpt-5.6-luna #
|
|
76
|
-
pcode
|
|
88
|
+
pcode -m claude:claude-sonnet-5 # Claude subscription; run /login claude if not signed in
|
|
89
|
+
pcode -m openai-codex:gpt-5.6-luna # ChatGPT subscription (/login openai-codex)
|
|
90
|
+
pcode -m anthropic:claude-sonnet-5 # or any provider, with its API key set
|
|
91
|
+
pcode # reuses the model /model (Ctrl+L) saved; with none, an offline preview
|
|
77
92
|
pcode -C /path/to/repo "Summarize the open TODOs"
|
|
78
93
|
git diff | pcode -p --no-save # non-interactive: reply to stdout
|
|
79
94
|
pcode --continue # resume this directory's newest session
|
|
80
95
|
pcode --theme-preview # offline sample output and the style gallery
|
|
81
96
|
```
|
|
82
97
|
|
|
83
|
-
**
|
|
98
|
+
**The agent edits files and runs shell commands with your permissions and no
|
|
84
99
|
approval prompt.** Read [tool permissions](https://cruxwell.github.io/pcode/tools/#tool-permissions)
|
|
85
100
|
before pointing it at anything you care about.
|
|
86
101
|
|
|
87
102
|
## More
|
|
88
103
|
|
|
89
104
|
- **Your subscription:** Claude runs through Anthropic's own Agent SDK and
|
|
90
|
-
Claude Code login
|
|
105
|
+
Claude Code login (the route Anthropic supports), and ChatGPT through a Codex
|
|
91
106
|
login. See [providers](https://cruxwell.github.io/pcode/providers/).
|
|
92
107
|
- [Email remote control](https://cruxwell.github.io/pcode/email/): send a task
|
|
93
108
|
from Gmail on your phone, reply to keep going, and take the session over at a
|
|
@@ -97,10 +112,10 @@ before pointing it at anything you care about.
|
|
|
97
112
|
`jj` to leave insert mode.
|
|
98
113
|
- `/btw` side questions, background sessions, recall of past sessions, a
|
|
99
114
|
browser the agent can drive, and Python extensions.
|
|
100
|
-
- Pydantic AI's Harness coder
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
115
|
+
- Built on Pydantic AI's Harness coder, with MCP (OAuth and tool search),
|
|
116
|
+
searchable sessions, jobs and worktrees on top. Extensions are plain
|
|
117
|
+
Pydantic AI capabilities. The conversation tree follows
|
|
118
|
+
[pi](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/tree.md)'s.
|
|
104
119
|
|
|
105
120
|
See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the longer-term direction.
|
|
106
121
|
|
|
@@ -108,21 +123,23 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
|
|
|
108
123
|
|
|
109
124
|
| Page | What it covers |
|
|
110
125
|
| --- | --- |
|
|
111
|
-
| [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew and source installs,
|
|
126
|
+
| [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew, uv and source installs, signing in, `--print`, shell completion |
|
|
112
127
|
| [Scrollback and transparency](https://cruxwell.github.io/pcode/guide/scrollback/) | Guide: what goes into scrollback, `/tools`, `/diffs` |
|
|
113
128
|
| [A shell for long-running work](https://cruxwell.github.io/pcode/guide/shell/) | Guide: background jobs, watching CI |
|
|
114
129
|
| [Parallel agents](https://cruxwell.github.io/pcode/guide/parallel/) | Guide: worktrees, parallel sub-agents, `/agents` |
|
|
115
130
|
| [Extending pcode](https://cruxwell.github.io/pcode/guide/extending/) | Guide: extensions, skills, settings |
|
|
116
|
-
| [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code,
|
|
131
|
+
| [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, proxies |
|
|
117
132
|
| [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
|
|
118
133
|
| [Commands and keys](https://cruxwell.github.io/pcode/commands/) | Slash commands, key bindings, vi mode, tmux newlines, status line, `!command`, the diff and tool inspectors |
|
|
119
134
|
| [Keybindings](https://cruxwell.github.io/pcode/keybindings/) | Custom command mappings with `/bind`, Ctrl shortcuts, vi editing, a normal-mode leader, and custom escape sequences such as `jj` |
|
|
135
|
+
| [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, iTerm2 and tmux settings |
|
|
120
136
|
| [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
|
|
121
137
|
| [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
|
|
122
138
|
| [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
|
|
123
139
|
| [Sessions and recovery](https://cruxwell.github.io/pcode/sessions/) | Saving, resuming, recalling earlier sessions, checkpoints, retries |
|
|
124
140
|
| [Context, limits and caching](https://cruxwell.github.io/pcode/context/) | Prompt overhead, compaction, output limits, prompt cache notices |
|
|
125
141
|
| [The transcript](https://cruxwell.github.io/pcode/transcript/) | What lands in scrollback: diffs, thinking, errors, command output, `/redraw` |
|
|
142
|
+
| [Email remote control](https://cruxwell.github.io/pcode/email/) | Driving a session from Gmail, the remote profile |
|
|
126
143
|
| [Conversation tree](https://cruxwell.github.io/pcode/conversation-tree/) | `/tree`: rewinding and forking a conversation |
|
|
127
144
|
| [Side questions](https://cruxwell.github.io/pcode/side-questions/) | `/btw`: asking about the running turn without interrupting it |
|
|
128
145
|
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
<img width="
|
|
2
|
-
|
|
1
|
+
<img width="1392" height="1522" alt="pcode in a dark terminal" src="docs/assets/screenshots/pcode-dark.png" />
|
|
2
|
+
|
|
3
|
+
<img width="1392" height="1522" alt="pcode in a light terminal" src="docs/assets/screenshots/pcode-light.png" />
|
|
3
4
|
|
|
4
5
|
# pcode
|
|
5
6
|
|
|
6
|
-
pcode is a terminal-native coding agent
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
pcode is a terminal-native coding agent that lets you change what's visible in
|
|
8
|
+
your scrollback, even after the work is done. Expand commands, output, and diffs
|
|
9
|
+
when you need the details; hide them when you want to read the conversation.
|
|
10
|
+
The same history, with the detail you choose.
|
|
11
|
+
|
|
12
|
+
Long-running commands continue in the background and wake the agent when they
|
|
13
|
+
finish. Run sessions in separate git worktrees, or rewind and branch a
|
|
14
|
+
conversation to try another approach.
|
|
10
15
|
|
|
11
16
|
- **Slow work doesn't block you.** Long commands become background jobs, and a
|
|
12
17
|
finished job wakes the agent, so it can watch tests or CI and fix what fails.
|
|
@@ -14,8 +19,9 @@ tool call stays inspectable.
|
|
|
14
19
|
on one repo at once.
|
|
15
20
|
- **Rewind and fork.** `/tree` returns to any point in a conversation and
|
|
16
21
|
branches from there. Every session is kept, so you can resume or search it.
|
|
17
|
-
- **
|
|
18
|
-
|
|
22
|
+
- **Change your view, not your history.** Show or hide commands, output, and
|
|
23
|
+
diffs throughout the conversation. Hidden output stays available, and `/tools`
|
|
24
|
+
lets you inspect every tool call and its full output.
|
|
19
25
|
|
|
20
26
|
It runs on any model [Pydantic AI](https://ai.pydantic.dev/) supports, or on
|
|
21
27
|
your Claude or ChatGPT subscription.
|
|
@@ -28,29 +34,38 @@ With [Homebrew](https://brew.sh/):
|
|
|
28
34
|
|
|
29
35
|
```sh
|
|
30
36
|
brew tap cruxwell/pcode https://github.com/cruxwell/pcode.git
|
|
31
|
-
brew install
|
|
37
|
+
brew install cruxwell/pcode/pcode
|
|
32
38
|
```
|
|
33
39
|
|
|
40
|
+
Or from [PyPI](https://pypi.org/project/pcode/) with [uv](https://docs.astral.sh/uv/):
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
uv tool install 'pcode[claude]'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`brew install --HEAD` tracks `master` instead of the latest release.
|
|
47
|
+
|
|
34
48
|
## Quick start
|
|
35
49
|
|
|
36
50
|
```sh
|
|
37
|
-
|
|
38
|
-
pcode -m openai-codex:gpt-5.6-luna #
|
|
39
|
-
pcode
|
|
51
|
+
pcode -m claude:claude-sonnet-5 # Claude subscription; run /login claude if not signed in
|
|
52
|
+
pcode -m openai-codex:gpt-5.6-luna # ChatGPT subscription (/login openai-codex)
|
|
53
|
+
pcode -m anthropic:claude-sonnet-5 # or any provider, with its API key set
|
|
54
|
+
pcode # reuses the model /model (Ctrl+L) saved; with none, an offline preview
|
|
40
55
|
pcode -C /path/to/repo "Summarize the open TODOs"
|
|
41
56
|
git diff | pcode -p --no-save # non-interactive: reply to stdout
|
|
42
57
|
pcode --continue # resume this directory's newest session
|
|
43
58
|
pcode --theme-preview # offline sample output and the style gallery
|
|
44
59
|
```
|
|
45
60
|
|
|
46
|
-
**
|
|
61
|
+
**The agent edits files and runs shell commands with your permissions and no
|
|
47
62
|
approval prompt.** Read [tool permissions](https://cruxwell.github.io/pcode/tools/#tool-permissions)
|
|
48
63
|
before pointing it at anything you care about.
|
|
49
64
|
|
|
50
65
|
## More
|
|
51
66
|
|
|
52
67
|
- **Your subscription:** Claude runs through Anthropic's own Agent SDK and
|
|
53
|
-
Claude Code login
|
|
68
|
+
Claude Code login (the route Anthropic supports), and ChatGPT through a Codex
|
|
54
69
|
login. See [providers](https://cruxwell.github.io/pcode/providers/).
|
|
55
70
|
- [Email remote control](https://cruxwell.github.io/pcode/email/): send a task
|
|
56
71
|
from Gmail on your phone, reply to keep going, and take the session over at a
|
|
@@ -60,10 +75,10 @@ before pointing it at anything you care about.
|
|
|
60
75
|
`jj` to leave insert mode.
|
|
61
76
|
- `/btw` side questions, background sessions, recall of past sessions, a
|
|
62
77
|
browser the agent can drive, and Python extensions.
|
|
63
|
-
- Pydantic AI's Harness coder
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
78
|
+
- Built on Pydantic AI's Harness coder, with MCP (OAuth and tool search),
|
|
79
|
+
searchable sessions, jobs and worktrees on top. Extensions are plain
|
|
80
|
+
Pydantic AI capabilities. The conversation tree follows
|
|
81
|
+
[pi](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/tree.md)'s.
|
|
67
82
|
|
|
68
83
|
See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the longer-term direction.
|
|
69
84
|
|
|
@@ -71,21 +86,23 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
|
|
|
71
86
|
|
|
72
87
|
| Page | What it covers |
|
|
73
88
|
| --- | --- |
|
|
74
|
-
| [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew and source installs,
|
|
89
|
+
| [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew, uv and source installs, signing in, `--print`, shell completion |
|
|
75
90
|
| [Scrollback and transparency](https://cruxwell.github.io/pcode/guide/scrollback/) | Guide: what goes into scrollback, `/tools`, `/diffs` |
|
|
76
91
|
| [A shell for long-running work](https://cruxwell.github.io/pcode/guide/shell/) | Guide: background jobs, watching CI |
|
|
77
92
|
| [Parallel agents](https://cruxwell.github.io/pcode/guide/parallel/) | Guide: worktrees, parallel sub-agents, `/agents` |
|
|
78
93
|
| [Extending pcode](https://cruxwell.github.io/pcode/guide/extending/) | Guide: extensions, skills, settings |
|
|
79
|
-
| [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code,
|
|
94
|
+
| [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, proxies |
|
|
80
95
|
| [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
|
|
81
96
|
| [Commands and keys](https://cruxwell.github.io/pcode/commands/) | Slash commands, key bindings, vi mode, tmux newlines, status line, `!command`, the diff and tool inspectors |
|
|
82
97
|
| [Keybindings](https://cruxwell.github.io/pcode/keybindings/) | Custom command mappings with `/bind`, Ctrl shortcuts, vi editing, a normal-mode leader, and custom escape sequences such as `jj` |
|
|
98
|
+
| [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, iTerm2 and tmux settings |
|
|
83
99
|
| [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
|
|
84
100
|
| [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
|
|
85
101
|
| [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
|
|
86
102
|
| [Sessions and recovery](https://cruxwell.github.io/pcode/sessions/) | Saving, resuming, recalling earlier sessions, checkpoints, retries |
|
|
87
103
|
| [Context, limits and caching](https://cruxwell.github.io/pcode/context/) | Prompt overhead, compaction, output limits, prompt cache notices |
|
|
88
104
|
| [The transcript](https://cruxwell.github.io/pcode/transcript/) | What lands in scrollback: diffs, thinking, errors, command output, `/redraw` |
|
|
105
|
+
| [Email remote control](https://cruxwell.github.io/pcode/email/) | Driving a session from Gmail, the remote profile |
|
|
89
106
|
| [Conversation tree](https://cruxwell.github.io/pcode/conversation-tree/) | `/tree`: rewinding and forking a conversation |
|
|
90
107
|
| [Side questions](https://cruxwell.github.io/pcode/side-questions/) | `/btw`: asking about the running turn without interrupting it |
|
|
91
108
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pcode"
|
|
3
|
-
|
|
3
|
+
dynamic = ["version"]
|
|
4
4
|
description = "Terminal-native AI coding agent with background jobs, parallel worktrees, forkable sessions, and multi-model support"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -21,9 +21,9 @@ classifiers = [
|
|
|
21
21
|
]
|
|
22
22
|
requires-python = ">=3.11"
|
|
23
23
|
dependencies = [
|
|
24
|
-
"filelock>=
|
|
24
|
+
"filelock>=4,<5",
|
|
25
25
|
"genai-prices>=0.1.7,<0.2",
|
|
26
|
-
"httpx2>=2.13,<3",
|
|
26
|
+
"httpx2>=2.13.1,<3",
|
|
27
27
|
# Exact: pcode relies on prompt_toolkit internals, and point releases
|
|
28
28
|
# change them. Bump on purpose after tests/test_prompt_toolkit_internals.py
|
|
29
29
|
# and make test-all pass on the new version.
|
|
@@ -34,13 +34,14 @@ dependencies = [
|
|
|
34
34
|
# itself is downloaded on first use, not at install.
|
|
35
35
|
# Harness ships from the pydantic-ai repo with every Pydantic AI release and
|
|
36
36
|
# pins pydantic-ai-slim to the same minor; bump both together.
|
|
37
|
-
"pydantic-ai-harness[exa,coder,codemode,playwright]>=0.
|
|
37
|
+
"pydantic-ai-harness[exa,coder,codemode,playwright]>=0.54.0,<0.55",
|
|
38
38
|
# duckduckgo and web-fetch back the bundled web_research extension when no
|
|
39
39
|
# provider-native search or Exa key is available.
|
|
40
40
|
# google covers both google and google-cloud providers; bedrock pulls boto3.
|
|
41
|
-
"pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]>=2.
|
|
42
|
-
"rich>=
|
|
41
|
+
"pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]>=2.54.0,<3",
|
|
42
|
+
"rich>=15,<16",
|
|
43
43
|
# FastMCP 4.x OAuth callback server selects Uvicorn's websockets-sansio protocol.
|
|
44
|
+
# Capped below 17 by google-genai (still <17 as of 2.29), not by pcode.
|
|
44
45
|
"websockets>=15.0.1,<17",
|
|
45
46
|
]
|
|
46
47
|
|
|
@@ -49,7 +50,7 @@ dependencies = [
|
|
|
49
50
|
# (about 95 MB to download, 215 MB installed); the sdist would run whatever
|
|
50
51
|
# `claude` is on PATH instead of the CLI version pcode was verified against.
|
|
51
52
|
claude = [
|
|
52
|
-
"claude-agent-sdk>=0.2.
|
|
53
|
+
"claude-agent-sdk>=0.2.164,<0.3",
|
|
53
54
|
]
|
|
54
55
|
|
|
55
56
|
[project.urls]
|
|
@@ -64,7 +65,7 @@ pcode-benchmark = "pcode.profile_benchmark:main"
|
|
|
64
65
|
|
|
65
66
|
[build-system]
|
|
66
67
|
# 1.27 is the first to accept an SPDX `license` string with `license-files`.
|
|
67
|
-
requires = ["hatchling>=1.27"]
|
|
68
|
+
requires = ["hatchling>=1.27", "hatch-vcs>=0.4"]
|
|
68
69
|
build-backend = "hatchling.build"
|
|
69
70
|
|
|
70
71
|
[tool.hatch.build.targets.sdist]
|
|
@@ -73,6 +74,15 @@ build-backend = "hatchling.build"
|
|
|
73
74
|
# dev/, scripts/ and .githooks/ and expect a git checkout.
|
|
74
75
|
include = ["/src", "/LICENSE", "/README.md", "/pyproject.toml"]
|
|
75
76
|
|
|
77
|
+
# The version comes from the git tag (v0.1.0 -> 0.1.0); untagged commits get a
|
|
78
|
+
# dev version such as 0.1.1.dev3+gabc1234. Builds without git metadata (the
|
|
79
|
+
# Homebrew formula, which stages no .git) pass SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PCODE.
|
|
80
|
+
[tool.hatch.version]
|
|
81
|
+
source = "vcs"
|
|
82
|
+
# Names the package for setuptools-scm, which is what makes the scoped
|
|
83
|
+
# SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PCODE work.
|
|
84
|
+
raw-options = { dist_name = "pcode" }
|
|
85
|
+
|
|
76
86
|
[tool.hatch.metadata]
|
|
77
87
|
allow-direct-references = true
|
|
78
88
|
|
|
@@ -97,3 +107,8 @@ line-length = 100
|
|
|
97
107
|
|
|
98
108
|
[tool.ruff.lint]
|
|
99
109
|
select = ["E", "F", "I"]
|
|
110
|
+
|
|
111
|
+
[tool.uv]
|
|
112
|
+
# Rebuild the project when the commit or tags change, so `uv run` and the
|
|
113
|
+
# editable install report the current version rather than a cached one.
|
|
114
|
+
cache-keys = [{ file = "pyproject.toml" }, { git = { commit = true, tags = true } }]
|