erk 0.4.5__py3-none-any.whl

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 (331) hide show
  1. erk/__init__.py +12 -0
  2. erk/__main__.py +6 -0
  3. erk/agent_docs/__init__.py +5 -0
  4. erk/agent_docs/models.py +123 -0
  5. erk/agent_docs/operations.py +666 -0
  6. erk/artifacts/__init__.py +5 -0
  7. erk/artifacts/artifact_health.py +623 -0
  8. erk/artifacts/detection.py +16 -0
  9. erk/artifacts/discovery.py +343 -0
  10. erk/artifacts/models.py +63 -0
  11. erk/artifacts/staleness.py +56 -0
  12. erk/artifacts/state.py +100 -0
  13. erk/artifacts/sync.py +624 -0
  14. erk/cli/__init__.py +0 -0
  15. erk/cli/activation.py +132 -0
  16. erk/cli/alias.py +53 -0
  17. erk/cli/cli.py +221 -0
  18. erk/cli/commands/__init__.py +0 -0
  19. erk/cli/commands/admin.py +153 -0
  20. erk/cli/commands/artifact/__init__.py +1 -0
  21. erk/cli/commands/artifact/check.py +260 -0
  22. erk/cli/commands/artifact/group.py +31 -0
  23. erk/cli/commands/artifact/list_cmd.py +89 -0
  24. erk/cli/commands/artifact/show.py +62 -0
  25. erk/cli/commands/artifact/sync_cmd.py +39 -0
  26. erk/cli/commands/branch/__init__.py +26 -0
  27. erk/cli/commands/branch/assign_cmd.py +152 -0
  28. erk/cli/commands/branch/checkout_cmd.py +357 -0
  29. erk/cli/commands/branch/create_cmd.py +161 -0
  30. erk/cli/commands/branch/list_cmd.py +82 -0
  31. erk/cli/commands/branch/unassign_cmd.py +197 -0
  32. erk/cli/commands/cc/__init__.py +15 -0
  33. erk/cli/commands/cc/jsonl_cmd.py +20 -0
  34. erk/cli/commands/cc/session/AGENTS.md +30 -0
  35. erk/cli/commands/cc/session/CLAUDE.md +1 -0
  36. erk/cli/commands/cc/session/__init__.py +15 -0
  37. erk/cli/commands/cc/session/list_cmd.py +167 -0
  38. erk/cli/commands/cc/session/show_cmd.py +175 -0
  39. erk/cli/commands/completion.py +89 -0
  40. erk/cli/commands/completions.py +165 -0
  41. erk/cli/commands/config.py +327 -0
  42. erk/cli/commands/docs/__init__.py +1 -0
  43. erk/cli/commands/docs/group.py +16 -0
  44. erk/cli/commands/docs/sync.py +121 -0
  45. erk/cli/commands/docs/validate.py +102 -0
  46. erk/cli/commands/doctor.py +243 -0
  47. erk/cli/commands/down.py +171 -0
  48. erk/cli/commands/exec/__init__.py +1 -0
  49. erk/cli/commands/exec/group.py +164 -0
  50. erk/cli/commands/exec/scripts/AGENTS.md +79 -0
  51. erk/cli/commands/exec/scripts/CLAUDE.md +1 -0
  52. erk/cli/commands/exec/scripts/__init__.py +5 -0
  53. erk/cli/commands/exec/scripts/add_reaction_to_comment.py +69 -0
  54. erk/cli/commands/exec/scripts/add_remote_execution_note.py +68 -0
  55. erk/cli/commands/exec/scripts/check_impl.py +152 -0
  56. erk/cli/commands/exec/scripts/ci_update_pr_body.py +294 -0
  57. erk/cli/commands/exec/scripts/create_extraction_branch.py +138 -0
  58. erk/cli/commands/exec/scripts/create_extraction_plan.py +242 -0
  59. erk/cli/commands/exec/scripts/create_issue_from_session.py +103 -0
  60. erk/cli/commands/exec/scripts/create_plan_from_context.py +103 -0
  61. erk/cli/commands/exec/scripts/create_worker_impl_from_issue.py +93 -0
  62. erk/cli/commands/exec/scripts/detect_trunk_branch.py +121 -0
  63. erk/cli/commands/exec/scripts/exit_plan_mode_hook.py +777 -0
  64. erk/cli/commands/exec/scripts/extract_latest_plan.py +49 -0
  65. erk/cli/commands/exec/scripts/extract_session_from_issue.py +150 -0
  66. erk/cli/commands/exec/scripts/find_project_dir.py +214 -0
  67. erk/cli/commands/exec/scripts/generate_pr_summary.py +112 -0
  68. erk/cli/commands/exec/scripts/get_closing_text.py +98 -0
  69. erk/cli/commands/exec/scripts/get_embedded_prompt.py +62 -0
  70. erk/cli/commands/exec/scripts/get_plan_metadata.py +95 -0
  71. erk/cli/commands/exec/scripts/get_pr_body_footer.py +70 -0
  72. erk/cli/commands/exec/scripts/get_pr_discussion_comments.py +149 -0
  73. erk/cli/commands/exec/scripts/get_pr_review_comments.py +155 -0
  74. erk/cli/commands/exec/scripts/impl_init.py +158 -0
  75. erk/cli/commands/exec/scripts/impl_signal.py +375 -0
  76. erk/cli/commands/exec/scripts/impl_verify.py +49 -0
  77. erk/cli/commands/exec/scripts/issue_title_to_filename.py +34 -0
  78. erk/cli/commands/exec/scripts/list_sessions.py +296 -0
  79. erk/cli/commands/exec/scripts/mark_impl_ended.py +188 -0
  80. erk/cli/commands/exec/scripts/mark_impl_started.py +188 -0
  81. erk/cli/commands/exec/scripts/marker.py +163 -0
  82. erk/cli/commands/exec/scripts/objective_save_to_issue.py +109 -0
  83. erk/cli/commands/exec/scripts/plan_save_to_issue.py +269 -0
  84. erk/cli/commands/exec/scripts/plan_update_issue.py +147 -0
  85. erk/cli/commands/exec/scripts/post_extraction_comment.py +237 -0
  86. erk/cli/commands/exec/scripts/post_or_update_pr_summary.py +133 -0
  87. erk/cli/commands/exec/scripts/post_pr_inline_comment.py +143 -0
  88. erk/cli/commands/exec/scripts/post_workflow_started_comment.py +168 -0
  89. erk/cli/commands/exec/scripts/preprocess_session.py +777 -0
  90. erk/cli/commands/exec/scripts/quick_submit.py +32 -0
  91. erk/cli/commands/exec/scripts/rebase_with_conflict_resolution.py +260 -0
  92. erk/cli/commands/exec/scripts/reply_to_discussion_comment.py +173 -0
  93. erk/cli/commands/exec/scripts/resolve_review_thread.py +170 -0
  94. erk/cli/commands/exec/scripts/session_id_injector_hook.py +52 -0
  95. erk/cli/commands/exec/scripts/setup_impl_from_issue.py +159 -0
  96. erk/cli/commands/exec/scripts/slot_objective.py +102 -0
  97. erk/cli/commands/exec/scripts/tripwires_reminder_hook.py +20 -0
  98. erk/cli/commands/exec/scripts/update_dispatch_info.py +116 -0
  99. erk/cli/commands/exec/scripts/user_prompt_hook.py +113 -0
  100. erk/cli/commands/exec/scripts/validate_plan_content.py +98 -0
  101. erk/cli/commands/exec/scripts/wrap_plan_in_metadata_block.py +34 -0
  102. erk/cli/commands/implement.py +695 -0
  103. erk/cli/commands/implement_shared.py +649 -0
  104. erk/cli/commands/info/__init__.py +14 -0
  105. erk/cli/commands/info/release_notes_cmd.py +128 -0
  106. erk/cli/commands/init.py +801 -0
  107. erk/cli/commands/land_cmd.py +690 -0
  108. erk/cli/commands/log_cmd.py +137 -0
  109. erk/cli/commands/md/__init__.py +5 -0
  110. erk/cli/commands/md/check.py +118 -0
  111. erk/cli/commands/md/group.py +14 -0
  112. erk/cli/commands/navigation_helpers.py +430 -0
  113. erk/cli/commands/objective/__init__.py +16 -0
  114. erk/cli/commands/objective/list_cmd.py +47 -0
  115. erk/cli/commands/objective_helpers.py +132 -0
  116. erk/cli/commands/plan/__init__.py +32 -0
  117. erk/cli/commands/plan/check_cmd.py +174 -0
  118. erk/cli/commands/plan/close_cmd.py +69 -0
  119. erk/cli/commands/plan/create_cmd.py +120 -0
  120. erk/cli/commands/plan/docs/__init__.py +18 -0
  121. erk/cli/commands/plan/docs/extract_cmd.py +53 -0
  122. erk/cli/commands/plan/docs/unextract_cmd.py +38 -0
  123. erk/cli/commands/plan/docs/unextracted_cmd.py +72 -0
  124. erk/cli/commands/plan/extraction/__init__.py +16 -0
  125. erk/cli/commands/plan/extraction/complete_cmd.py +101 -0
  126. erk/cli/commands/plan/extraction/create_raw_cmd.py +63 -0
  127. erk/cli/commands/plan/get.py +71 -0
  128. erk/cli/commands/plan/list_cmd.py +754 -0
  129. erk/cli/commands/plan/log_cmd.py +440 -0
  130. erk/cli/commands/plan/start_cmd.py +459 -0
  131. erk/cli/commands/planner/__init__.py +40 -0
  132. erk/cli/commands/planner/configure_cmd.py +73 -0
  133. erk/cli/commands/planner/connect_cmd.py +96 -0
  134. erk/cli/commands/planner/create_cmd.py +148 -0
  135. erk/cli/commands/planner/list_cmd.py +51 -0
  136. erk/cli/commands/planner/register_cmd.py +105 -0
  137. erk/cli/commands/planner/set_default_cmd.py +23 -0
  138. erk/cli/commands/planner/unregister_cmd.py +43 -0
  139. erk/cli/commands/pr/__init__.py +23 -0
  140. erk/cli/commands/pr/check_cmd.py +112 -0
  141. erk/cli/commands/pr/checkout_cmd.py +165 -0
  142. erk/cli/commands/pr/fix_conflicts_cmd.py +82 -0
  143. erk/cli/commands/pr/parse_pr_reference.py +10 -0
  144. erk/cli/commands/pr/submit_cmd.py +360 -0
  145. erk/cli/commands/pr/sync_cmd.py +181 -0
  146. erk/cli/commands/prepare_cwd_recovery.py +60 -0
  147. erk/cli/commands/project/__init__.py +16 -0
  148. erk/cli/commands/project/init_cmd.py +91 -0
  149. erk/cli/commands/run/__init__.py +17 -0
  150. erk/cli/commands/run/list_cmd.py +189 -0
  151. erk/cli/commands/run/logs_cmd.py +54 -0
  152. erk/cli/commands/run/shared.py +19 -0
  153. erk/cli/commands/shell_integration.py +29 -0
  154. erk/cli/commands/slot/__init__.py +23 -0
  155. erk/cli/commands/slot/check_cmd.py +277 -0
  156. erk/cli/commands/slot/common.py +314 -0
  157. erk/cli/commands/slot/init_pool_cmd.py +157 -0
  158. erk/cli/commands/slot/list_cmd.py +228 -0
  159. erk/cli/commands/slot/repair_cmd.py +190 -0
  160. erk/cli/commands/stack/__init__.py +23 -0
  161. erk/cli/commands/stack/consolidate_cmd.py +470 -0
  162. erk/cli/commands/stack/list_cmd.py +79 -0
  163. erk/cli/commands/stack/move_cmd.py +309 -0
  164. erk/cli/commands/stack/split_old/README.md +64 -0
  165. erk/cli/commands/stack/split_old/__init__.py +5 -0
  166. erk/cli/commands/stack/split_old/command.py +233 -0
  167. erk/cli/commands/stack/split_old/display.py +116 -0
  168. erk/cli/commands/stack/split_old/plan.py +216 -0
  169. erk/cli/commands/status.py +58 -0
  170. erk/cli/commands/submit.py +768 -0
  171. erk/cli/commands/up.py +154 -0
  172. erk/cli/commands/upgrade.py +82 -0
  173. erk/cli/commands/wt/__init__.py +29 -0
  174. erk/cli/commands/wt/checkout_cmd.py +110 -0
  175. erk/cli/commands/wt/create_cmd.py +998 -0
  176. erk/cli/commands/wt/current_cmd.py +35 -0
  177. erk/cli/commands/wt/delete_cmd.py +573 -0
  178. erk/cli/commands/wt/list_cmd.py +332 -0
  179. erk/cli/commands/wt/rename_cmd.py +66 -0
  180. erk/cli/config.py +242 -0
  181. erk/cli/constants.py +29 -0
  182. erk/cli/core.py +65 -0
  183. erk/cli/debug.py +9 -0
  184. erk/cli/ensure-conversion-tasks.md +288 -0
  185. erk/cli/ensure.py +628 -0
  186. erk/cli/github_parsing.py +96 -0
  187. erk/cli/graphite.py +81 -0
  188. erk/cli/graphite_command.py +80 -0
  189. erk/cli/help_formatter.py +345 -0
  190. erk/cli/output.py +361 -0
  191. erk/cli/presets/dagster.toml +12 -0
  192. erk/cli/presets/generic.toml +12 -0
  193. erk/cli/prompt_hooks_templates/README.md +68 -0
  194. erk/cli/script_output.py +32 -0
  195. erk/cli/shell_integration/bash_wrapper.sh +32 -0
  196. erk/cli/shell_integration/fish_wrapper.fish +39 -0
  197. erk/cli/shell_integration/handler.py +338 -0
  198. erk/cli/shell_integration/zsh_wrapper.sh +32 -0
  199. erk/cli/shell_utils.py +171 -0
  200. erk/cli/subprocess_utils.py +92 -0
  201. erk/cli/uvx_detection.py +59 -0
  202. erk/core/__init__.py +0 -0
  203. erk/core/claude_executor.py +511 -0
  204. erk/core/claude_settings.py +317 -0
  205. erk/core/command_log.py +406 -0
  206. erk/core/commit_message_generator.py +234 -0
  207. erk/core/completion.py +10 -0
  208. erk/core/consolidation_utils.py +177 -0
  209. erk/core/context.py +570 -0
  210. erk/core/display/__init__.py +4 -0
  211. erk/core/display/abc.py +24 -0
  212. erk/core/display/real.py +30 -0
  213. erk/core/display_utils.py +526 -0
  214. erk/core/file_utils.py +87 -0
  215. erk/core/health_checks.py +1315 -0
  216. erk/core/health_checks_dogfooder/__init__.py +85 -0
  217. erk/core/health_checks_dogfooder/deprecated_dot_agent_config.py +64 -0
  218. erk/core/health_checks_dogfooder/legacy_claude_docs.py +69 -0
  219. erk/core/health_checks_dogfooder/legacy_config_locations.py +122 -0
  220. erk/core/health_checks_dogfooder/legacy_erk_docs_agent.py +61 -0
  221. erk/core/health_checks_dogfooder/legacy_erk_kits_folder.py +60 -0
  222. erk/core/health_checks_dogfooder/legacy_hook_settings.py +104 -0
  223. erk/core/health_checks_dogfooder/legacy_kit_yaml.py +78 -0
  224. erk/core/health_checks_dogfooder/legacy_kits_toml.py +43 -0
  225. erk/core/health_checks_dogfooder/outdated_erk_skill.py +43 -0
  226. erk/core/implementation_queue/__init__.py +1 -0
  227. erk/core/implementation_queue/github/__init__.py +8 -0
  228. erk/core/implementation_queue/github/abc.py +7 -0
  229. erk/core/implementation_queue/github/noop.py +38 -0
  230. erk/core/implementation_queue/github/printing.py +43 -0
  231. erk/core/implementation_queue/github/real.py +119 -0
  232. erk/core/init_utils.py +227 -0
  233. erk/core/output_filter.py +338 -0
  234. erk/core/plan_store/__init__.py +6 -0
  235. erk/core/planner/__init__.py +1 -0
  236. erk/core/planner/registry_abc.py +8 -0
  237. erk/core/planner/registry_fake.py +129 -0
  238. erk/core/planner/registry_real.py +195 -0
  239. erk/core/planner/types.py +7 -0
  240. erk/core/pr_utils.py +30 -0
  241. erk/core/release_notes.py +263 -0
  242. erk/core/repo_discovery.py +126 -0
  243. erk/core/script_writer.py +41 -0
  244. erk/core/services/__init__.py +1 -0
  245. erk/core/services/plan_list_service.py +94 -0
  246. erk/core/shell.py +51 -0
  247. erk/core/user_feedback.py +11 -0
  248. erk/core/version_check.py +55 -0
  249. erk/core/workflow_display.py +75 -0
  250. erk/core/worktree_pool.py +190 -0
  251. erk/core/worktree_utils.py +300 -0
  252. erk/data/CHANGELOG.md +438 -0
  253. erk/data/__init__.py +1 -0
  254. erk/data/claude/agents/devrun.md +180 -0
  255. erk/data/claude/commands/erk/__init__.py +0 -0
  256. erk/data/claude/commands/erk/create-extraction-plan.md +360 -0
  257. erk/data/claude/commands/erk/fix-conflicts.md +25 -0
  258. erk/data/claude/commands/erk/git-pr-push.md +345 -0
  259. erk/data/claude/commands/erk/implement-stacked-plan.md +96 -0
  260. erk/data/claude/commands/erk/land.md +193 -0
  261. erk/data/claude/commands/erk/objective-create.md +370 -0
  262. erk/data/claude/commands/erk/objective-list.md +34 -0
  263. erk/data/claude/commands/erk/objective-next-plan.md +220 -0
  264. erk/data/claude/commands/erk/objective-update-with-landed-pr.md +216 -0
  265. erk/data/claude/commands/erk/plan-implement.md +202 -0
  266. erk/data/claude/commands/erk/plan-save.md +45 -0
  267. erk/data/claude/commands/erk/plan-submit.md +39 -0
  268. erk/data/claude/commands/erk/pr-address.md +367 -0
  269. erk/data/claude/commands/erk/pr-submit.md +58 -0
  270. erk/data/claude/skills/dignified-python/SKILL.md +48 -0
  271. erk/data/claude/skills/dignified-python/cli-patterns.md +155 -0
  272. erk/data/claude/skills/dignified-python/dignified-python-core.md +1190 -0
  273. erk/data/claude/skills/dignified-python/subprocess.md +99 -0
  274. erk/data/claude/skills/dignified-python/versions/python-3.10.md +517 -0
  275. erk/data/claude/skills/dignified-python/versions/python-3.11.md +536 -0
  276. erk/data/claude/skills/dignified-python/versions/python-3.12.md +662 -0
  277. erk/data/claude/skills/dignified-python/versions/python-3.13.md +653 -0
  278. erk/data/claude/skills/erk-diff-analysis/SKILL.md +27 -0
  279. erk/data/claude/skills/erk-diff-analysis/references/commit-message-prompt.md +78 -0
  280. erk/data/claude/skills/learned-docs/SKILL.md +362 -0
  281. erk/data/github/actions/setup-claude-erk/action.yml +11 -0
  282. erk/data/github/prompts/dignified-python-review.md +125 -0
  283. erk/data/github/workflows/dignified-python-review.yml +61 -0
  284. erk/data/github/workflows/erk-impl.yml +251 -0
  285. erk/hooks/__init__.py +1 -0
  286. erk/hooks/decorators.py +319 -0
  287. erk/status/__init__.py +8 -0
  288. erk/status/collectors/__init__.py +9 -0
  289. erk/status/collectors/base.py +52 -0
  290. erk/status/collectors/git.py +76 -0
  291. erk/status/collectors/github.py +81 -0
  292. erk/status/collectors/graphite.py +80 -0
  293. erk/status/collectors/impl.py +145 -0
  294. erk/status/models/__init__.py +4 -0
  295. erk/status/models/status_data.py +404 -0
  296. erk/status/orchestrator.py +169 -0
  297. erk/status/renderers/__init__.py +5 -0
  298. erk/status/renderers/simple.py +322 -0
  299. erk/tui/AGENTS.md +193 -0
  300. erk/tui/CLAUDE.md +1 -0
  301. erk/tui/__init__.py +1 -0
  302. erk/tui/app.py +1404 -0
  303. erk/tui/commands/__init__.py +1 -0
  304. erk/tui/commands/executor.py +66 -0
  305. erk/tui/commands/provider.py +165 -0
  306. erk/tui/commands/real_executor.py +63 -0
  307. erk/tui/commands/registry.py +121 -0
  308. erk/tui/commands/types.py +36 -0
  309. erk/tui/data/__init__.py +1 -0
  310. erk/tui/data/provider.py +492 -0
  311. erk/tui/data/types.py +104 -0
  312. erk/tui/filtering/__init__.py +1 -0
  313. erk/tui/filtering/logic.py +43 -0
  314. erk/tui/filtering/types.py +55 -0
  315. erk/tui/jsonl_viewer/__init__.py +1 -0
  316. erk/tui/jsonl_viewer/app.py +61 -0
  317. erk/tui/jsonl_viewer/models.py +208 -0
  318. erk/tui/jsonl_viewer/widgets.py +204 -0
  319. erk/tui/sorting/__init__.py +6 -0
  320. erk/tui/sorting/logic.py +55 -0
  321. erk/tui/sorting/types.py +68 -0
  322. erk/tui/styles/dash.tcss +95 -0
  323. erk/tui/widgets/__init__.py +1 -0
  324. erk/tui/widgets/command_output.py +112 -0
  325. erk/tui/widgets/plan_table.py +276 -0
  326. erk/tui/widgets/status_bar.py +116 -0
  327. erk-0.4.5.dist-info/METADATA +376 -0
  328. erk-0.4.5.dist-info/RECORD +331 -0
  329. erk-0.4.5.dist-info/WHEEL +4 -0
  330. erk-0.4.5.dist-info/entry_points.txt +2 -0
  331. erk-0.4.5.dist-info/licenses/LICENSE.md +3 -0
@@ -0,0 +1,376 @@
1
+ Metadata-Version: 2.4
2
+ Name: erk
3
+ Version: 0.4.5
4
+ Summary: Add your description here
5
+ Author-email: Dagster Labs <hello@dagsterlabs.com>
6
+ License-File: LICENSE.md
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: click>=8.1.7
9
+ Requires-Dist: erk-shared
10
+ Requires-Dist: erk-statusline
11
+ Requires-Dist: packaging>=21.0
12
+ Requires-Dist: pathspec>=0.12.0
13
+ Requires-Dist: pydantic>=2.0
14
+ Requires-Dist: pyperclip>=1.8.2
15
+ Requires-Dist: python-frontmatter>=1.0.0
16
+ Requires-Dist: pyyaml>=6.0
17
+ Requires-Dist: rich>=13.0
18
+ Requires-Dist: textual-dev>=1.8.0
19
+ Requires-Dist: textual>=3.0.0
20
+ Requires-Dist: tomli-w>=1.0
21
+ Requires-Dist: tomli>=2.0
22
+ Requires-Dist: tomlkit>=0.12.0
23
+ Description-Content-Type: text/markdown
24
+
25
+ # erk
26
+
27
+ `erk` is a CLI tool for plan-oriented agentic engineering.
28
+
29
+ For the philosophy and design principles behind erk, see [The TAO of erk](TAO.md).
30
+
31
+ ## User Setup
32
+
33
+ ### Prerequisites
34
+
35
+ Ensure you have these tools installed:
36
+
37
+ - `python` (3.10+)
38
+ - `claude` - Claude Code CLI
39
+ - `uv` - Fast Python environment management
40
+ - `gt` - Graphite for stacked PRs
41
+ - `gh` - GitHub CLI
42
+
43
+ ### Initialize Erk
44
+
45
+ ```bash
46
+ erk init
47
+ ```
48
+
49
+ This command:
50
+
51
+ - Prompts for worktrees root directory (where all worktrees are stored)
52
+ - Creates global config at `~/.erk/config.toml`
53
+ - Detects Graphite (`gt`) availability for branch creation
54
+ - Creates repo-specific `config.toml` with preset selection (`auto`, `generic`, `dagster`)
55
+ - Offers to add `.env`, `.erk/scratch/`, and `.impl/` to `.gitignore`
56
+ - Shows shell integration setup instructions (completion + auto-activation)
57
+
58
+ ### Shell Integration
59
+
60
+ `erk init` will display shell integration instructions to add to your `.zshrc` or `.bashrc`. Copy these instructions manually - erk doesn't modify your shell config automatically.
61
+
62
+ **Why manual setup?** Shell integration is essential for the core workflow: it enables commands such as `erk br co` and `erk wt co` to change your terminal's directory and activate the correct Python environment. Without it, these commands run in a subprocess and have no effect on your shell. We ask you to add it manually so you stay in control of your shell configuration.
63
+
64
+ To view the instructions again later: `erk init --shell`
65
+
66
+ Or append directly:
67
+
68
+ ```bash
69
+ erk init --shell >> ~/.zshrc # or ~/.bashrc
70
+ ```
71
+
72
+ ### Verify Setup
73
+
74
+ Run the doctor command to verify your environment:
75
+
76
+ ```bash
77
+ erk doctor
78
+ ```
79
+
80
+ This checks that all prerequisites are installed and configured correctly.
81
+
82
+ ## Local Plan-Driven Workflow
83
+
84
+ The primary workflow: create a plan, save it, implement it, ship it. **Often completes without touching an IDE.**
85
+
86
+ ### Planning Phase
87
+
88
+ 1. Start a Claude Code session:
89
+
90
+ ```bash
91
+ claude
92
+ ```
93
+
94
+ 2. Enter plan mode and develop your plan
95
+
96
+ 3. Save plan to GitHub issue (system prompts automatically after plan mode)
97
+
98
+ ### Implementation
99
+
100
+ 4. Execute the plan:
101
+
102
+ ```bash
103
+ erk implement <issue-number>
104
+ ```
105
+
106
+ This creates a worktree, activates the environment, and runs Claude Code with the plan.
107
+
108
+ ### PR Submission
109
+
110
+ 5. Submit the PR:
111
+
112
+ ```bash
113
+ erk pr submit
114
+ ```
115
+
116
+ Or from within Claude Code: `/erk:pr-submit`
117
+
118
+ ### Code Review Iteration
119
+
120
+ 6. Review PR feedback in GitHub
121
+
122
+ 7. Address feedback:
123
+
124
+ ```
125
+ /erk:pr-address
126
+ ```
127
+
128
+ 8. Repeat until approved
129
+
130
+ ### Landing
131
+
132
+ 9. Merge and clean up:
133
+ ```bash
134
+ erk pr land
135
+ ```
136
+
137
+ > **Note:** This entire workflow—from planning through shipping—can happen without opening an IDE. You create plans, submit code, review feedback in GitHub, address it via Claude Code, and land.
138
+
139
+ ## Iteration Patterns
140
+
141
+ ### Quick Iteration
142
+
143
+ For rapid commits within a worktree:
144
+
145
+ ```
146
+ /quick-submit
147
+ ```
148
+
149
+ Commits all changes and submits with Graphite.
150
+
151
+ ### Rebasing and Stack Management
152
+
153
+ When your stack needs rebasing:
154
+
155
+ ```bash
156
+ erk pr auto-restack --dangerous
157
+ ```
158
+
159
+ Or from Claude Code: `/erk:auto-restack`
160
+
161
+ To fix merge conflicts during a rebase:
162
+
163
+ ```
164
+ /erk:fix-conflicts
165
+ ```
166
+
167
+ ## Common Workflows
168
+
169
+ ### Auto-Restack: Intelligent Conflict Resolution
170
+
171
+ When working with stacked PRs, rebasing is a frequent operation. `erk pr auto-restack` automates this process with intelligent conflict resolution.
172
+
173
+ **What it does:**
174
+
175
+ 1. Runs `gt restack` to rebase your stack onto the latest trunk
176
+ 2. If conflicts occur, launches Claude Code with the `/erk:fix-conflicts` command
177
+ 3. After resolution, automatically continues the restack process
178
+ 4. Repeats until the entire stack is cleanly rebased
179
+
180
+ **Basic usage:**
181
+
182
+ ```bash
183
+ erk pr auto-restack --dangerous
184
+ ```
185
+
186
+ **From within Claude Code:**
187
+
188
+ ```
189
+ /erk:auto-restack
190
+ ```
191
+
192
+ > Note: The `--dangerous` flag acknowledges that auto-restack invokes Claude with `--dangerously-skip-permissions`.
193
+
194
+ **When to use it:**
195
+
196
+ - After merging a PR that's below yours in the stack
197
+ - When trunk has been updated and you need to incorporate changes
198
+ - When Graphite shows your stack needs rebasing
199
+ - After running `erk pr land` on a parent branch
200
+
201
+ **How conflict resolution works:**
202
+
203
+ When conflicts are detected, erk spawns a Claude Code session that:
204
+
205
+ 1. Identifies all conflicting files
206
+ 2. Analyzes the nature of each conflict (content vs import conflicts)
207
+ 3. Resolves conflicts while preserving the intent of both changes
208
+ 4. Stages resolved files and continues the rebase
209
+
210
+ **Example scenario:**
211
+
212
+ ```
213
+ trunk ← feature-a ← feature-b ← feature-c (you are here)
214
+ ```
215
+
216
+ If `feature-a` merges into trunk, running `erk pr auto-restack --dangerous` will:
217
+
218
+ 1. Rebase `feature-b` onto the new trunk
219
+ 2. Resolve any conflicts (with Claude's help if needed)
220
+ 3. Rebase `feature-c` onto the updated `feature-b`
221
+ 4. Resolve any conflicts at this level too
222
+
223
+ The result: your entire stack is cleanly rebased with minimal manual intervention.
224
+
225
+ ### Checkout PR from GitHub
226
+
227
+ When reviewing or debugging a PR—whether from a teammate or a remote agent run—you can check it out directly using the PR number or URL from the GitHub page.
228
+
229
+ **Basic usage:**
230
+
231
+ ```bash
232
+ # Using PR number
233
+ erk pr checkout 123
234
+
235
+ # Using GitHub URL (copy directly from browser)
236
+ erk pr checkout https://github.com/owner/repo/pull/123
237
+ ```
238
+
239
+ This creates a local worktree for the PR branch and changes your shell to that directory.
240
+
241
+ **Syncing with Graphite:**
242
+
243
+ After checkout, sync with Graphite to enable stack management:
244
+
245
+ ```bash
246
+ erk pr sync --dangerous
247
+ ```
248
+
249
+ This registers the branch with Graphite so you can use standard `gt` commands (`gt pr`, `gt land`, etc.).
250
+
251
+ > Note: The `--dangerous` flag acknowledges that sync invokes Claude with `--dangerously-skip-permissions`.
252
+
253
+ **Complete workflow:**
254
+
255
+ ```bash
256
+ # 1. Checkout the PR (copy URL from GitHub)
257
+ erk pr checkout https://github.com/myorg/myrepo/pull/456
258
+
259
+ # 2. Sync with Graphite
260
+ erk pr sync --dangerous
261
+
262
+ # 3. Now iterate normally
263
+ claude
264
+ # ... make changes ...
265
+ /quick-submit
266
+
267
+ # 4. Or land when approved
268
+ erk pr land
269
+ ```
270
+
271
+ **When to use it:**
272
+
273
+ - Reviewing a teammate's PR locally
274
+ - Debugging a PR created by remote agent execution
275
+ - Taking over a PR that needs local iteration
276
+ - Running tests or making fixes on someone else's branch
277
+
278
+ ## Documentation Extraction
279
+
280
+ Erk supports extracting reusable documentation from implementation sessions into the `docs/learned/` folder—a directory of **agent-generated, agent-consumed documentation**.
281
+
282
+ This documentation:
283
+
284
+ - Captures patterns discovered during implementation
285
+ - Gets loaded by future agent sessions via AGENTS.md routing
286
+ - Builds institutional knowledge over time
287
+
288
+ To extract documentation from a session:
289
+
290
+ ```
291
+ /erk:create-extraction-plan
292
+ ```
293
+
294
+ ## Remote Execution
295
+
296
+ For sandboxed, parallel execution via GitHub Actions:
297
+
298
+ 1. Create a plan (via Claude Code plan mode)
299
+
300
+ 2. Submit for remote execution:
301
+ ```bash
302
+ erk plan submit <issue-number>
303
+ ```
304
+
305
+ The agent runs in GitHub Actions and creates a PR automatically.
306
+
307
+ ## Debugging Remote PRs
308
+
309
+ When a remote implementation needs local iteration:
310
+
311
+ ```bash
312
+ erk pr checkout <pr-number>
313
+ erk pr sync --dangerous
314
+ ```
315
+
316
+ This checks out the PR into a local worktree for debugging and iteration.
317
+
318
+ ## Planless Workflow
319
+
320
+ For smaller changes that don't require formal planning:
321
+
322
+ 1. Create a worktree:
323
+
324
+ ```bash
325
+ erk wt create <branch-name>
326
+ ```
327
+
328
+ 2. Iterate normally in Claude Code
329
+
330
+ 3. Submit PR:
331
+
332
+ ```bash
333
+ erk pr submit
334
+ ```
335
+
336
+ 4. Merge and clean up:
337
+ ```bash
338
+ erk pr land
339
+ ```
340
+
341
+ ## File Locations
342
+
343
+ | Location | Contents |
344
+ | ---------- | ------------------------------------------------ |
345
+ | `.erk/` | Erk configuration, scratch storage, session data |
346
+ | `.impl/` | Implementation plans (at worktree root) |
347
+ | `.claude/` | Claude Code commands, skills, hooks |
348
+
349
+ ### Gitignore
350
+
351
+ `erk init` automatically adds these entries to your `.gitignore`. If you ran `erk init`, this is already configured:
352
+
353
+ ```gitignore
354
+ .erk/scratch/
355
+ .impl/
356
+ ```
357
+
358
+ `.impl/` contains temporary implementation plans that shouldn't be committed. `.erk/scratch/` holds session-specific working files.
359
+
360
+ ## Plan Mode GitHub Integration
361
+
362
+ By default, erk modifies Claude Code's plan mode behavior. When you exit plan mode, erk prompts you to save the plan to GitHub as an issue before proceeding. This enables the plan-driven workflow where plans become trackable issues that can be implemented via `erk implement <issue-number>`.
363
+
364
+ To disable this behavior and use standard Claude Code plan mode:
365
+
366
+ ```bash
367
+ erk config set github_planning false
368
+ ```
369
+
370
+ To re-enable:
371
+
372
+ ```bash
373
+ erk config set github_planning true
374
+ ```
375
+
376
+ When disabled, exiting plan mode works exactly as it does in standard Claude Code.