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.
Files changed (166) hide show
  1. {pcode-0.1.0 → pcode-0.1.2}/PKG-INFO +44 -27
  2. {pcode-0.1.0 → pcode-0.1.2}/README.md +37 -20
  3. {pcode-0.1.0 → pcode-0.1.2}/pyproject.toml +23 -8
  4. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/app.py +214 -29
  5. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/aside_ui.py +2 -1
  6. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cli.py +3 -0
  7. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/compaction.py +12 -7
  8. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/config.py +19 -7
  9. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/controller.py +53 -8
  10. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/listener.py +2 -2
  11. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extension_guide.md +2 -0
  12. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/host.py +37 -12
  13. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/job_notices.py +3 -1
  14. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/jobs.py +124 -18
  15. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/logins.py +5 -2
  16. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/mcp_notice.py +1 -1
  17. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian_reminders.py +16 -3
  18. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/models.py +11 -0
  19. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/planning.py +1 -1
  20. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/popup_ui.py +13 -0
  21. {pcode-0.1.0 → 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.0 → 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.0 → pcode-0.1.2}/src/pcode/sandbox.py +2 -1
  26. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/sessions.py +196 -8
  27. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/stall_log.py +49 -11
  28. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/steering.py +14 -2
  29. {pcode-0.1.0 → 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.0 → pcode-0.1.2}/src/pcode/thinking_markdown.py +3 -1
  32. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tool_panel.py +37 -5
  33. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tree_ui.py +2 -1
  34. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/ui.py +8 -27
  35. pcode-0.1.0/src/pcode/retries.py +0 -28
  36. {pcode-0.1.0 → pcode-0.1.2}/.gitignore +0 -0
  37. {pcode-0.1.0 → pcode-0.1.2}/LICENSE +0 -0
  38. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/__init__.py +0 -0
  39. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/_job_supervisor.py +0 -0
  40. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/agent.py +0 -0
  41. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/anthropic_oauth.py +0 -0
  42. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/appearance.py +0 -0
  43. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/aside.py +0 -0
  44. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/aside_guard.py +0 -0
  45. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/auth.py +0 -0
  46. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/block.py +0 -0
  47. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/browser.py +0 -0
  48. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cache_diagnostics.py +0 -0
  49. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cache_settings.py +0 -0
  50. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/cache_warnings.py +0 -0
  51. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/__init__.py +0 -0
  52. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/cli.py +0 -0
  53. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/errors.py +0 -0
  54. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/messages.py +0 -0
  55. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/model.py +0 -0
  56. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/resume.py +0 -0
  57. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/session.py +0 -0
  58. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/session_pool.py +0 -0
  59. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/claude_sdk/workspace.py +0 -0
  60. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/clipboard.py +0 -0
  61. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/code_mode.py +0 -0
  62. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/codex_login.py +0 -0
  63. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/command_transcript.py +0 -0
  64. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/commands.py +0 -0
  65. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/completion.py +0 -0
  66. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/context_breakdown.py +0 -0
  67. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/context_usage.py +0 -0
  68. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/conversation_ids.py +0 -0
  69. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/conversation_tree.py +0 -0
  70. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/copy_ui.py +0 -0
  71. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/delegation.py +0 -0
  72. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/delta.py +0 -0
  73. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/diagnostics.py +0 -0
  74. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edit_preview.py +0 -0
  75. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edit_transcript.py +0 -0
  76. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edit_ui.py +0 -0
  77. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/edits.py +0 -0
  78. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/__init__.py +0 -0
  79. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/cli.py +0 -0
  80. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/mailbox.py +0 -0
  81. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/outbound.py +0 -0
  82. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/parsing.py +0 -0
  83. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/render.py +0 -0
  84. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/email_remote/state.py +0 -0
  85. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/error_report.py +0 -0
  86. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/ext.py +0 -0
  87. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/browser.py +0 -0
  88. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/ponytail.py +0 -0
  89. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/sandbox.py +0 -0
  90. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/session_history.py +0 -0
  91. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/extensions/web_research.py +0 -0
  92. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/file_refs.py +0 -0
  93. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/filesystem.py +0 -0
  94. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/frame.py +0 -0
  95. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/gateway.py +0 -0
  96. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/git_diff.py +0 -0
  97. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/history.py +0 -0
  98. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/history_cursor.py +0 -0
  99. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/history_embeddings.py +0 -0
  100. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/host_protocol.py +0 -0
  101. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/host_ui.py +0 -0
  102. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/input_keys.py +0 -0
  103. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/inspection.py +0 -0
  104. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/inspector_ui.py +0 -0
  105. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/isolated_delegation.py +0 -0
  106. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/jobs_ui.py +0 -0
  107. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/keymap.py +0 -0
  108. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/layout_speed.py +0 -0
  109. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/links.py +0 -0
  110. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/links_ui.py +0 -0
  111. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/live.py +0 -0
  112. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/llm_proxy.py +0 -0
  113. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/mcp.py +0 -0
  114. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/mcp_oauth.py +0 -0
  115. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian.py +0 -0
  116. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian_process.py +0 -0
  117. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/meridian_setup.py +0 -0
  118. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/model_metadata.py +0 -0
  119. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/model_ui.py +0 -0
  120. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/native_results.py +0 -0
  121. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/oauth_pages.py +0 -0
  122. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/output_limits.py +0 -0
  123. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/paste.py +0 -0
  124. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/path_completion.py +0 -0
  125. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/plan_preview.py +0 -0
  126. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/plan_sizes.py +0 -0
  127. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/prefix_keys.py +0 -0
  128. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/profile_benchmark.py +0 -0
  129. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/profiling.py +0 -0
  130. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/project_trust.py +0 -0
  131. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/prompt_keys.py +0 -0
  132. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/remote_print.py +0 -0
  133. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/remote_profile.py +0 -0
  134. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/replay_benchmark.py +0 -0
  135. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/repo_context.py +0 -0
  136. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/rpc.py +0 -0
  137. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/runtime.py +0 -0
  138. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/session_naming.py +0 -0
  139. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/session_ui.py +0 -0
  140. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/shell.py +0 -0
  141. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/shell_mode.py +0 -0
  142. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/shell_tools.py +0 -0
  143. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/skills.py +0 -0
  144. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/startup_input.py +0 -0
  145. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/stream_events.py +0 -0
  146. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/strict_tools.py +0 -0
  147. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/syntax.py +0 -0
  148. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/syntax_colors.py +0 -0
  149. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/task_prompt.py +0 -0
  150. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/task_worktrees.py +0 -0
  151. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/terminal_notify.py +0 -0
  152. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/theme.py +0 -0
  153. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/theme_gallery.py +0 -0
  154. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/token_accounting.py +0 -0
  155. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tool_display.py +0 -0
  156. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/tool_output_limits.py +0 -0
  157. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/transcript_log.py +0 -0
  158. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/transcript_notice.py +0 -0
  159. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/turn.py +0 -0
  160. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/usage.py +0 -0
  161. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/word_wrap.py +0 -0
  162. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/worker_ui.py +0 -0
  163. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/workers.py +0 -0
  164. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/workspace.py +0 -0
  165. {pcode-0.1.0 → pcode-0.1.2}/src/pcode/workspace_filesystem.py +0 -0
  166. {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.0
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.
@@ -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 --HEAD cruxwell/pcode/pcode
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
- codex login # or /login [claude|openai-codex] inside pcode, or export a provider API key
75
- pcode -m openai-codex:gpt-5.6-luna # interactive; /model (Ctrl+L) saves a default
76
- 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
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
- **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
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, the way Anthropic supports, and ChatGPT through a Codex
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 capabilities, with the rest of a finished agent
101
- on top: MCP with OAuth and tool search, searchable sessions, jobs,
102
- worktrees. Extensions are plain Pydantic AI capabilities. The conversation
103
- 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.
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, `-C`, `--print`, shell completion |
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, Meridian, proxies |
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="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.
@@ -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 --HEAD cruxwell/pcode/pcode
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
- codex login # or /login [claude|openai-codex] inside pcode, or export a provider API key
38
- pcode -m openai-codex:gpt-5.6-luna # interactive; /model (Ctrl+L) saves a default
39
- 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
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
- **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
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, the way Anthropic supports, and ChatGPT through a Codex
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 capabilities, with the rest of a finished agent
64
- on top: MCP with OAuth and tool search, searchable sessions, jobs,
65
- worktrees. Extensions are plain Pydantic AI capabilities. The conversation
66
- 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.
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, `-C`, `--print`, shell completion |
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, Meridian, proxies |
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
- version = "0.1.0"
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>=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]
@@ -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 } }]