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.
- erk/__init__.py +12 -0
- erk/__main__.py +6 -0
- erk/agent_docs/__init__.py +5 -0
- erk/agent_docs/models.py +123 -0
- erk/agent_docs/operations.py +666 -0
- erk/artifacts/__init__.py +5 -0
- erk/artifacts/artifact_health.py +623 -0
- erk/artifacts/detection.py +16 -0
- erk/artifacts/discovery.py +343 -0
- erk/artifacts/models.py +63 -0
- erk/artifacts/staleness.py +56 -0
- erk/artifacts/state.py +100 -0
- erk/artifacts/sync.py +624 -0
- erk/cli/__init__.py +0 -0
- erk/cli/activation.py +132 -0
- erk/cli/alias.py +53 -0
- erk/cli/cli.py +221 -0
- erk/cli/commands/__init__.py +0 -0
- erk/cli/commands/admin.py +153 -0
- erk/cli/commands/artifact/__init__.py +1 -0
- erk/cli/commands/artifact/check.py +260 -0
- erk/cli/commands/artifact/group.py +31 -0
- erk/cli/commands/artifact/list_cmd.py +89 -0
- erk/cli/commands/artifact/show.py +62 -0
- erk/cli/commands/artifact/sync_cmd.py +39 -0
- erk/cli/commands/branch/__init__.py +26 -0
- erk/cli/commands/branch/assign_cmd.py +152 -0
- erk/cli/commands/branch/checkout_cmd.py +357 -0
- erk/cli/commands/branch/create_cmd.py +161 -0
- erk/cli/commands/branch/list_cmd.py +82 -0
- erk/cli/commands/branch/unassign_cmd.py +197 -0
- erk/cli/commands/cc/__init__.py +15 -0
- erk/cli/commands/cc/jsonl_cmd.py +20 -0
- erk/cli/commands/cc/session/AGENTS.md +30 -0
- erk/cli/commands/cc/session/CLAUDE.md +1 -0
- erk/cli/commands/cc/session/__init__.py +15 -0
- erk/cli/commands/cc/session/list_cmd.py +167 -0
- erk/cli/commands/cc/session/show_cmd.py +175 -0
- erk/cli/commands/completion.py +89 -0
- erk/cli/commands/completions.py +165 -0
- erk/cli/commands/config.py +327 -0
- erk/cli/commands/docs/__init__.py +1 -0
- erk/cli/commands/docs/group.py +16 -0
- erk/cli/commands/docs/sync.py +121 -0
- erk/cli/commands/docs/validate.py +102 -0
- erk/cli/commands/doctor.py +243 -0
- erk/cli/commands/down.py +171 -0
- erk/cli/commands/exec/__init__.py +1 -0
- erk/cli/commands/exec/group.py +164 -0
- erk/cli/commands/exec/scripts/AGENTS.md +79 -0
- erk/cli/commands/exec/scripts/CLAUDE.md +1 -0
- erk/cli/commands/exec/scripts/__init__.py +5 -0
- erk/cli/commands/exec/scripts/add_reaction_to_comment.py +69 -0
- erk/cli/commands/exec/scripts/add_remote_execution_note.py +68 -0
- erk/cli/commands/exec/scripts/check_impl.py +152 -0
- erk/cli/commands/exec/scripts/ci_update_pr_body.py +294 -0
- erk/cli/commands/exec/scripts/create_extraction_branch.py +138 -0
- erk/cli/commands/exec/scripts/create_extraction_plan.py +242 -0
- erk/cli/commands/exec/scripts/create_issue_from_session.py +103 -0
- erk/cli/commands/exec/scripts/create_plan_from_context.py +103 -0
- erk/cli/commands/exec/scripts/create_worker_impl_from_issue.py +93 -0
- erk/cli/commands/exec/scripts/detect_trunk_branch.py +121 -0
- erk/cli/commands/exec/scripts/exit_plan_mode_hook.py +777 -0
- erk/cli/commands/exec/scripts/extract_latest_plan.py +49 -0
- erk/cli/commands/exec/scripts/extract_session_from_issue.py +150 -0
- erk/cli/commands/exec/scripts/find_project_dir.py +214 -0
- erk/cli/commands/exec/scripts/generate_pr_summary.py +112 -0
- erk/cli/commands/exec/scripts/get_closing_text.py +98 -0
- erk/cli/commands/exec/scripts/get_embedded_prompt.py +62 -0
- erk/cli/commands/exec/scripts/get_plan_metadata.py +95 -0
- erk/cli/commands/exec/scripts/get_pr_body_footer.py +70 -0
- erk/cli/commands/exec/scripts/get_pr_discussion_comments.py +149 -0
- erk/cli/commands/exec/scripts/get_pr_review_comments.py +155 -0
- erk/cli/commands/exec/scripts/impl_init.py +158 -0
- erk/cli/commands/exec/scripts/impl_signal.py +375 -0
- erk/cli/commands/exec/scripts/impl_verify.py +49 -0
- erk/cli/commands/exec/scripts/issue_title_to_filename.py +34 -0
- erk/cli/commands/exec/scripts/list_sessions.py +296 -0
- erk/cli/commands/exec/scripts/mark_impl_ended.py +188 -0
- erk/cli/commands/exec/scripts/mark_impl_started.py +188 -0
- erk/cli/commands/exec/scripts/marker.py +163 -0
- erk/cli/commands/exec/scripts/objective_save_to_issue.py +109 -0
- erk/cli/commands/exec/scripts/plan_save_to_issue.py +269 -0
- erk/cli/commands/exec/scripts/plan_update_issue.py +147 -0
- erk/cli/commands/exec/scripts/post_extraction_comment.py +237 -0
- erk/cli/commands/exec/scripts/post_or_update_pr_summary.py +133 -0
- erk/cli/commands/exec/scripts/post_pr_inline_comment.py +143 -0
- erk/cli/commands/exec/scripts/post_workflow_started_comment.py +168 -0
- erk/cli/commands/exec/scripts/preprocess_session.py +777 -0
- erk/cli/commands/exec/scripts/quick_submit.py +32 -0
- erk/cli/commands/exec/scripts/rebase_with_conflict_resolution.py +260 -0
- erk/cli/commands/exec/scripts/reply_to_discussion_comment.py +173 -0
- erk/cli/commands/exec/scripts/resolve_review_thread.py +170 -0
- erk/cli/commands/exec/scripts/session_id_injector_hook.py +52 -0
- erk/cli/commands/exec/scripts/setup_impl_from_issue.py +159 -0
- erk/cli/commands/exec/scripts/slot_objective.py +102 -0
- erk/cli/commands/exec/scripts/tripwires_reminder_hook.py +20 -0
- erk/cli/commands/exec/scripts/update_dispatch_info.py +116 -0
- erk/cli/commands/exec/scripts/user_prompt_hook.py +113 -0
- erk/cli/commands/exec/scripts/validate_plan_content.py +98 -0
- erk/cli/commands/exec/scripts/wrap_plan_in_metadata_block.py +34 -0
- erk/cli/commands/implement.py +695 -0
- erk/cli/commands/implement_shared.py +649 -0
- erk/cli/commands/info/__init__.py +14 -0
- erk/cli/commands/info/release_notes_cmd.py +128 -0
- erk/cli/commands/init.py +801 -0
- erk/cli/commands/land_cmd.py +690 -0
- erk/cli/commands/log_cmd.py +137 -0
- erk/cli/commands/md/__init__.py +5 -0
- erk/cli/commands/md/check.py +118 -0
- erk/cli/commands/md/group.py +14 -0
- erk/cli/commands/navigation_helpers.py +430 -0
- erk/cli/commands/objective/__init__.py +16 -0
- erk/cli/commands/objective/list_cmd.py +47 -0
- erk/cli/commands/objective_helpers.py +132 -0
- erk/cli/commands/plan/__init__.py +32 -0
- erk/cli/commands/plan/check_cmd.py +174 -0
- erk/cli/commands/plan/close_cmd.py +69 -0
- erk/cli/commands/plan/create_cmd.py +120 -0
- erk/cli/commands/plan/docs/__init__.py +18 -0
- erk/cli/commands/plan/docs/extract_cmd.py +53 -0
- erk/cli/commands/plan/docs/unextract_cmd.py +38 -0
- erk/cli/commands/plan/docs/unextracted_cmd.py +72 -0
- erk/cli/commands/plan/extraction/__init__.py +16 -0
- erk/cli/commands/plan/extraction/complete_cmd.py +101 -0
- erk/cli/commands/plan/extraction/create_raw_cmd.py +63 -0
- erk/cli/commands/plan/get.py +71 -0
- erk/cli/commands/plan/list_cmd.py +754 -0
- erk/cli/commands/plan/log_cmd.py +440 -0
- erk/cli/commands/plan/start_cmd.py +459 -0
- erk/cli/commands/planner/__init__.py +40 -0
- erk/cli/commands/planner/configure_cmd.py +73 -0
- erk/cli/commands/planner/connect_cmd.py +96 -0
- erk/cli/commands/planner/create_cmd.py +148 -0
- erk/cli/commands/planner/list_cmd.py +51 -0
- erk/cli/commands/planner/register_cmd.py +105 -0
- erk/cli/commands/planner/set_default_cmd.py +23 -0
- erk/cli/commands/planner/unregister_cmd.py +43 -0
- erk/cli/commands/pr/__init__.py +23 -0
- erk/cli/commands/pr/check_cmd.py +112 -0
- erk/cli/commands/pr/checkout_cmd.py +165 -0
- erk/cli/commands/pr/fix_conflicts_cmd.py +82 -0
- erk/cli/commands/pr/parse_pr_reference.py +10 -0
- erk/cli/commands/pr/submit_cmd.py +360 -0
- erk/cli/commands/pr/sync_cmd.py +181 -0
- erk/cli/commands/prepare_cwd_recovery.py +60 -0
- erk/cli/commands/project/__init__.py +16 -0
- erk/cli/commands/project/init_cmd.py +91 -0
- erk/cli/commands/run/__init__.py +17 -0
- erk/cli/commands/run/list_cmd.py +189 -0
- erk/cli/commands/run/logs_cmd.py +54 -0
- erk/cli/commands/run/shared.py +19 -0
- erk/cli/commands/shell_integration.py +29 -0
- erk/cli/commands/slot/__init__.py +23 -0
- erk/cli/commands/slot/check_cmd.py +277 -0
- erk/cli/commands/slot/common.py +314 -0
- erk/cli/commands/slot/init_pool_cmd.py +157 -0
- erk/cli/commands/slot/list_cmd.py +228 -0
- erk/cli/commands/slot/repair_cmd.py +190 -0
- erk/cli/commands/stack/__init__.py +23 -0
- erk/cli/commands/stack/consolidate_cmd.py +470 -0
- erk/cli/commands/stack/list_cmd.py +79 -0
- erk/cli/commands/stack/move_cmd.py +309 -0
- erk/cli/commands/stack/split_old/README.md +64 -0
- erk/cli/commands/stack/split_old/__init__.py +5 -0
- erk/cli/commands/stack/split_old/command.py +233 -0
- erk/cli/commands/stack/split_old/display.py +116 -0
- erk/cli/commands/stack/split_old/plan.py +216 -0
- erk/cli/commands/status.py +58 -0
- erk/cli/commands/submit.py +768 -0
- erk/cli/commands/up.py +154 -0
- erk/cli/commands/upgrade.py +82 -0
- erk/cli/commands/wt/__init__.py +29 -0
- erk/cli/commands/wt/checkout_cmd.py +110 -0
- erk/cli/commands/wt/create_cmd.py +998 -0
- erk/cli/commands/wt/current_cmd.py +35 -0
- erk/cli/commands/wt/delete_cmd.py +573 -0
- erk/cli/commands/wt/list_cmd.py +332 -0
- erk/cli/commands/wt/rename_cmd.py +66 -0
- erk/cli/config.py +242 -0
- erk/cli/constants.py +29 -0
- erk/cli/core.py +65 -0
- erk/cli/debug.py +9 -0
- erk/cli/ensure-conversion-tasks.md +288 -0
- erk/cli/ensure.py +628 -0
- erk/cli/github_parsing.py +96 -0
- erk/cli/graphite.py +81 -0
- erk/cli/graphite_command.py +80 -0
- erk/cli/help_formatter.py +345 -0
- erk/cli/output.py +361 -0
- erk/cli/presets/dagster.toml +12 -0
- erk/cli/presets/generic.toml +12 -0
- erk/cli/prompt_hooks_templates/README.md +68 -0
- erk/cli/script_output.py +32 -0
- erk/cli/shell_integration/bash_wrapper.sh +32 -0
- erk/cli/shell_integration/fish_wrapper.fish +39 -0
- erk/cli/shell_integration/handler.py +338 -0
- erk/cli/shell_integration/zsh_wrapper.sh +32 -0
- erk/cli/shell_utils.py +171 -0
- erk/cli/subprocess_utils.py +92 -0
- erk/cli/uvx_detection.py +59 -0
- erk/core/__init__.py +0 -0
- erk/core/claude_executor.py +511 -0
- erk/core/claude_settings.py +317 -0
- erk/core/command_log.py +406 -0
- erk/core/commit_message_generator.py +234 -0
- erk/core/completion.py +10 -0
- erk/core/consolidation_utils.py +177 -0
- erk/core/context.py +570 -0
- erk/core/display/__init__.py +4 -0
- erk/core/display/abc.py +24 -0
- erk/core/display/real.py +30 -0
- erk/core/display_utils.py +526 -0
- erk/core/file_utils.py +87 -0
- erk/core/health_checks.py +1315 -0
- erk/core/health_checks_dogfooder/__init__.py +85 -0
- erk/core/health_checks_dogfooder/deprecated_dot_agent_config.py +64 -0
- erk/core/health_checks_dogfooder/legacy_claude_docs.py +69 -0
- erk/core/health_checks_dogfooder/legacy_config_locations.py +122 -0
- erk/core/health_checks_dogfooder/legacy_erk_docs_agent.py +61 -0
- erk/core/health_checks_dogfooder/legacy_erk_kits_folder.py +60 -0
- erk/core/health_checks_dogfooder/legacy_hook_settings.py +104 -0
- erk/core/health_checks_dogfooder/legacy_kit_yaml.py +78 -0
- erk/core/health_checks_dogfooder/legacy_kits_toml.py +43 -0
- erk/core/health_checks_dogfooder/outdated_erk_skill.py +43 -0
- erk/core/implementation_queue/__init__.py +1 -0
- erk/core/implementation_queue/github/__init__.py +8 -0
- erk/core/implementation_queue/github/abc.py +7 -0
- erk/core/implementation_queue/github/noop.py +38 -0
- erk/core/implementation_queue/github/printing.py +43 -0
- erk/core/implementation_queue/github/real.py +119 -0
- erk/core/init_utils.py +227 -0
- erk/core/output_filter.py +338 -0
- erk/core/plan_store/__init__.py +6 -0
- erk/core/planner/__init__.py +1 -0
- erk/core/planner/registry_abc.py +8 -0
- erk/core/planner/registry_fake.py +129 -0
- erk/core/planner/registry_real.py +195 -0
- erk/core/planner/types.py +7 -0
- erk/core/pr_utils.py +30 -0
- erk/core/release_notes.py +263 -0
- erk/core/repo_discovery.py +126 -0
- erk/core/script_writer.py +41 -0
- erk/core/services/__init__.py +1 -0
- erk/core/services/plan_list_service.py +94 -0
- erk/core/shell.py +51 -0
- erk/core/user_feedback.py +11 -0
- erk/core/version_check.py +55 -0
- erk/core/workflow_display.py +75 -0
- erk/core/worktree_pool.py +190 -0
- erk/core/worktree_utils.py +300 -0
- erk/data/CHANGELOG.md +438 -0
- erk/data/__init__.py +1 -0
- erk/data/claude/agents/devrun.md +180 -0
- erk/data/claude/commands/erk/__init__.py +0 -0
- erk/data/claude/commands/erk/create-extraction-plan.md +360 -0
- erk/data/claude/commands/erk/fix-conflicts.md +25 -0
- erk/data/claude/commands/erk/git-pr-push.md +345 -0
- erk/data/claude/commands/erk/implement-stacked-plan.md +96 -0
- erk/data/claude/commands/erk/land.md +193 -0
- erk/data/claude/commands/erk/objective-create.md +370 -0
- erk/data/claude/commands/erk/objective-list.md +34 -0
- erk/data/claude/commands/erk/objective-next-plan.md +220 -0
- erk/data/claude/commands/erk/objective-update-with-landed-pr.md +216 -0
- erk/data/claude/commands/erk/plan-implement.md +202 -0
- erk/data/claude/commands/erk/plan-save.md +45 -0
- erk/data/claude/commands/erk/plan-submit.md +39 -0
- erk/data/claude/commands/erk/pr-address.md +367 -0
- erk/data/claude/commands/erk/pr-submit.md +58 -0
- erk/data/claude/skills/dignified-python/SKILL.md +48 -0
- erk/data/claude/skills/dignified-python/cli-patterns.md +155 -0
- erk/data/claude/skills/dignified-python/dignified-python-core.md +1190 -0
- erk/data/claude/skills/dignified-python/subprocess.md +99 -0
- erk/data/claude/skills/dignified-python/versions/python-3.10.md +517 -0
- erk/data/claude/skills/dignified-python/versions/python-3.11.md +536 -0
- erk/data/claude/skills/dignified-python/versions/python-3.12.md +662 -0
- erk/data/claude/skills/dignified-python/versions/python-3.13.md +653 -0
- erk/data/claude/skills/erk-diff-analysis/SKILL.md +27 -0
- erk/data/claude/skills/erk-diff-analysis/references/commit-message-prompt.md +78 -0
- erk/data/claude/skills/learned-docs/SKILL.md +362 -0
- erk/data/github/actions/setup-claude-erk/action.yml +11 -0
- erk/data/github/prompts/dignified-python-review.md +125 -0
- erk/data/github/workflows/dignified-python-review.yml +61 -0
- erk/data/github/workflows/erk-impl.yml +251 -0
- erk/hooks/__init__.py +1 -0
- erk/hooks/decorators.py +319 -0
- erk/status/__init__.py +8 -0
- erk/status/collectors/__init__.py +9 -0
- erk/status/collectors/base.py +52 -0
- erk/status/collectors/git.py +76 -0
- erk/status/collectors/github.py +81 -0
- erk/status/collectors/graphite.py +80 -0
- erk/status/collectors/impl.py +145 -0
- erk/status/models/__init__.py +4 -0
- erk/status/models/status_data.py +404 -0
- erk/status/orchestrator.py +169 -0
- erk/status/renderers/__init__.py +5 -0
- erk/status/renderers/simple.py +322 -0
- erk/tui/AGENTS.md +193 -0
- erk/tui/CLAUDE.md +1 -0
- erk/tui/__init__.py +1 -0
- erk/tui/app.py +1404 -0
- erk/tui/commands/__init__.py +1 -0
- erk/tui/commands/executor.py +66 -0
- erk/tui/commands/provider.py +165 -0
- erk/tui/commands/real_executor.py +63 -0
- erk/tui/commands/registry.py +121 -0
- erk/tui/commands/types.py +36 -0
- erk/tui/data/__init__.py +1 -0
- erk/tui/data/provider.py +492 -0
- erk/tui/data/types.py +104 -0
- erk/tui/filtering/__init__.py +1 -0
- erk/tui/filtering/logic.py +43 -0
- erk/tui/filtering/types.py +55 -0
- erk/tui/jsonl_viewer/__init__.py +1 -0
- erk/tui/jsonl_viewer/app.py +61 -0
- erk/tui/jsonl_viewer/models.py +208 -0
- erk/tui/jsonl_viewer/widgets.py +204 -0
- erk/tui/sorting/__init__.py +6 -0
- erk/tui/sorting/logic.py +55 -0
- erk/tui/sorting/types.py +68 -0
- erk/tui/styles/dash.tcss +95 -0
- erk/tui/widgets/__init__.py +1 -0
- erk/tui/widgets/command_output.py +112 -0
- erk/tui/widgets/plan_table.py +276 -0
- erk/tui/widgets/status_bar.py +116 -0
- erk-0.4.5.dist-info/METADATA +376 -0
- erk-0.4.5.dist-info/RECORD +331 -0
- erk-0.4.5.dist-info/WHEEL +4 -0
- erk-0.4.5.dist-info/entry_points.txt +2 -0
- 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)
|