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,216 @@
1
+ ---
2
+ description: Update objective issue after landing a PR
3
+ ---
4
+
5
+ # /erk:objective-update-with-landed-pr
6
+
7
+ Update an objective issue after landing a PR from a plan branch.
8
+
9
+ ## Usage
10
+
11
+ Run after landing a PR:
12
+
13
+ ```bash
14
+ /erk:objective-update-with-landed-pr
15
+ ```
16
+
17
+ ---
18
+
19
+ ## Agent Instructions
20
+
21
+ ### Step 0: Parse Arguments (if provided)
22
+
23
+ Check `$ARGUMENTS` for pre-provided context:
24
+
25
+ - `--pr <number>`: PR number that was just landed
26
+ - `--objective <number>`: Objective issue number to update
27
+ - `--branch <name>`: Original branch name (contains plan issue number in `P<number>-...` pattern)
28
+ - `--auto-close`: If set and all steps are complete, close objective without asking
29
+
30
+ **If all arguments are provided:** Use them directly. Parse the plan issue number from the branch name pattern to get implementation details. Skip Steps 1 and 4 (discovery steps).
31
+
32
+ **If arguments are not provided:** Continue with Steps 1 and 4 to discover from git state (manual invocation case).
33
+
34
+ ### Step 1: Get Current Branch and Find Parent Objective
35
+
36
+ **Skip this step if `--objective` was provided in arguments.**
37
+
38
+ ```bash
39
+ git branch --show-current
40
+ ```
41
+
42
+ Parse the plan issue number from the branch name pattern `P<number>-...`
43
+
44
+ Example: `P3679-phase-1b-implement-fakes` -> Plan Issue #3679
45
+
46
+ **Important:** The branch pattern `P<number>-...` points to an **erk-plan** issue, not the objective. After getting the plan issue number:
47
+
48
+ 1. Read the plan issue: `gh issue view <plan-number>`
49
+ 2. Find the parent objective reference (look for "Objective: #XXXX" or "[#XXXX]" link in the body)
50
+ 3. Use the objective issue number for all subsequent steps
51
+
52
+ If the branch doesn't match the pattern:
53
+
54
+ 1. Ask the user for the objective issue number
55
+ 2. Use AskUserQuestion tool with options like "#3679", "#3680", or "Other"
56
+
57
+ If the plan issue has no objective reference, ask the user which objective to update.
58
+
59
+ ### Step 2: Load Objective Skill
60
+
61
+ Load the `objective` skill for format templates and guidelines.
62
+
63
+ ### Step 3: Read Current Objective State
64
+
65
+ ```bash
66
+ gh issue view <issue-number>
67
+ ```
68
+
69
+ Analyze the objective to identify:
70
+
71
+ - Current roadmap structure (phases and steps)
72
+ - Which phase/steps this PR likely completed
73
+ - Current status of all steps
74
+ - What "Current Focus" says
75
+
76
+ ### Step 4: Get PR Information
77
+
78
+ **Skip this step if `--pr` was provided in arguments.**
79
+
80
+ Find the most recently merged PR for this branch:
81
+
82
+ ```bash
83
+ gh pr list --state merged --head <branch-name> --limit 1 --json number,title,url
84
+ ```
85
+
86
+ If no merged PR is found:
87
+
88
+ - Ask user if they want to specify a PR number
89
+ - Or proceed without PR reference
90
+
91
+ ### Step 5: Post Action Comment
92
+
93
+ Post an action comment using the objective skill template.
94
+
95
+ **Template:**
96
+
97
+ ```markdown
98
+ ## Action: [Brief title - what was accomplished]
99
+
100
+ **Date:** YYYY-MM-DD
101
+ **PR:** #<pr-number>
102
+ **Phase/Step:** <phase.step>
103
+
104
+ ### What Was Done
105
+
106
+ - [Concrete action 1]
107
+ - [Concrete action 2]
108
+
109
+ ### Lessons Learned
110
+
111
+ - [Insight that should inform future work]
112
+
113
+ ### Roadmap Updates
114
+
115
+ - Step X.Y: pending -> done
116
+ ```
117
+
118
+ **Inferring content (DO NOT ask the user):**
119
+
120
+ - **What Was Done:** Infer from PR title, PR description, and commit messages. The plan issue body contains the implementation plan with specific steps - use this to understand what was accomplished.
121
+ - **Lessons Learned:** Infer from implementation patterns, architectural decisions made, or any non-obvious approaches taken. If the implementation was straightforward with no surprises, note what pattern worked well.
122
+ - Be concrete and specific based on available context
123
+
124
+ Use:
125
+
126
+ ```bash
127
+ gh issue comment <issue-number> --body "$(cat <<'EOF'
128
+ [action comment content]
129
+ EOF
130
+ )"
131
+ ```
132
+
133
+ ### Step 6: Update Objective Body
134
+
135
+ After posting the action comment, update the issue body to reflect the new state.
136
+
137
+ **Updates to make:**
138
+
139
+ 1. **Roadmap tables:** Change step statuses from `pending` to `done`
140
+ 2. **PR links:** Add the PR number to completed steps
141
+ 3. **Current Focus:** Update "Next action" to reflect what should happen next
142
+
143
+ **How to update:**
144
+
145
+ 1. Fetch current body: `gh issue view <issue-number> --json body -q '.body'`
146
+ 2. Make the edits (status changes, PR links, Current Focus)
147
+ 3. Update: `gh issue edit <issue-number> --body "$(cat <<'EOF' ... EOF)"`
148
+
149
+ ### Step 7: Check Closing Triggers
150
+
151
+ **After updating, check if the objective should be closed.**
152
+
153
+ Count the roadmap steps:
154
+
155
+ - Total steps
156
+ - Steps with status `done` or `skipped`
157
+ - Steps with status `pending` or `blocked`
158
+
159
+ **If ALL steps are `done` or `skipped`:**
160
+
161
+ **If `--auto-close` was provided:**
162
+
163
+ 1. Post a final "Action: Objective Complete" comment with summary
164
+ 2. Close the issue: `gh issue close <issue-number>`
165
+ 3. Report: "All steps complete - objective closed automatically"
166
+
167
+ **Otherwise (interactive mode):**
168
+
169
+ Ask the user:
170
+
171
+ ```
172
+ All roadmap steps are complete. Should I close objective #<number> now?
173
+ - Yes, close with final summary
174
+ - Not yet, there may be follow-up work
175
+ - I'll close it manually later
176
+ ```
177
+
178
+ **If user says yes:**
179
+
180
+ 1. Post a final "Action: Objective Complete" comment with summary
181
+ 2. Close the issue: `gh issue close <issue-number>`
182
+
183
+ **If not all steps are complete:**
184
+
185
+ Report the update is done and what the next focus should be.
186
+
187
+ ---
188
+
189
+ ## Output Format
190
+
191
+ - **Start:** "Updating objective #<number> after landing PR #<pr-number>"
192
+ - **After action comment:** "Posted action comment to #<number>"
193
+ - **After body update:** "Updated objective body - marked step X.Y as done"
194
+ - **End:** Either "Objective #<number> closed" or "Objective updated. Next focus: [next action]"
195
+ - **Always:** Display the objective URL: `https://github.com/<owner>/<repo>/issues/<number>`
196
+
197
+ ---
198
+
199
+ ## Error Cases
200
+
201
+ | Scenario | Action |
202
+ | ---------------------------------- | -------------------------------------------- |
203
+ | Branch doesn't match pattern | Ask user for issue number |
204
+ | Plan has no objective reference | Ask user which objective to update |
205
+ | No merged PR found | Ask if user wants to specify a PR number |
206
+ | Issue not found | Report error and exit |
207
+ | Issue has no `erk-objective` label | Warn user this may not be an objective issue |
208
+
209
+ ---
210
+
211
+ ## Important Notes
212
+
213
+ - **Two-step workflow:** Always post action comment FIRST, then update body
214
+ - **Lessons are mandatory:** Every action comment must include lessons learned
215
+ - **Be specific:** "Fixed auth flow" not "Made improvements"
216
+ - **Check closing triggers:** Don't let objectives linger in "ready to close" state
@@ -0,0 +1,202 @@
1
+ ---
2
+ description: Save plan to GitHub and execute implementation in current worktree
3
+ ---
4
+
5
+ # /erk:plan-implement
6
+
7
+ User-facing command to save a plan to GitHub and immediately implement it.
8
+
9
+ This is the primary implementation workflow - it orchestrates:
10
+
11
+ 1. Saving the plan to GitHub as an issue
12
+ 2. Setting up the `.impl/` folder
13
+ 3. Executing the implementation
14
+
15
+ ## Prerequisites
16
+
17
+ - Must be in a git repository managed by erk
18
+ - Must have a plan in `~/.claude/plans/` (from plan mode)
19
+ - GitHub CLI (`gh`) must be authenticated
20
+
21
+ ## When NOT to Use This Command
22
+
23
+ ❌ **After `/erk:plan-save`** - The plan is already saved to GitHub. Use:
24
+
25
+ - `erk implement <issue-number>` - CLI command to fetch and implement
26
+ - `/erk:plan-implement-here <issue-number>` - Slash command alternative
27
+
28
+ ❌ **When implementing an existing GitHub issue** - Use the commands above instead.
29
+
30
+ ✅ **Use this command when**: You just finished planning in plan mode and want to immediately implement (save + implement in one step).
31
+
32
+ ---
33
+
34
+ ## Agent Instructions
35
+
36
+ ### Step 1: Check if .impl/ Already Set Up
37
+
38
+ First, check if implementation is already set up (e.g., from `erk implement <issue>`):
39
+
40
+ ```bash
41
+ erk exec impl-init --json
42
+ ```
43
+
44
+ If this succeeds with `"valid": true` and `"has_issue_tracking": true`, the `.impl/` folder is already configured. **Skip directly to Step 4** (Read Plan and Load Context).
45
+
46
+ If it fails or returns `"valid": false`, continue to Step 2 to save the plan.
47
+
48
+ ### Step 2: Extract Session ID
49
+
50
+ Get the session ID from the `SESSION_CONTEXT` reminder in your conversation context.
51
+
52
+ ### Step 3: Save Plan to GitHub
53
+
54
+ Save the current plan to GitHub and capture the issue number:
55
+
56
+ ```bash
57
+ erk exec plan-save-to-issue --format json --session-id="<session-id>"
58
+ ```
59
+
60
+ Parse the JSON output to get:
61
+
62
+ - `issue_number`: The created issue number
63
+ - `title`: The issue title (for branch naming)
64
+
65
+ If this fails, display the error and stop.
66
+
67
+ ### Step 3b: Create Branch and Setup .impl/
68
+
69
+ Now set up the implementation environment using the saved issue:
70
+
71
+ ```bash
72
+ erk exec setup-impl-from-issue <issue-number>
73
+ ```
74
+
75
+ This command:
76
+
77
+ - Creates a feature branch from current branch (stacked) or trunk
78
+ - Checks out the new branch in the current worktree
79
+ - Creates `.impl/` folder with the plan content
80
+ - Saves issue reference for PR linking
81
+
82
+ If this fails, display the error and stop.
83
+
84
+ ### Step 3c: Re-run Implementation Initialization
85
+
86
+ Run impl-init again now that .impl/ is set up:
87
+
88
+ ```bash
89
+ erk exec impl-init --json
90
+ ```
91
+
92
+ Use the returned `phases` for TodoWrite entries. If validation fails, display error and stop.
93
+
94
+ ### Step 4: Read Plan and Load Context
95
+
96
+ Read `.impl/plan.md` to understand:
97
+
98
+ - Overall goal and context
99
+ - Context & Understanding sections (API quirks, architectural insights, pitfalls)
100
+ - Implementation phases and dependencies
101
+ - Success criteria
102
+
103
+ **Context Consumption**: Plans contain expensive discoveries. Ignoring `[CRITICAL:]` tags, "Related Context:" subsections, or "DO NOT" items causes repeated mistakes.
104
+
105
+ ### Step 5: Load Related Documentation
106
+
107
+ If plan contains "Related Documentation" section, load listed skills via Skill tool and read listed docs.
108
+
109
+ ### Step 6: Create TodoWrite Entries
110
+
111
+ Create todo entries for each phase from impl-init output.
112
+
113
+ ### Step 7: Signal GitHub Started
114
+
115
+ ```bash
116
+ erk exec impl-signal started --session-id="<session-id>" 2>/dev/null || true
117
+ ```
118
+
119
+ This also deletes the Claude plan file (from `~/.claude/plans/`) since:
120
+
121
+ - The content has been saved to GitHub issue
122
+ - The content has been snapshotted to `.erk/scratch/`
123
+ - Keeping it could cause confusion if the user tries to re-save
124
+
125
+ ### Step 8: Execute Each Phase Sequentially
126
+
127
+ For each phase:
128
+
129
+ 1. **Mark phase as in_progress** (in TodoWrite)
130
+ 2. **Read task requirements** carefully
131
+ 3. **Implement code AND tests together**:
132
+ - Load `dignified-python-313` skill for coding standards
133
+ - Load `fake-driven-testing` skill for test patterns
134
+ - Follow project AGENTS.md standards
135
+ 4. **Mark phase as completed** (in TodoWrite)
136
+ 5. **Report progress**: changes made, what's next
137
+
138
+ **Important:** `.impl/plan.md` is immutable - NEVER edit during implementation
139
+
140
+ ### Step 9: Report Progress
141
+
142
+ After each phase: report changes made and what's next.
143
+
144
+ ### Step 10: Final Verification
145
+
146
+ Confirm all tasks executed, success criteria met, note deviations, summarize changes.
147
+
148
+ ### Step 11: Signal GitHub Ended
149
+
150
+ ```bash
151
+ erk exec impl-signal ended 2>/dev/null || true
152
+ ```
153
+
154
+ ### Step 12: Verify .impl/ Preserved
155
+
156
+ **CRITICAL GUARDRAIL**: Verify the .impl/ folder was NOT deleted.
157
+
158
+ ```bash
159
+ erk exec impl-verify
160
+ ```
161
+
162
+ If this fails, you have violated instructions. The .impl/ folder must be preserved for user review.
163
+
164
+ ### Step 13: Run CI Iteratively
165
+
166
+ 1. If `.erk/prompt-hooks/post-plan-implement-ci.md` exists: follow its instructions
167
+ 2. Otherwise: check CLAUDE.md/AGENTS.md for CI commands
168
+
169
+ After CI passes:
170
+
171
+ - `.worker-impl/`: delete folder, commit cleanup, push
172
+ - `.impl/`: **NEVER DELETE** - leave for user review (no auto-commit)
173
+
174
+ ### Step 14: Create/Update PR (if .worker-impl/ present)
175
+
176
+ **Only if .worker-impl/ was present:**
177
+
178
+ ```bash
179
+ gh pr create --fill --label "ai-generated" || gh pr edit --add-label "ai-generated"
180
+ ```
181
+
182
+ Then validate PR rules:
183
+
184
+ ```bash
185
+ erk pr check
186
+ ```
187
+
188
+ If checks fail, display output and warn user.
189
+
190
+ ### Step 15: Output Format
191
+
192
+ - **Start**: "Saving plan and setting up implementation..."
193
+ - **After save**: "Plan saved as issue #X, setting up .impl/ folder..."
194
+ - **Each phase**: "Phase X: [brief description]" with code changes
195
+ - **End**: "Plan execution complete. [Summary]"
196
+
197
+ ---
198
+
199
+ ## Related Commands
200
+
201
+ - `/erk:plan-save` - Save plan only, don't implement (for defer-to-later workflow)
202
+ - `/erk:plan-implement-here` - Implement from existing GitHub issue (skips save step)
@@ -0,0 +1,45 @@
1
+ ---
2
+ description: Save the current session's plan to GitHub as an issue
3
+ ---
4
+
5
+ # /erk:plan-save
6
+
7
+ Save the current session's plan to GitHub as an issue with session context.
8
+
9
+ ## Issue Structure
10
+
11
+ The created issue has a specific structure:
12
+
13
+ - **Issue body**: Contains only the metadata header (schema version, timestamps, etc.)
14
+ - **First comment**: Contains the actual plan content
15
+
16
+ This separation keeps machine-readable metadata in the body while the human-readable plan is in the first comment.
17
+
18
+ ## Agent Instructions
19
+
20
+ ### Step 1: Extract Session ID
21
+
22
+ Get the session ID from the `SESSION_CONTEXT` reminder in your conversation context.
23
+
24
+ ### Step 2: Run Save Command
25
+
26
+ Run this command with the extracted session ID:
27
+
28
+ ```bash
29
+ erk exec plan-save-to-issue --format display --session-id="<session-id-from-step-1>"
30
+ ```
31
+
32
+ ### Step 3: Display Results
33
+
34
+ On success, **copy the command output exactly as printed**. This is critical:
35
+
36
+ - Do NOT paraphrase or summarize
37
+ - Do NOT add bullet points or change formatting
38
+ - Do NOT omit any lines (especially the `--dangerous` option)
39
+ - Show the output in a code block to preserve formatting
40
+
41
+ On failure, display the error message and suggest:
42
+
43
+ - Checking that a plan exists (enter Plan mode and exit it first)
44
+ - Verifying GitHub CLI authentication (`gh auth status`)
45
+ - Checking network connectivity
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: Submit the last created issue for remote implementation
3
+ ---
4
+
5
+ # /erk:plan-submit
6
+
7
+ ## Goal
8
+
9
+ Find the most recent GitHub issue created in this conversation and submit it for remote AI implementation via `erk plan submit`.
10
+
11
+ ## What This Command Does
12
+
13
+ 1. Search conversation for the last GitHub issue reference
14
+ 2. Extract the issue number
15
+ 3. Run `erk plan submit <issue_number>` to trigger remote implementation
16
+
17
+ ## Finding the Issue
18
+
19
+ Search the conversation from bottom to top for these patterns (in priority order):
20
+
21
+ 1. **plan-save/save-raw-plan output**: Look for `**Issue:** https://github.com/.../issues/<number>`
22
+ 2. **Issue URL**: `https://github.com/<owner>/<repo>/issues/<number>`
23
+
24
+ Extract the issue number from the most recent match.
25
+
26
+ ## Execution
27
+
28
+ Once you have the issue number, run:
29
+
30
+ ```bash
31
+ erk plan submit <issue_number>
32
+ ```
33
+
34
+ Display the command output to the user. The `erk plan submit` command handles all validation (issue existence, labels, state).
35
+
36
+ ## Error Cases
37
+
38
+ - **No issue found in conversation**: Report "No GitHub issue found in conversation. Run /erk:plan-save first to create an issue."
39
+ - **erk plan submit fails**: Display the error output from the command (erk plan submit validates the issue)