pcode 0.1.1__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.
Files changed (166) hide show
  1. {pcode-0.1.1 → pcode-0.1.2}/PKG-INFO +35 -26
  2. {pcode-0.1.1 → pcode-0.1.2}/README.md +28 -19
  3. {pcode-0.1.1 → pcode-0.1.2}/pyproject.toml +7 -6
  4. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/app.py +214 -29
  5. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/aside_ui.py +2 -1
  6. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/cli.py +3 -0
  7. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/compaction.py +12 -7
  8. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/config.py +19 -7
  9. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/controller.py +53 -8
  10. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/listener.py +2 -2
  11. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/extension_guide.md +2 -0
  12. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/host.py +37 -12
  13. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/job_notices.py +3 -1
  14. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/jobs.py +124 -18
  15. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/logins.py +5 -2
  16. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/mcp_notice.py +1 -1
  17. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/meridian_reminders.py +16 -3
  18. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/models.py +11 -0
  19. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/planning.py +1 -1
  20. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/popup_ui.py +13 -0
  21. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/preferences.py +11 -4
  22. pcode-0.1.2/src/pcode/proctitle.py +60 -0
  23. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/remote.py +78 -18
  24. pcode-0.1.2/src/pcode/retries.py +36 -0
  25. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/sandbox.py +2 -1
  26. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/sessions.py +196 -8
  27. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/stall_log.py +49 -11
  28. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/steering.py +14 -2
  29. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/stream_display.py +2 -1
  30. pcode-0.1.2/src/pcode/terminal_text.py +20 -0
  31. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/thinking_markdown.py +3 -1
  32. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/tool_panel.py +37 -5
  33. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/tree_ui.py +2 -1
  34. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/ui.py +8 -27
  35. pcode-0.1.1/src/pcode/retries.py +0 -28
  36. {pcode-0.1.1 → pcode-0.1.2}/.gitignore +0 -0
  37. {pcode-0.1.1 → pcode-0.1.2}/LICENSE +0 -0
  38. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/__init__.py +0 -0
  39. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/_job_supervisor.py +0 -0
  40. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/agent.py +0 -0
  41. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/anthropic_oauth.py +0 -0
  42. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/appearance.py +0 -0
  43. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/aside.py +0 -0
  44. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/aside_guard.py +0 -0
  45. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/auth.py +0 -0
  46. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/block.py +0 -0
  47. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/browser.py +0 -0
  48. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/cache_diagnostics.py +0 -0
  49. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/cache_settings.py +0 -0
  50. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/cache_warnings.py +0 -0
  51. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/__init__.py +0 -0
  52. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/cli.py +0 -0
  53. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/errors.py +0 -0
  54. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/messages.py +0 -0
  55. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/model.py +0 -0
  56. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/resume.py +0 -0
  57. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/session.py +0 -0
  58. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/session_pool.py +0 -0
  59. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/claude_sdk/workspace.py +0 -0
  60. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/clipboard.py +0 -0
  61. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/code_mode.py +0 -0
  62. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/codex_login.py +0 -0
  63. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/command_transcript.py +0 -0
  64. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/commands.py +0 -0
  65. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/completion.py +0 -0
  66. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/context_breakdown.py +0 -0
  67. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/context_usage.py +0 -0
  68. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/conversation_ids.py +0 -0
  69. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/conversation_tree.py +0 -0
  70. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/copy_ui.py +0 -0
  71. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/delegation.py +0 -0
  72. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/delta.py +0 -0
  73. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/diagnostics.py +0 -0
  74. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/edit_preview.py +0 -0
  75. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/edit_transcript.py +0 -0
  76. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/edit_ui.py +0 -0
  77. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/edits.py +0 -0
  78. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/__init__.py +0 -0
  79. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/cli.py +0 -0
  80. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/mailbox.py +0 -0
  81. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/outbound.py +0 -0
  82. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/parsing.py +0 -0
  83. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/render.py +0 -0
  84. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/email_remote/state.py +0 -0
  85. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/error_report.py +0 -0
  86. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/ext.py +0 -0
  87. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/extensions/browser.py +0 -0
  88. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/extensions/ponytail.py +0 -0
  89. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/extensions/sandbox.py +0 -0
  90. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/extensions/session_history.py +0 -0
  91. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/extensions/web_research.py +0 -0
  92. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/file_refs.py +0 -0
  93. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/filesystem.py +0 -0
  94. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/frame.py +0 -0
  95. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/gateway.py +0 -0
  96. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/git_diff.py +0 -0
  97. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/history.py +0 -0
  98. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/history_cursor.py +0 -0
  99. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/history_embeddings.py +0 -0
  100. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/host_protocol.py +0 -0
  101. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/host_ui.py +0 -0
  102. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/input_keys.py +0 -0
  103. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/inspection.py +0 -0
  104. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/inspector_ui.py +0 -0
  105. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/isolated_delegation.py +0 -0
  106. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/jobs_ui.py +0 -0
  107. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/keymap.py +0 -0
  108. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/layout_speed.py +0 -0
  109. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/links.py +0 -0
  110. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/links_ui.py +0 -0
  111. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/live.py +0 -0
  112. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/llm_proxy.py +0 -0
  113. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/mcp.py +0 -0
  114. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/mcp_oauth.py +0 -0
  115. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/meridian.py +0 -0
  116. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/meridian_process.py +0 -0
  117. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/meridian_setup.py +0 -0
  118. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/model_metadata.py +0 -0
  119. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/model_ui.py +0 -0
  120. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/native_results.py +0 -0
  121. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/oauth_pages.py +0 -0
  122. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/output_limits.py +0 -0
  123. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/paste.py +0 -0
  124. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/path_completion.py +0 -0
  125. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/plan_preview.py +0 -0
  126. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/plan_sizes.py +0 -0
  127. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/prefix_keys.py +0 -0
  128. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/profile_benchmark.py +0 -0
  129. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/profiling.py +0 -0
  130. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/project_trust.py +0 -0
  131. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/prompt_keys.py +0 -0
  132. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/remote_print.py +0 -0
  133. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/remote_profile.py +0 -0
  134. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/replay_benchmark.py +0 -0
  135. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/repo_context.py +0 -0
  136. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/rpc.py +0 -0
  137. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/runtime.py +0 -0
  138. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/session_naming.py +0 -0
  139. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/session_ui.py +0 -0
  140. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/shell.py +0 -0
  141. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/shell_mode.py +0 -0
  142. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/shell_tools.py +0 -0
  143. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/skills.py +0 -0
  144. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/startup_input.py +0 -0
  145. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/stream_events.py +0 -0
  146. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/strict_tools.py +0 -0
  147. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/syntax.py +0 -0
  148. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/syntax_colors.py +0 -0
  149. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/task_prompt.py +0 -0
  150. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/task_worktrees.py +0 -0
  151. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/terminal_notify.py +0 -0
  152. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/theme.py +0 -0
  153. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/theme_gallery.py +0 -0
  154. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/token_accounting.py +0 -0
  155. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/tool_display.py +0 -0
  156. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/tool_output_limits.py +0 -0
  157. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/transcript_log.py +0 -0
  158. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/transcript_notice.py +0 -0
  159. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/turn.py +0 -0
  160. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/usage.py +0 -0
  161. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/word_wrap.py +0 -0
  162. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/worker_ui.py +0 -0
  163. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/workers.py +0 -0
  164. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/workspace.py +0 -0
  165. {pcode-0.1.1 → pcode-0.1.2}/src/pcode/workspace_filesystem.py +0 -0
  166. {pcode-0.1.1 → 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.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,>=3.16
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.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
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.160; extra == 'claude'
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="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" />
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 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.
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
- - **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.
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.
@@ -79,23 +85,24 @@ uv tool install 'pcode[claude]'
79
85
  ## Quick start
80
86
 
81
87
  ```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
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
85
92
  pcode -C /path/to/repo "Summarize the open TODOs"
86
93
  git diff | pcode -p --no-save # non-interactive: reply to stdout
87
94
  pcode --continue # resume this directory's newest session
88
95
  pcode --theme-preview # offline sample output and the style gallery
89
96
  ```
90
97
 
91
- **Live mode edits files and runs shell commands with your permissions and no
98
+ **The agent edits files and runs shell commands with your permissions and no
92
99
  approval prompt.** Read [tool permissions](https://cruxwell.github.io/pcode/tools/#tool-permissions)
93
100
  before pointing it at anything you care about.
94
101
 
95
102
  ## More
96
103
 
97
104
  - **Your subscription:** Claude runs through Anthropic's own Agent SDK and
98
- Claude Code login, the way Anthropic supports, and ChatGPT through a Codex
105
+ Claude Code login (the route Anthropic supports), and ChatGPT through a Codex
99
106
  login. See [providers](https://cruxwell.github.io/pcode/providers/).
100
107
  - [Email remote control](https://cruxwell.github.io/pcode/email/): send a task
101
108
  from Gmail on your phone, reply to keep going, and take the session over at a
@@ -105,10 +112,10 @@ before pointing it at anything you care about.
105
112
  `jj` to leave insert mode.
106
113
  - `/btw` side questions, background sessions, recall of past sessions, a
107
114
  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.
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.
112
119
 
113
120
  See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the longer-term direction.
114
121
 
@@ -116,21 +123,23 @@ See [PLAN.md](https://github.com/cruxwell/pcode/blob/master/PLAN.md) for the lon
116
123
 
117
124
  | Page | What it covers |
118
125
  | --- | --- |
119
- | [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew and source installs, `-C`, `--print`, shell completion |
126
+ | [Getting started](https://cruxwell.github.io/pcode/getting-started/) | Homebrew, uv and source installs, signing in, `--print`, shell completion |
120
127
  | [Scrollback and transparency](https://cruxwell.github.io/pcode/guide/scrollback/) | Guide: what goes into scrollback, `/tools`, `/diffs` |
121
128
  | [A shell for long-running work](https://cruxwell.github.io/pcode/guide/shell/) | Guide: background jobs, watching CI |
122
129
  | [Parallel agents](https://cruxwell.github.io/pcode/guide/parallel/) | Guide: worktrees, parallel sub-agents, `/agents` |
123
130
  | [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 |
131
+ | [Providers and models](https://cruxwell.github.io/pcode/providers/) | Authentication, supported providers, the model picker, reasoning effort, Claude Code, proxies |
125
132
  | [Configuration](https://cruxwell.github.io/pcode/configuration/) | `pcode config`, per-repository overrides, trusting repository code, the settings table, syntax styles |
126
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 |
127
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 |
128
136
  | [Tools](https://cruxwell.github.io/pcode/tools/) | Tool permissions, web search, the browser, code mode |
129
137
  | [MCP servers](https://cruxwell.github.io/pcode/mcp/) | Opt-in MCP configuration, OAuth sign-in, deferred tool search |
130
138
  | [Working in a repository](https://cruxwell.github.io/pcode/workspace/) | `AGENTS.md`/`CLAUDE.md`, skills as slash commands, one worktree per session |
131
139
  | [Sessions and recovery](https://cruxwell.github.io/pcode/sessions/) | Saving, resuming, recalling earlier sessions, checkpoints, retries |
132
140
  | [Context, limits and caching](https://cruxwell.github.io/pcode/context/) | Prompt overhead, compaction, output limits, prompt cache notices |
133
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 |
134
143
  | [Conversation tree](https://cruxwell.github.io/pcode/conversation-tree/) | `/tree`: rewinding and forking a conversation |
135
144
  | [Side questions](https://cruxwell.github.io/pcode/side-questions/) | `/btw`: asking about the running turn without interrupting it |
136
145
 
@@ -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/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 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.
@@ -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
 
@@ -21,9 +21,9 @@ classifiers = [
21
21
  ]
22
22
  requires-python = ">=3.11"
23
23
  dependencies = [
24
- "filelock>=3.16,<4",
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.52.0,<0.53",
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.52.0,<3",
42
- "rich>=14,<15",
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.160,<0.3",
53
+ "claude-agent-sdk>=0.2.164,<0.3",
53
54
  ]
54
55
 
55
56
  [project.urls]