pcode 0.1.1__tar.gz → 0.1.3__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.
Files changed (173) hide show
  1. {pcode-0.1.1 → pcode-0.1.3}/PKG-INFO +39 -31
  2. {pcode-0.1.1 → pcode-0.1.3}/README.md +29 -20
  3. {pcode-0.1.1 → pcode-0.1.3}/pyproject.toml +10 -10
  4. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/agent.py +7 -2
  5. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/anthropic_oauth.py +1 -1
  6. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/app.py +269 -67
  7. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/appearance.py +2 -2
  8. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/aside_ui.py +20 -28
  9. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/auth.py +1 -1
  10. pcode-0.1.3/src/pcode/background_delegation.py +318 -0
  11. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/browser.py +1 -1
  12. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/cache_diagnostics.py +3 -3
  13. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/cache_warnings.py +18 -25
  14. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/errors.py +2 -1
  15. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/resume.py +1 -1
  16. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/cli.py +5 -2
  17. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/clipboard.py +1 -1
  18. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/compaction.py +12 -7
  19. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/config.py +46 -10
  20. pcode-0.1.3/src/pcode/config_ui.py +357 -0
  21. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/controller.py +63 -11
  22. pcode-0.1.3/src/pcode/copy_ui.py +394 -0
  23. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/delegation.py +1 -1
  24. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/delta.py +1 -1
  25. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/diagnostics.py +15 -4
  26. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/edit_preview.py +1 -1
  27. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/listener.py +2 -2
  28. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/mailbox.py +2 -2
  29. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/parsing.py +1 -1
  30. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/ext.py +1 -1
  31. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/extension_guide.md +2 -0
  32. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/extensions/browser.py +1 -1
  33. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/extensions/ponytail.py +2 -2
  34. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/file_refs.py +2 -2
  35. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/host.py +39 -13
  36. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/host_protocol.py +2 -2
  37. pcode-0.1.3/src/pcode/input_keys.py +272 -0
  38. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/inspection.py +1 -1
  39. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/inspector_ui.py +1 -1
  40. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/job_notices.py +3 -1
  41. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/jobs.py +128 -22
  42. pcode-0.1.3/src/pcode/keyboard_protocol.py +104 -0
  43. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/keymap.py +46 -15
  44. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/live.py +53 -2
  45. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/llm_proxy.py +1 -1
  46. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/logins.py +5 -2
  47. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/mcp.py +3 -3
  48. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/mcp_notice.py +1 -1
  49. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/mcp_oauth.py +1 -1
  50. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/meridian.py +2 -2
  51. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/meridian_process.py +5 -5
  52. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/meridian_reminders.py +16 -3
  53. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/meridian_setup.py +6 -6
  54. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/model_metadata.py +2 -2
  55. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/models.py +11 -0
  56. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/plan_preview.py +1 -1
  57. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/planning.py +1 -1
  58. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/popup_ui.py +13 -0
  59. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/preferences.py +21 -9
  60. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/prefix_keys.py +37 -6
  61. pcode-0.1.3/src/pcode/proctitle.py +60 -0
  62. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/profiling.py +1 -1
  63. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/project_trust.py +1 -1
  64. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/prompt_keys.py +21 -4
  65. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/remote.py +82 -22
  66. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/replay_benchmark.py +1 -1
  67. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/repo_context.py +1 -1
  68. pcode-0.1.3/src/pcode/retries.py +36 -0
  69. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/sandbox.py +2 -1
  70. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/sessions.py +198 -10
  71. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/stall_log.py +97 -11
  72. pcode-0.1.3/src/pcode/steering.py +44 -0
  73. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/stream_display.py +2 -1
  74. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/stream_events.py +54 -2
  75. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/task_worktrees.py +1 -1
  76. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/terminal_notify.py +1 -1
  77. pcode-0.1.3/src/pcode/terminal_text.py +20 -0
  78. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/theme.py +1 -1
  79. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/thinking_markdown.py +3 -1
  80. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/tool_display.py +2 -2
  81. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/tool_panel.py +37 -5
  82. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/tree_ui.py +2 -1
  83. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/turn.py +2 -0
  84. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/ui.py +58 -70
  85. pcode-0.1.3/src/pcode/update_check.py +156 -0
  86. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/usage.py +2 -2
  87. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/worktree.py +1 -1
  88. pcode-0.1.1/src/pcode/copy_ui.py +0 -172
  89. pcode-0.1.1/src/pcode/input_keys.py +0 -35
  90. pcode-0.1.1/src/pcode/retries.py +0 -28
  91. pcode-0.1.1/src/pcode/steering.py +0 -27
  92. {pcode-0.1.1 → pcode-0.1.3}/.gitignore +0 -0
  93. {pcode-0.1.1 → pcode-0.1.3}/LICENSE +0 -0
  94. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/__init__.py +0 -0
  95. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/_job_supervisor.py +0 -0
  96. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/aside.py +0 -0
  97. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/aside_guard.py +0 -0
  98. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/block.py +0 -0
  99. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/cache_settings.py +0 -0
  100. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/__init__.py +0 -0
  101. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/cli.py +0 -0
  102. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/messages.py +0 -0
  103. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/model.py +0 -0
  104. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/session.py +0 -0
  105. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/session_pool.py +0 -0
  106. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/claude_sdk/workspace.py +0 -0
  107. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/code_mode.py +0 -0
  108. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/codex_login.py +0 -0
  109. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/command_transcript.py +0 -0
  110. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/commands.py +0 -0
  111. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/completion.py +0 -0
  112. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/context_breakdown.py +0 -0
  113. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/context_usage.py +0 -0
  114. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/conversation_ids.py +0 -0
  115. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/conversation_tree.py +0 -0
  116. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/edit_transcript.py +0 -0
  117. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/edit_ui.py +0 -0
  118. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/edits.py +0 -0
  119. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/__init__.py +0 -0
  120. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/cli.py +0 -0
  121. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/outbound.py +0 -0
  122. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/render.py +0 -0
  123. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/email_remote/state.py +0 -0
  124. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/error_report.py +0 -0
  125. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/extensions/sandbox.py +0 -0
  126. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/extensions/session_history.py +0 -0
  127. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/extensions/web_research.py +0 -0
  128. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/filesystem.py +0 -0
  129. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/frame.py +0 -0
  130. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/gateway.py +0 -0
  131. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/git_diff.py +0 -0
  132. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/history.py +0 -0
  133. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/history_cursor.py +0 -0
  134. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/history_embeddings.py +0 -0
  135. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/host_ui.py +0 -0
  136. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/isolated_delegation.py +0 -0
  137. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/jobs_ui.py +0 -0
  138. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/layout_speed.py +0 -0
  139. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/links.py +0 -0
  140. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/links_ui.py +0 -0
  141. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/model_ui.py +0 -0
  142. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/native_results.py +0 -0
  143. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/oauth_pages.py +0 -0
  144. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/output_limits.py +0 -0
  145. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/paste.py +0 -0
  146. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/path_completion.py +0 -0
  147. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/plan_sizes.py +0 -0
  148. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/profile_benchmark.py +0 -0
  149. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/remote_print.py +0 -0
  150. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/remote_profile.py +0 -0
  151. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/rpc.py +0 -0
  152. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/runtime.py +0 -0
  153. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/session_naming.py +0 -0
  154. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/session_ui.py +0 -0
  155. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/shell.py +0 -0
  156. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/shell_mode.py +0 -0
  157. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/shell_tools.py +0 -0
  158. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/skills.py +0 -0
  159. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/startup_input.py +0 -0
  160. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/strict_tools.py +0 -0
  161. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/syntax.py +0 -0
  162. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/syntax_colors.py +0 -0
  163. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/task_prompt.py +0 -0
  164. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/theme_gallery.py +0 -0
  165. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/token_accounting.py +0 -0
  166. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/tool_output_limits.py +0 -0
  167. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/transcript_log.py +0 -0
  168. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/transcript_notice.py +0 -0
  169. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/word_wrap.py +0 -0
  170. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/worker_ui.py +0 -0
  171. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/workers.py +0 -0
  172. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/workspace.py +0 -0
  173. {pcode-0.1.1 → pcode-0.1.3}/src/pcode/workspace_filesystem.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pcode
3
- Version: 0.1.1
3
+ Version: 0.1.3
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/
@@ -16,34 +16,38 @@ Classifier: Intended Audience :: Developers
16
16
  Classifier: Operating System :: MacOS
17
17
  Classifier: Operating System :: POSIX :: Linux
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.11
20
- Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Programming Language :: Python :: 3.15
22
21
  Classifier: Topic :: Software Development
23
- Requires-Python: >=3.11
24
- Requires-Dist: filelock<4,>=3.16
22
+ Requires-Python: >=3.14
23
+ Requires-Dist: filelock<5,>=4
25
24
  Requires-Dist: genai-prices<0.2,>=0.1.7
26
- Requires-Dist: httpx2<3,>=2.13
25
+ Requires-Dist: httpx2<3,>=2.13.1
27
26
  Requires-Dist: prompt-toolkit==3.0.53
28
27
  Requires-Dist: psutil<8,>=6
29
- Requires-Dist: pydantic-ai-harness[codemode,coder,exa,playwright]<0.53,>=0.52.0
30
- Requires-Dist: pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]<3,>=2.52.0
31
- Requires-Dist: rich<15,>=14
28
+ Requires-Dist: pydantic-ai-harness[codemode,coder,exa,playwright]<0.56,>=0.55.0
29
+ Requires-Dist: pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]<3,>=2.55.0
30
+ Requires-Dist: rich<16,>=15
32
31
  Requires-Dist: websockets<17,>=15.0.1
33
32
  Requires-Dist: yappi<2,>=1.7.6
34
33
  Provides-Extra: claude
35
- Requires-Dist: claude-agent-sdk<0.3,>=0.2.160; extra == 'claude'
34
+ Requires-Dist: claude-agent-sdk<0.3,>=0.2.164; extra == 'claude'
36
35
  Description-Content-Type: text/markdown
37
36
 
38
- <img width="1512" height="947" alt="Screenshot 2026-10-06 at 7 23 29 PM" src="https://github.com/user-attachments/assets/a648fede-d703-44ef-8b52-895d3a0cd2af" />
39
- <img width="1360" alt="pcode fixing a bug: a word-level diff of the edit, then a worker sub-agent reviewing it with its own plan nested under the task list" src="https://raw.githubusercontent.com/cruxwell/pcode/master/docs/assets/screenshots/readme.png" />
37
+ <img width="1392" height="1522" alt="pcode in a dark terminal" src="docs/assets/screenshots/tabs-dark.png" />
38
+
39
+ <img width="1392" height="1522" alt="pcode in a light terminal" src="docs/assets/screenshots/tabs-light.png" />
40
40
 
41
41
  # pcode
42
42
 
43
- pcode is a terminal-native coding agent built for long-running and parallel
44
- work. Background commands wake the agent when they finish, every session can
45
- use its own git worktree, conversations can be rewound and forked, and every
46
- tool call stays inspectable.
43
+ pcode is a terminal-native coding agent that lets you change what's visible in
44
+ your scrollback, even after the work is done. Expand commands, output, and diffs
45
+ when you need the details; hide them when you want to read the conversation.
46
+ The same history, with the detail you choose.
47
+
48
+ Long-running commands continue in the background and wake the agent when they
49
+ finish. Run sessions in separate git worktrees, or rewind and branch a
50
+ conversation to try another approach.
47
51
 
48
52
  - **Slow work doesn't block you.** Long commands become background jobs, and a
49
53
  finished job wakes the agent, so it can watch tests or CI and fix what fails.
@@ -51,8 +55,9 @@ tool call stays inspectable.
51
55
  on one repo at once.
52
56
  - **Rewind and fork.** `/tree` returns to any point in a conversation and
53
57
  branches from there. Every session is kept, so you can resume or search it.
54
- - **Nothing hidden.** `/tools` shows every command the agent ran and its full
55
- output, and scrollback re-renders to show or fold every command and diff.
58
+ - **Change your view, not your history.** Show or hide commands, output, and
59
+ diffs throughout the conversation. Hidden output stays available, and `/tools`
60
+ lets you inspect every tool call and its full output.
56
61
 
57
62
  It runs on any model [Pydantic AI](https://ai.pydantic.dev/) supports, or on
58
63
  your Claude or ChatGPT subscription.
@@ -71,7 +76,7 @@ brew install cruxwell/pcode/pcode
71
76
  Or from [PyPI](https://pypi.org/project/pcode/) with [uv](https://docs.astral.sh/uv/):
72
77
 
73
78
  ```sh
74
- uv tool install 'pcode[claude]'
79
+ uv tool install --python 3.14 'pcode[claude]'
75
80
  ```
76
81
 
77
82
  `brew install --HEAD` tracks `master` instead of the latest release.
@@ -79,23 +84,24 @@ uv tool install 'pcode[claude]'
79
84
  ## Quick start
80
85
 
81
86
  ```sh
82
- codex login # or /login [claude|openai-codex] inside pcode, or export a provider API key
83
- pcode -m openai-codex:gpt-5.6-luna # interactive; /model (Ctrl+L) saves a default
84
- pcode # reuses the saved model, or opens the offline preview
87
+ pcode -m claude:claude-sonnet-5 # Claude subscription; run /login claude if not signed in
88
+ pcode -m openai-codex:gpt-5.6-luna # ChatGPT subscription (/login openai-codex)
89
+ pcode -m anthropic:claude-sonnet-5 # or any provider, with its API key set
90
+ pcode # reuses the model /model (Ctrl+L) saved; with none, an offline preview
85
91
  pcode -C /path/to/repo "Summarize the open TODOs"
86
92
  git diff | pcode -p --no-save # non-interactive: reply to stdout
87
93
  pcode --continue # resume this directory's newest session
88
94
  pcode --theme-preview # offline sample output and the style gallery
89
95
  ```
90
96
 
91
- **Live mode edits files and runs shell commands with your permissions and no
97
+ **The agent edits files and runs shell commands with your permissions and no
92
98
  approval prompt.** Read [tool permissions](https://cruxwell.github.io/pcode/tools/#tool-permissions)
93
99
  before pointing it at anything you care about.
94
100
 
95
101
  ## More
96
102
 
97
103
  - **Your subscription:** Claude runs through Anthropic's own Agent SDK and
98
- Claude Code login, the way Anthropic supports, and ChatGPT through a Codex
104
+ Claude Code login (the route Anthropic supports), and ChatGPT through a Codex
99
105
  login. See [providers](https://cruxwell.github.io/pcode/providers/).
100
106
  - [Email remote control](https://cruxwell.github.io/pcode/email/): send a task
101
107
  from Gmail on your phone, reply to keep going, and take the session over at a
@@ -105,10 +111,10 @@ before pointing it at anything you care about.
105
111
  `jj` to leave insert mode.
106
112
  - `/btw` side questions, background sessions, recall of past sessions, a
107
113
  browser the agent can drive, and Python extensions.
108
- - Pydantic AI's Harness coder capabilities, with the rest of a finished agent
109
- on top: MCP with OAuth and tool search, searchable sessions, jobs,
110
- worktrees. Extensions are plain Pydantic AI capabilities. The conversation
111
- tree follows [pi](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/tree.md)'s.
114
+ - Built on Pydantic AI's Harness coder, with MCP (OAuth and tool search),
115
+ searchable sessions, jobs and worktrees on top. Extensions are plain
116
+ Pydantic AI capabilities. The conversation tree follows
117
+ [pi](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/tree.md)'s.
112
118
 
113
119
  See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the longer-term direction.
114
120
 
@@ -116,21 +122,23 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
116
122
 
117
123
  | Page | What it covers |
118
124
  | --- | --- |
119
- | [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew and source installs, `-C`, `--print`, shell completion |
125
+ | [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew, uv and source installs, signing in, `--print`, shell completion |
120
126
  | [Scrollback and transparency](https://cruxwell.github.io/pcode/guide/scrollback/) | Guide: what goes into scrollback, `/tools`, `/diffs` |
121
127
  | [A shell for long-running work](https://cruxwell.github.io/pcode/guide/shell/) | Guide: background jobs, watching CI |
122
128
  | [Parallel agents](https://cruxwell.github.io/pcode/guide/parallel/) | Guide: worktrees, parallel sub-agents, `/agents` |
123
129
  | [Extending pcode](https://cruxwell.github.io/pcode/guide/extending/) | Guide: extensions, skills, settings |
124
- | [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, Meridian, proxies |
130
+ | [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, proxies |
125
131
  | [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
126
132
  | [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 |
127
133
  | [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` |
134
+ | [Terminal setup](https://cruxwell.github.io/pcode/terminal/) | Tab titles, the progress bar, iTerm2 and tmux settings |
128
135
  | [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
129
136
  | [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
130
137
  | [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
131
138
  | [Sessions and recovery](https://cruxwell.github.io/pcode/sessions/) | Saving, resuming, recalling earlier sessions, checkpoints, retries |
132
139
  | [Context, limits and caching](https://cruxwell.github.io/pcode/context/) | Prompt overhead, compaction, output limits, prompt cache notices |
133
140
  | [The transcript](https://cruxwell.github.io/pcode/transcript/) | What lands in scrollback: diffs, thinking, errors, command output, `/redraw` |
141
+ | [Email remote control](https://cruxwell.github.io/pcode/email/) | Driving a session from Gmail, the remote profile |
134
142
  | [Conversation tree](https://cruxwell.github.io/pcode/conversation-tree/) | `/tree`: rewinding and forking a conversation |
135
143
  | [Side questions](https://cruxwell.github.io/pcode/side-questions/) | `/btw`: asking about the running turn without interrupting it |
136
144
 
@@ -1,12 +1,17 @@
1
- <img width="1512" height="947" alt="Screenshot 2026-10-06 at 7 23 29 PM" src="https://github.com/user-attachments/assets/a648fede-d703-44ef-8b52-895d3a0cd2af" />
2
- <img width="1360" alt="pcode fixing a bug: a word-level diff of the edit, then a worker sub-agent reviewing it with its own plan nested under the task list" src="https://raw.githubusercontent.com/cruxwell/pcode/master/docs/assets/screenshots/readme.png" />
1
+ <img width="1392" height="1522" alt="pcode in a dark terminal" src="docs/assets/screenshots/tabs-dark.png" />
2
+
3
+ <img width="1392" height="1522" alt="pcode in a light terminal" src="docs/assets/screenshots/tabs-light.png" />
3
4
 
4
5
  # pcode
5
6
 
6
- pcode is a terminal-native coding agent built for long-running and parallel
7
- work. Background commands wake the agent when they finish, every session can
8
- use its own git worktree, conversations can be rewound and forked, and every
9
- tool call stays inspectable.
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
- - **Nothing hidden.** `/tools` shows every command the agent ran and its full
18
- output, and scrollback re-renders to show or fold every command and diff.
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.
@@ -34,7 +40,7 @@ brew install cruxwell/pcode/pcode
34
40
  Or from [PyPI](https://pypi.org/project/pcode/) with [uv](https://docs.astral.sh/uv/):
35
41
 
36
42
  ```sh
37
- uv tool install 'pcode[claude]'
43
+ uv tool install --python 3.14 'pcode[claude]'
38
44
  ```
39
45
 
40
46
  `brew install --HEAD` tracks `master` instead of the latest release.
@@ -42,23 +48,24 @@ uv tool install 'pcode[claude]'
42
48
  ## Quick start
43
49
 
44
50
  ```sh
45
- codex login # or /login [claude|openai-codex] inside pcode, or export a provider API key
46
- pcode -m openai-codex:gpt-5.6-luna # interactive; /model (Ctrl+L) saves a default
47
- pcode # reuses the saved model, or opens the offline preview
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
48
55
  pcode -C /path/to/repo "Summarize the open TODOs"
49
56
  git diff | pcode -p --no-save # non-interactive: reply to stdout
50
57
  pcode --continue # resume this directory's newest session
51
58
  pcode --theme-preview # offline sample output and the style gallery
52
59
  ```
53
60
 
54
- **Live mode edits files and runs shell commands with your permissions and no
61
+ **The agent edits files and runs shell commands with your permissions and no
55
62
  approval prompt.** Read [tool permissions](https://cruxwell.github.io/pcode/tools/#tool-permissions)
56
63
  before pointing it at anything you care about.
57
64
 
58
65
  ## More
59
66
 
60
67
  - **Your subscription:** Claude runs through Anthropic's own Agent SDK and
61
- Claude Code login, the way Anthropic supports, and ChatGPT through a Codex
68
+ Claude Code login (the route Anthropic supports), and ChatGPT through a Codex
62
69
  login. See [providers](https://cruxwell.github.io/pcode/providers/).
63
70
  - [Email remote control](https://cruxwell.github.io/pcode/email/): send a task
64
71
  from Gmail on your phone, reply to keep going, and take the session over at a
@@ -68,10 +75,10 @@ before pointing it at anything you care about.
68
75
  `jj` to leave insert mode.
69
76
  - `/btw` side questions, background sessions, recall of past sessions, a
70
77
  browser the agent can drive, and Python extensions.
71
- - Pydantic AI's Harness coder capabilities, with the rest of a finished agent
72
- on top: MCP with OAuth and tool search, searchable sessions, jobs,
73
- worktrees. Extensions are plain Pydantic AI capabilities. The conversation
74
- tree follows [pi](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/tree.md)'s.
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.
75
82
 
76
83
  See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the longer-term direction.
77
84
 
@@ -79,21 +86,23 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
79
86
 
80
87
  | Page | What it covers |
81
88
  | --- | --- |
82
- | [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew and source installs, `-C`, `--print`, shell completion |
89
+ | [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew, uv and source installs, signing in, `--print`, shell completion |
83
90
  | [Scrollback and transparency](https://cruxwell.github.io/pcode/guide/scrollback/) | Guide: what goes into scrollback, `/tools`, `/diffs` |
84
91
  | [A shell for long-running work](https://cruxwell.github.io/pcode/guide/shell/) | Guide: background jobs, watching CI |
85
92
  | [Parallel agents](https://cruxwell.github.io/pcode/guide/parallel/) | Guide: worktrees, parallel sub-agents, `/agents` |
86
93
  | [Extending pcode](https://cruxwell.github.io/pcode/guide/extending/) | Guide: extensions, skills, settings |
87
- | [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, Meridian, proxies |
94
+ | [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, proxies |
88
95
  | [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
89
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 |
90
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 |
91
99
  | [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
92
100
  | [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
93
101
  | [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
94
102
  | [Sessions and recovery](https://cruxwell.github.io/pcode/sessions/) | Saving, resuming, recalling earlier sessions, checkpoints, retries |
95
103
  | [Context, limits and caching](https://cruxwell.github.io/pcode/context/) | Prompt overhead, compaction, output limits, prompt cache notices |
96
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 |
97
106
  | [Conversation tree](https://cruxwell.github.io/pcode/conversation-tree/) | `/tree`: rewinding and forking a conversation |
98
107
  | [Side questions](https://cruxwell.github.io/pcode/side-questions/) | `/btw`: asking about the running turn without interrupting it |
99
108
 
@@ -14,16 +14,15 @@ classifiers = [
14
14
  "Operating System :: MacOS",
15
15
  "Operating System :: POSIX :: Linux",
16
16
  "Programming Language :: Python :: 3",
17
- "Programming Language :: Python :: 3.11",
18
- "Programming Language :: Python :: 3.12",
19
- "Programming Language :: Python :: 3.13",
17
+ "Programming Language :: Python :: 3.14",
18
+ "Programming Language :: Python :: 3.15",
20
19
  "Topic :: Software Development",
21
20
  ]
22
- requires-python = ">=3.11"
21
+ requires-python = ">=3.14"
23
22
  dependencies = [
24
- "filelock>=3.16,<4",
23
+ "filelock>=4,<5",
25
24
  "genai-prices>=0.1.7,<0.2",
26
- "httpx2>=2.13,<3",
25
+ "httpx2>=2.13.1,<3",
27
26
  # Exact: pcode relies on prompt_toolkit internals, and point releases
28
27
  # change them. Bump on purpose after tests/test_prompt_toolkit_internals.py
29
28
  # and make test-all pass on the new version.
@@ -34,13 +33,14 @@ dependencies = [
34
33
  # itself is downloaded on first use, not at install.
35
34
  # Harness ships from the pydantic-ai repo with every Pydantic AI release and
36
35
  # pins pydantic-ai-slim to the same minor; bump both together.
37
- "pydantic-ai-harness[exa,coder,codemode,playwright]>=0.52.0,<0.53",
36
+ "pydantic-ai-harness[exa,coder,codemode,playwright]>=0.55.0,<0.56",
38
37
  # duckduckgo and web-fetch back the bundled web_research extension when no
39
38
  # provider-native search or Exa key is available.
40
39
  # 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.52.0,<3",
42
- "rich>=14,<15",
40
+ "pydantic-ai-slim[anthropic,bedrock,duckduckgo,google,groq,mcp,openai,web-fetch,xai]>=2.55.0,<3",
41
+ "rich>=15,<16",
43
42
  # FastMCP 4.x OAuth callback server selects Uvicorn's websockets-sansio protocol.
43
+ # Capped below 17 by google-genai (still <17 as of 2.29), not by pcode.
44
44
  "websockets>=15.0.1,<17",
45
45
  ]
46
46
 
@@ -49,7 +49,7 @@ dependencies = [
49
49
  # (about 95 MB to download, 215 MB installed); the sdist would run whatever
50
50
  # `claude` is on PATH instead of the CLI version pcode was verified against.
51
51
  claude = [
52
- "claude-agent-sdk>=0.2.160,<0.3",
52
+ "claude-agent-sdk>=0.2.164,<0.3",
53
53
  ]
54
54
 
55
55
  [project.urls]
@@ -32,6 +32,7 @@ from pydantic_ai_harness.subagents import ModelOption, SubAgent
32
32
  from pydantic_ai_harness.tool_output_limits import ToolOutputLimits
33
33
 
34
34
  from pcode import remote_profile
35
+ from pcode.background_delegation import BackgroundDelegation
35
36
  from pcode.cache_settings import ProviderCacheSettings, model_settings
36
37
  from pcode.cache_warnings import CacheBustReporting
37
38
  from pcode.claude_sdk import ClaudeWorkspace
@@ -359,8 +360,10 @@ def create_coder(
359
360
  """
360
361
  workspace = workspace.resolve()
361
362
  _ensure_bundled_rg()
362
- # Delegation is pcode's own `WorkspaceSubAgents`, added below.
363
- coder = Coder(sub_agents=False)
363
+ # Delegation is pcode's own `WorkspaceSubAgents`, added below. Caching is
364
+ # `ProviderCacheSettings`' per-provider choice: Coder's default `cache=True`
365
+ # would also reach Meridian and OpenAI's explicit-breakpoint models.
366
+ coder = Coder(sub_agents=False, caching=False)
364
367
  output_limits = create_tool_output_limits()
365
368
  # Keep Coder's tool selection, including its persistent shell (as a
366
369
  # `JobShell`). File display and repository discovery remain local adapters;
@@ -402,6 +405,8 @@ def create_coder(
402
405
  capabilities.append(
403
406
  _delegation(workspace, worker, subagents, extensions, output_limits, cache_notices)
404
407
  )
408
+ # Steering mid-delegation reaches the parent; the child keeps working.
409
+ capabilities.append(BackgroundDelegation())
405
410
  # Summarize evidence before discarding it; pcode owns compaction.
406
411
  return CombinedCapability([c for c in capabilities if not isinstance(c, ClearToolResults)])
407
412
 
@@ -403,7 +403,7 @@ async def _receive_code(port: int, state: str, timeout: float) -> str:
403
403
  + body
404
404
  )
405
405
  await writer.drain()
406
- except (OSError, asyncio.TimeoutError, UnicodeError):
406
+ except OSError, asyncio.TimeoutError, UnicodeError:
407
407
  code = ""
408
408
  finally:
409
409
  writer.close()