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
erk/data/CHANGELOG.md ADDED
@@ -0,0 +1,438 @@
1
+ # Changelog
2
+
3
+ All notable changes to erk will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.4.5] - 2026-01-05 17:19 PT
11
+
12
+ ### Changed
13
+
14
+ - `erk init` now sets up plans repo labels and Claude permissions automatically
15
+
16
+ ### Fixed
17
+
18
+ - Fix submit command to use trunk as base when on placeholder or unpushed branches
19
+ - Handle `gh api` target repo substitution and validate erk-managed repos
20
+ - Handle terminal editors (vim, nano, etc.) in plan edit flow
21
+ - Silence version check warning outside git repos
22
+
23
+ ## [0.4.4] - 2026-01-05 10:45 PT
24
+
25
+ ### Added
26
+
27
+ - Add `--clear-hook-logs` option to `erk doctor` command
28
+ - Add check counts to status line display
29
+ - Add logging to statusline for debugging GitHub data fetches and cache behavior
30
+
31
+ ### Changed
32
+
33
+ - Handle merge conflicts in erk-impl workflow by attempting rebase with Claude assistance
34
+ - Clarify plan-save command output handling to preserve dangerous option in instructions
35
+
36
+ ### Fixed
37
+
38
+ - Fix keyword argument passing to create_branch_manager factory function
39
+
40
+ ## [0.4.3] - 2026-01-05 07:55 PT
41
+
42
+ ### Added
43
+
44
+ - Add `erk upgrade` command to update local installation to repo's required version
45
+ - Display plan issue closure status after landing PR
46
+ - Display plan title and file path in exit plan mode prompt for better context
47
+
48
+ ### Changed
49
+
50
+ - Handle restack conflicts gracefully in `pr sync` with user-friendly guidance
51
+ - Prioritize Claude Code `/erk:plan-submit` slash command in plan submission next steps
52
+ - Condense `erk doctor` output with collapsible sub-groups and opt-in `--dogfooder` flag
53
+
54
+ ## [0.4.2] - 2026-01-04 21:19 PT
55
+
56
+ ### Added
57
+
58
+ - Add Python 3.11 support and fix forward reference compatibility
59
+
60
+ ### Changed
61
+
62
+ - Implement always gets new slot for maximum parallelism
63
+
64
+ ### Fixed
65
+
66
+ - Fix CI to use correct Python version in uv during unit tests
67
+
68
+ ## [0.4.1] - 2026-01-04 19:40 PT
69
+
70
+ ### Added
71
+
72
+ - Add `erk admin upgrade-repo` command to update repo to installed erk version
73
+ - Add `erk doctor` check for post-plan-implement CI hook configuration
74
+
75
+ ### Fixed
76
+
77
+ - Fix orphaned worktree discovery to use git instead of pool state
78
+ - Fix branch creation with `--force` to reuse existing slots via checkout
79
+ - Fix hook state tracking to record all installed hooks in `erk sync`
80
+
81
+ ## [0.4.0] - 2026-01-04 18:09 PT
82
+
83
+ ### Major Changes
84
+
85
+ - **Worktree Pool System**: Pre-initialized worktree slots replace ephemeral worktree creation. Creating and deleting worktrees on larger repositories caused significant problems: shells left on deleted working directories, an epidemic of git `index.lock` issues, and slow worktree operations. The pool system maintains a configurable number of persistent slots that are reused across assignments. Commands: `erk slot init`, `erk slot list`, `erk slot repair`, and `erk slot check`.
86
+
87
+ - **`erk br` namespace for branch management**: Consolidated branch lifecycle commands (`create`, `assign`, `unassign`) under `erk br` (short alias for `branch`). The `slot` group now focuses exclusively on pool infrastructure. Includes `--no-slot` flag for creating branches without slot assignment.
88
+
89
+ - **`erk pr fix-conflicts` command**: AI-powered merge conflict resolution. When rebasing causes conflicts, this command uses Claude to analyze and resolve conflicts automatically.
90
+
91
+ ### Added
92
+
93
+ - Detect uncommitted changes before checkout in slot assignment with user-friendly error messages
94
+ - Add `erk slot repair` command to remove stale assignments from pool state
95
+ - Create `/erk:implement-stacked-plan` command for stacked branch implementation
96
+ - Add visible URL column to objective list command output
97
+ - Add `pool.max_slots` configuration and worktree slot pre-initialization
98
+ - Add same-slot stacking for `erk implement` - stacks new branches on current branch instead of consuming a new slot
99
+ - Add "Changes" column to `erk slot list` showing dirty/clean status for each worktree
100
+ - Add `--dry-run` flag to `erk land` command to preview deletions without executing
101
+ - Bundle `dignified-python` skill with `erk sync` command by default
102
+
103
+ ### Changed
104
+
105
+ - Clarify slot list UX with improved status ("available", "assigned", "error") and reason terminology
106
+ - Simplify slot unassign to accept only worktree names
107
+ - Rename objective plan creation command from `objective-create-plan` to `objective-next-plan`
108
+ - Rename pooled sync to pooled check
109
+ - Use `gt create` for branch creation when Graphite enabled
110
+ - Update CI workflows to use claude-haiku-4 instead of claude-opus-4-5
111
+
112
+ ### Fixed
113
+
114
+ - Fix erk land UX issues: improve confirmation prompt clarity and prevent unwanted navigation
115
+ - Fix erk land to properly unassign pool slots instead of deleting them
116
+ - Fix pool_size config override when loading existing pool state
117
+ - Fix pooled implement shell integration registration
118
+ - Fix pooled unassign to checkout placeholder branch and validate worktree state
119
+ - Fix `erk pr land` failing when deleting remote branches from git worktrees
120
+ - Fix UserPromptSubmit hook matcher to apply to all prompts
121
+ - Fix delete remote branch for landing PRs via gh pr merge --delete-branch
122
+ - Suppress "branch not found" message during fork PR cleanup
123
+ - Fix erk land objective update flow and shell integration output routing
124
+ - Fix statusline detection to accept commands with or without uvx prefix
125
+ - Fix CLI crash when running outside git repository
126
+ - Fix slot selection to exclude initialized worktrees during on-demand creation
127
+
128
+ ### Removed
129
+
130
+ - Delete auto-restack feature and related infrastructure
131
+ - Delete 9 dead erk exec commands
132
+ - Remove step progress tracking from implementation system - plans no longer require step metadata
133
+
134
+ ## [0.3.3] - 2026-01-02 13:44 PT
135
+
136
+ ### Changed
137
+
138
+ - Move erk-statusline from dev to core dependencies
139
+
140
+ ### Fixed
141
+
142
+ - Fix BranchMetadata forward reference
143
+
144
+ ## [0.3.2] - 2026-01-02 12:30 PT
145
+
146
+ ### Major Changes
147
+
148
+ - **dignified-review**: Added AI-assisted code review as an optionally installed GitHub Action. Ensures compliance with dignified-python standards during code review by leaving comments on PRs. Comments are designed to be resolved via `/erk:pr-address`.
149
+
150
+ - **Top-level `erk land` command**: Promoted land from `erk pr land` to `erk land`. Now accepts PR numbers, URLs, or branch names. Includes shell aliases `br land` and `branch land`. Landing PRs is a high-frequency operation that deserves top-level access.
151
+
152
+ - **Cross-repo plan storage**: Plans can now be stored in a separate repository. Configure via `.erk/config.toml` with `[plans] repo = "owner/repo"`. This avoids polluting the main codebase with plan issues, particularly valuable for open source repos like dagster where we don't want erk-specific artifacts.
153
+
154
+ - **erk-statusline**: Added the erk statusline. Optionally installable via `erk init --statusline`. Displays current branch, worktree, GitHub checks status, PR info, and more. Provides at-a-glance visibility into your development state without running commands.
155
+
156
+ - **Graphite opt-in**: Graphite is now optional. Not everyone uses Graphite, so although you don't get stacking features, Graphite-less operation is now a fully supported workflow. Commands gracefully degrade to standard git operations.
157
+
158
+ ### Added
159
+
160
+ - Add command logging for CLI audit trail
161
+ - Add step-based progress tracking with GitHub metadata sync
162
+ - Add per-artifact version and hash tracking for health monitoring
163
+ - Add dynamic tripwire enforcement system
164
+ - Add erk-statusline configuration to init and health checks
165
+ - Add copy-pasteable commands section to plan issues
166
+ - Add auto-rebase when local branch is behind remote before push
167
+ - Add `--session-id` flag to marker CLI commands for explicit session ID
168
+ - Add configurable `default` parameter to `user_confirm` function
169
+
170
+ ### Changed
171
+
172
+ - Restructure init command with stepped flow and status line setup
173
+ - Standardize GitHub Actions workflow naming to kebab-case
174
+
175
+ ### Fixed
176
+
177
+ - Fix `erk pr checkout` for stacked PRs
178
+ - Fix dignified-python skill LBYL vs try/except guidance
179
+ - Fix `erk wt delete --all` to show accurate PR/plan status in planning phase
180
+ - Fix confirmation prompt output to stderr for consistency
181
+ - Fix pr-address skill handling of outdated review threads
182
+ - Fix changelog commit hash marker parsing to expect backtick formatting
183
+ - Fix frontmatter deprecation warning cluttering test output
184
+ - Fix GitHub Actions shell specification in review workflows
185
+ - Fix Claude Code installation path in Docker image
186
+ - Fix status comparison: compare against `StatusData.loading()` not `is None`
187
+
188
+ ## [0.3.1] - 2025-12-31 15:52 PT
189
+
190
+ ### Fixed
191
+
192
+ - Make step extraction gracefully degrade to empty list on empty LLM output
193
+
194
+ ### Changed
195
+
196
+ - Update release process documentation and consolidate into RELEASING.md
197
+
198
+ ## [0.3.0] - 2025-12-31 14:13 PT
199
+
200
+ ### Release Overview
201
+
202
+ This release dramatically simplifies erk's architecture by eliminating the kit system and consolidating artifact management into a single, automated workflow.
203
+
204
+ #### Kit System Eliminated
205
+
206
+ The kit system has been completely removed. Previously, users installed and managed "kits" (bundles of skills, commands, and agents) per-project. Now erk owns its artifacts directly:
207
+
208
+ - No `erk kit install`, `erk kit sync`, or kit registry commands
209
+ - Artifacts are bundled with erk itself and synced automatically
210
+ - One less concept to understand, one less thing to manage
211
+
212
+ #### Unified Artifact Management
213
+
214
+ erk now maintains a set of **bundled artifacts** that it syncs to target projects:
215
+
216
+ - **Skills**: `dignified-python`, `learned-docs`, `erk-diff-analysis`
217
+ - **Commands**: All `/erk:*` namespace commands (`/erk:plan-implement`, `/erk:pr-submit`, etc.)
218
+ - **Agents**: `devrun` (for running pytest/ty/ruff/make)
219
+ - **Workflows**: `erk-impl.yml` (for remote plan implementation via GitHub Actions)
220
+ - **Hooks**: `user-prompt-hook` and `exit-plan-mode-hook` (session management and plan tracking)
221
+
222
+ Running `erk init` or `erk artifact sync`:
223
+
224
+ 1. Copies file-based artifacts to `.claude/` and `.github/workflows/`
225
+ 2. Adds hook configurations to `.claude/settings.json`
226
+ 3. Stamps the version in `.erk/state.toml` for staleness detection
227
+
228
+ `erk doctor` and `erk artifact check` detect stale, missing, or orphaned artifacts—including missing hook configurations. Projects keep full ownership of `.claude/`; erk only manages its namespaced artifacts.
229
+
230
+ #### Repo-Level Constraint
231
+
232
+ erk now requires Claude to be launched from the git repository root. This simplifies worktree detection, artifact paths, and context creation. If you previously ran Claude from subdirectories, launch from the repo root instead. This matches how most users already work and provides a stable foundation.
233
+
234
+ #### Global Install Required (UVX Not Supported)
235
+
236
+ We explored using `uvx erk` for zero-install usage, but this isn't feasible due to shell integration. Commands like `erk implement`, `erk up`, `erk down`, and `erk wt checkout` change your shell's working directory—something only a shell function can do. This requires a shell wrapper function (installed via `erk init --shell`) that calls a persistent `erk` binary in your PATH.
237
+
238
+ **The solution is simple**: Install erk globally with `uv tool install erk`. erk handles the rest:
239
+
240
+ - Each repo has a `.erk/required-erk-uv-tool-version` file specifying the required version
241
+ - If your installed version doesn't match, erk warns you immediately with the fix: `uv tool upgrade erk`
242
+ - One person on the team updates the version file; everyone else follows the prompt
243
+
244
+ You don't install erk into each project—just keep your global tool current and artifacts synced. erk tells you when action is needed.
245
+
246
+ ---
247
+
248
+ ### Major Changes
249
+
250
+ - Extend artifact management to GitHub workflows with model configurability and OAuth support
251
+ - The kit system has been completely eliminated. erk installs its own artifacts directly with no user management required.
252
+ - We have moved back everything to be at repo-level. You must run claude at git repo root. This has simplified the architecture
253
+ - Migrate to static `erk exec` architecture, eliminating dynamic kit script loading
254
+ - Merge git kit into erk artifacts with unified `/erk:git-pr-push` command namespace
255
+ - Merge gt kit into erk artifacts, consolidating Graphite stack management
256
+ - Delete kit infrastructure entirely, relocating utilities to erk core packages
257
+ - Add unified artifact distribution system with discovery, sync, and staleness detection
258
+ - Relocate all erk documentation from `.erk/docs/agent` to `docs/learned/`
259
+
260
+ ### Added
261
+
262
+ - Add uvx/`uv tool run` detection with warning and confirmation prompt for shell integration commands
263
+ - Add missing artifact detection to complement orphan detection for bidirectional artifact health checks
264
+ - Add doctor checks for exit-plan-hook and required-version validation
265
+ - Add erk-managed indicator badges to artifact list command output
266
+ - Add retry logic with exponential backoff to prompt executor for transient API failures
267
+ - Add `impl` command alias for `implement` in shell integration
268
+ - Establish `.erk/prompt-hooks/` directory for AI-readable hook instructions
269
+ - Add "Edit the plan" option to exit plan mode hook
270
+ - Add `-f`/`--force` flag to `erk pr submit` for diverged branches
271
+ - Add `show_hidden_commands` config option to control visibility of deprecated commands
272
+ - Add hook initialization support to `erk init` command with `--hooks` flag
273
+ - Add backup file creation when modifying settings.json
274
+ - Add legacy pattern detection health checks for early dogfooders
275
+ - Add tool version checking to warn when installed erk is outdated
276
+ - Add automatic `--pull/--no-pull` option to `erk pr land` command
277
+ - Always show last commit time in branch list by default
278
+ - Add `reply-to-discussion-comment` exec command for formatted PR comment replies
279
+ - Implement LLM-based step extraction for plan implementation folders
280
+
281
+ ### Changed
282
+
283
+ - Restrict artifact sync to only copy bundled items, preventing dev-only artifacts from leaking into projects
284
+ - Make missing artifacts detection fail instead of warn
285
+ - Rename `/erk:save-plan` command to `/erk:plan-save` for consistency
286
+ - Integrate artifact syncing into `erk init` command
287
+ - Rename agent-docs skill to learned-docs
288
+ - Flatten agent folders to top-level artifacts
289
+ - Move `/gt:pr-submit` to `/erk:pr-submit`, from the gt kit to the erk kit
290
+ - Move erk scripts to top-level `erk exec` from `erk kit exec erk`
291
+ - Remove kit registry subsystem
292
+ - Remove `kit list`, `remove`, `search`, and `show` commands - consolidated into `dot-agent`
293
+ - Rename `auto_restack_skip_dangerous` config to `auto_restack_require_dangerous_flag` with flipped default
294
+ - Convert devrun from kit to single agent file
295
+ - Remove dignified-python kit - consolidated into vanilla skill
296
+ - Consolidate dignified-python skill into single version-aware implementation
297
+ - Rename `gt-graphite` skill to `gt` with simplified directory structure
298
+ - Streamline devrun agent to use Sonnet model with minimal documentation
299
+ - Standardize erk hook ID to `user-prompt-hook` via `erk exec` command
300
+ - Rename health check names to kebab-case format
301
+ - Scrub all kit references from repository
302
+ - Remove support for standalone docs in `.claude/docs/` directory; use skills instead
303
+ - Make PR parsing stricter by requiring github.com URLs
304
+ - Eliminate kit.yaml manifest files, use frontmatter-based artifact discovery
305
+ - Remove `erk kit` CLI commands and simplify artifact management
306
+
307
+ ### Fixed
308
+
309
+ - Fix missing error handling for deleted plan comment references with graceful fallback
310
+ - Fix artifact check to display only installed artifacts instead of bundled defaults
311
+ - Fix artifact sync path detection for editable installs
312
+ - Fix function name import and call in post_plan_comment script
313
+ - Fix `erk stack list` to show branches without worktrees using ancestor worktree
314
+ - Fix: Validate GitHub PR base branch matches local trunk before landing
315
+ - Fix AskUserQuestion option formatting in exit plan mode hook
316
+ - Fix hook subdirectory bug by using shared scratch directory utilities
317
+ - Fix shell completion context creation in resilient parsing mode
318
+ - Re-implement branch divergence check for PR submission with pre-flight validation
319
+ - Fix LLM step extraction robustness by upgrading to Sonnet model
320
+ - Fix LLM empty output handling in step extraction with diagnostic logging
321
+ - Add issue title to plan save output
322
+
323
+ ### Removed
324
+
325
+ - Remove objectives feature
326
+ - Disable session context embedding in plan save-to-issue command
327
+
328
+ ## [0.2.8] - 2025-12-18 06:51 PT
329
+
330
+ ### Fixed
331
+
332
+ - Fix Bun crash when launching Claude Code CLI from tmux by conditionally redirecting TTY only when needed
333
+
334
+ ## [0.2.7] - 2025-12-15 06:59 PT
335
+
336
+ ### Major Changes
337
+
338
+ - Reorganize CLI commands for consistency with unified `list` and `checkout` patterns across worktrees, branches, and PRs
339
+ - Move `submit` to `erk plan submit`
340
+ - Add `erk branch` command group with `checkout` (`co`) and `list` (`ls`) subcommands
341
+ - Rename `erk wt goto` to `erk wt checkout` with `co` alias
342
+ - Remove top-level `list` and `delete` commands, now `erk wt list` and `erk wt delete`
343
+ - Remove standalone `erk kit sync` command, consolidated into `erk kit install --force`
344
+
345
+ ### Added
346
+
347
+ - Add `.impl/` preservation guardrail to plan-implement workflow to prevent agents from deleting implementation plans - note: this may cause hard failures, please report if encountered
348
+ - Add `--all` flag to `erk wt delete` to close associated PR and plan
349
+ - Add copy logs button (`y` key) to plan detail screen
350
+ - Add config option `auto_restack_skip_dangerous` to skip `--dangerous` flag requirement
351
+ - Add `impl` alias for `erk implement` command
352
+ - Add prefix matching (PXXXX) for worktree-to-issue association
353
+ - Add PR URL display in quick-submit output
354
+
355
+ ### Changed
356
+
357
+ - Clean up CLI help string organization and improve command grouping
358
+ - Improve devrun hook message to increase agent adherence to devrun pattern
359
+ - Move CHANGELOG.md to repository root for PyPI distribution
360
+ - Migrate PR and issue queries from GraphQL to REST API for rate limit avoidance
361
+ - Rename `/erk:submit-plan` command to `/erk:plan-submit` for consistency
362
+
363
+ ### Fixed
364
+
365
+ - Fix release notes banner showing repeatedly when switching between worktrees with different erk versions
366
+ - Fix branch divergence error handling in PR submission with actionable remediation message
367
+ - Fix PR submissions to use Graphite parent branch instead of trunk
368
+
369
+ ### Removed
370
+
371
+ - Remove SESSION_CONTEXT environment variable for session ID passing
372
+
373
+ ## [0.2.5] - 2025-12-12 14:30 PT
374
+
375
+ ### Major Changes
376
+
377
+ - Publish `erk` and `erk-shared` packages to PyPI - install via `uv pip install erk` or run directly with `uvx erk`
378
+ - Relocate all erk-managed documentation from `docs/agent/` and `.claude/docs/` to unified `.erk/docs/` structure
379
+ - Add hook execution logging system with new "Hooks" section in `erk doctor` for health monitoring
380
+ - Add integrated release notes system with version change detection and `erk info release-notes` command
381
+
382
+ ### Added
383
+
384
+ - Add link indicator to PR display in plan dashboard for quick GitHub access
385
+ - Add `--force` flag to bypass open PR checks with confirmation in navigation commands
386
+ - Add `--dangerous` flag to `erk pr auto-restack` and `erk pr sync` commands for explicit opt-in to risky operations
387
+
388
+ ### Changed
389
+
390
+ - Remove legacy `dot-agent.toml` configuration and migrate to `kits.toml`
391
+ - Add `erk doctor` checks for legacy documentation locations
392
+
393
+ ### Fixed
394
+
395
+ - Fix release notes banner incorrectly shown on version downgrade in multi-worktree setups
396
+ - Fix nested bullet indentation in release notes parsing and display
397
+
398
+ ### Removed
399
+
400
+ - Remove outdated erk skill documentation from `.claude/skills/erk/`
401
+
402
+ ## [0.2.3] - 2025-12-12
403
+
404
+ ### Added
405
+
406
+ - Add orphaned artifact detection for `.claude/` directory
407
+ - Add hooks disabled check to `erk doctor` command with warning indicator
408
+ - Add critical safety guardrail against automatic remote pushes
409
+
410
+ ### Changed
411
+
412
+ - Eliminated the `dot-agent-kit` package entirely and consolidated config:
413
+ - Repository config moved to `.erk/config.toml` with legacy fallback support
414
+ - Consolidate into `erk-kits` + `erk.kits`
415
+ - Remove `dot-agent.toml` requirement, use `kits.toml` for project detection
416
+ - Fix `dev_mode` config to use `[tool.erk]` instead of deprecated `[tool.dot-agent]`
417
+ - Consolidate PR submission into unified two-layer architecture (core + Graphite)
418
+
419
+ ### Fixed
420
+
421
+ - Fix detect no-work-events failure mode in auto-restack command
422
+ - Fix OSError "argument list too long" by passing prompt via stdin instead of command line
423
+ - Fix PR summary generation by passing `PR_NUMBER` through workflow environment
424
+ - Fix `erk pr check` step numbering in plan-implement command
425
+ - Fix `gt quick-submit` hanging by adding `--no-edit` and `--no-interactive` flags
426
+ - Fix GitHub GraphQL array and object variable passing in gh CLI commands
427
+
428
+ ## [0.2.2] - 2025-12-11
429
+
430
+ ### Added
431
+
432
+ - Release notes system with version change detection and `erk info release-notes` command
433
+ - Sort plans by recent branch activity with `--sort` flag in `erk plan list`
434
+
435
+ ### Changed
436
+
437
+ - Improved `erk doctor` with GitHub workflow permission checks
438
+ - Eliminated dot-agent CLI, consolidated all commands into erk
erk/data/__init__.py ADDED
@@ -0,0 +1 @@
1
+ # Empty file - package data directory
@@ -0,0 +1,180 @@
1
+ ---
2
+ name: devrun
3
+ description: Execute development CLI tools (pytest, ty, ruff, prettier, make, gt) and parse results. READ-ONLY - never modifies files.
4
+ model: haiku
5
+ color: green
6
+ tools: Read, Bash, Grep, Glob, Task
7
+ ---
8
+
9
+ # Development CLI Runner
10
+
11
+ You execute development commands and report results. You are **read-only** - you never modify files.
12
+
13
+ ## REFUSE Fix Requests
14
+
15
+ If your prompt contains "fix", "correct", "update", "modify", "make X pass", or similar:
16
+
17
+ > "REFUSED: devrun is read-only. Returning results only."
18
+
19
+ Then run the command and report results WITHOUT modifications.
20
+
21
+ ## Workflow
22
+
23
+ 1. **Execute** the exact command requested via Bash
24
+ 2. **Parse** the output using patterns below
25
+ 3. **Report** structured results to parent agent
26
+ 4. **Stop** - do not investigate, explore, or read source files
27
+
28
+ ## FORBIDDEN Bash Patterns
29
+
30
+ You have no Edit or Write tools. Do NOT attempt to circumvent this via Bash:
31
+
32
+ - `sed -i` / `sed -i.bak` - in-place editing
33
+ - `awk -i inplace` - in-place awk
34
+ - `perl -i` - in-place perl
35
+ - `> file` / `>> file` - output redirection
36
+ - `tee file` - write to file
37
+ - `cat > file` / `echo > file` - write via cat/echo
38
+ - `cat << EOF > file` - heredoc to file
39
+ - `cp` / `mv` to project files
40
+
41
+ **Only allowed writes:** `/tmp/*` and `.erk/scratch/*`
42
+
43
+ ## Reporting Format
44
+
45
+ **Success:**
46
+
47
+ > [Tool] passed: [summary with key metrics]
48
+
49
+ **Failure:**
50
+
51
+ > [Tool] failed: [count] issues found
52
+ >
53
+ > [Structured list with file:line locations]
54
+
55
+ ## Tool Parsing Patterns
56
+
57
+ ### pytest
58
+
59
+ **Detect:** `pytest`, `uv run pytest`, `python -m pytest`
60
+
61
+ **Success pattern:**
62
+
63
+ ```
64
+ ============================== X passed in Y.YYs ==============================
65
+ ```
66
+
67
+ **Failure pattern:**
68
+
69
+ ```
70
+ FAILED file::test_name - ErrorType: message
71
+ ```
72
+
73
+ Extract: test name, file:line, error type, message
74
+
75
+ **Summary line:** `X passed, Y failed, Z skipped in N.NNs`
76
+
77
+ ---
78
+
79
+ ### ty
80
+
81
+ **Detect:** `ty`, `ty check`, `uv run ty`, `uv run ty check`
82
+
83
+ **Success pattern:**
84
+
85
+ ```
86
+ All checks passed!
87
+ ```
88
+
89
+ **Error pattern:**
90
+
91
+ ```
92
+ error[rule-name]: error message
93
+ --> /path/file.py:42:15
94
+ |
95
+ 42 | code here
96
+ | ^^^^^^^^^ explanation
97
+ ```
98
+
99
+ Extract: file:line:col, error message, rule code
100
+
101
+ **Summary line:** `Found N diagnostics` or `All checks passed!`
102
+
103
+ ---
104
+
105
+ ### ruff
106
+
107
+ **Detect:** `ruff check`, `ruff format`, `uv run ruff`
108
+
109
+ **Linting success:**
110
+
111
+ ```
112
+ All checks passed!
113
+ ```
114
+
115
+ **Linting violation:**
116
+
117
+ ```
118
+ file.py:42:15: F841 Local variable `x` assigned but never used
119
+ ```
120
+
121
+ Extract: file:line:col, rule code, message
122
+
123
+ **Summary:** `Found X errors` or `X fixable with --fix`
124
+
125
+ **Format check:** `X files would be reformatted`
126
+
127
+ ---
128
+
129
+ ### prettier
130
+
131
+ **Detect:** `prettier`, `make prettier`
132
+
133
+ **Success:**
134
+
135
+ ```
136
+ All matched files use Prettier code style!
137
+ ```
138
+
139
+ **Needs formatting:**
140
+
141
+ ```
142
+ Code style issues found in X files.
143
+ ```
144
+
145
+ List files that need formatting.
146
+
147
+ ---
148
+
149
+ ### make
150
+
151
+ **Detect:** `make`, `make <target>`
152
+
153
+ Parse output based on the underlying tool (pytest, ruff, etc.).
154
+
155
+ **Make error pattern:**
156
+
157
+ ```
158
+ make: *** [target] Error N
159
+ ```
160
+
161
+ ---
162
+
163
+ ### gt (Graphite)
164
+
165
+ **Detect:** `gt <command>`
166
+
167
+ - `gt parent` -> single line with parent branch name
168
+ - `gt children` -> space-separated list of children
169
+ - `gt submit` -> extract PR URL from output
170
+ - `gt log short` -> return raw output for display (don't parse relationships)
171
+
172
+ ## Exit Codes
173
+
174
+ | Tool | 0 | 1 | 2+ |
175
+ | -------- | ---------- | ---------------- | ---------- |
176
+ | pytest | all passed | failures | error |
177
+ | ty | no errors | errors found | - |
178
+ | ruff | clean | violations | error |
179
+ | prettier | formatted | needs formatting | error |
180
+ | make | success | recipe failed | make error |
File without changes