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,376 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: erk
|
|
3
|
+
Version: 0.4.5
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Author-email: Dagster Labs <hello@dagsterlabs.com>
|
|
6
|
+
License-File: LICENSE.md
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: click>=8.1.7
|
|
9
|
+
Requires-Dist: erk-shared
|
|
10
|
+
Requires-Dist: erk-statusline
|
|
11
|
+
Requires-Dist: packaging>=21.0
|
|
12
|
+
Requires-Dist: pathspec>=0.12.0
|
|
13
|
+
Requires-Dist: pydantic>=2.0
|
|
14
|
+
Requires-Dist: pyperclip>=1.8.2
|
|
15
|
+
Requires-Dist: python-frontmatter>=1.0.0
|
|
16
|
+
Requires-Dist: pyyaml>=6.0
|
|
17
|
+
Requires-Dist: rich>=13.0
|
|
18
|
+
Requires-Dist: textual-dev>=1.8.0
|
|
19
|
+
Requires-Dist: textual>=3.0.0
|
|
20
|
+
Requires-Dist: tomli-w>=1.0
|
|
21
|
+
Requires-Dist: tomli>=2.0
|
|
22
|
+
Requires-Dist: tomlkit>=0.12.0
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# erk
|
|
26
|
+
|
|
27
|
+
`erk` is a CLI tool for plan-oriented agentic engineering.
|
|
28
|
+
|
|
29
|
+
For the philosophy and design principles behind erk, see [The TAO of erk](TAO.md).
|
|
30
|
+
|
|
31
|
+
## User Setup
|
|
32
|
+
|
|
33
|
+
### Prerequisites
|
|
34
|
+
|
|
35
|
+
Ensure you have these tools installed:
|
|
36
|
+
|
|
37
|
+
- `python` (3.10+)
|
|
38
|
+
- `claude` - Claude Code CLI
|
|
39
|
+
- `uv` - Fast Python environment management
|
|
40
|
+
- `gt` - Graphite for stacked PRs
|
|
41
|
+
- `gh` - GitHub CLI
|
|
42
|
+
|
|
43
|
+
### Initialize Erk
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
erk init
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This command:
|
|
50
|
+
|
|
51
|
+
- Prompts for worktrees root directory (where all worktrees are stored)
|
|
52
|
+
- Creates global config at `~/.erk/config.toml`
|
|
53
|
+
- Detects Graphite (`gt`) availability for branch creation
|
|
54
|
+
- Creates repo-specific `config.toml` with preset selection (`auto`, `generic`, `dagster`)
|
|
55
|
+
- Offers to add `.env`, `.erk/scratch/`, and `.impl/` to `.gitignore`
|
|
56
|
+
- Shows shell integration setup instructions (completion + auto-activation)
|
|
57
|
+
|
|
58
|
+
### Shell Integration
|
|
59
|
+
|
|
60
|
+
`erk init` will display shell integration instructions to add to your `.zshrc` or `.bashrc`. Copy these instructions manually - erk doesn't modify your shell config automatically.
|
|
61
|
+
|
|
62
|
+
**Why manual setup?** Shell integration is essential for the core workflow: it enables commands such as `erk br co` and `erk wt co` to change your terminal's directory and activate the correct Python environment. Without it, these commands run in a subprocess and have no effect on your shell. We ask you to add it manually so you stay in control of your shell configuration.
|
|
63
|
+
|
|
64
|
+
To view the instructions again later: `erk init --shell`
|
|
65
|
+
|
|
66
|
+
Or append directly:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
erk init --shell >> ~/.zshrc # or ~/.bashrc
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Verify Setup
|
|
73
|
+
|
|
74
|
+
Run the doctor command to verify your environment:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
erk doctor
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
This checks that all prerequisites are installed and configured correctly.
|
|
81
|
+
|
|
82
|
+
## Local Plan-Driven Workflow
|
|
83
|
+
|
|
84
|
+
The primary workflow: create a plan, save it, implement it, ship it. **Often completes without touching an IDE.**
|
|
85
|
+
|
|
86
|
+
### Planning Phase
|
|
87
|
+
|
|
88
|
+
1. Start a Claude Code session:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
claude
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
2. Enter plan mode and develop your plan
|
|
95
|
+
|
|
96
|
+
3. Save plan to GitHub issue (system prompts automatically after plan mode)
|
|
97
|
+
|
|
98
|
+
### Implementation
|
|
99
|
+
|
|
100
|
+
4. Execute the plan:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
erk implement <issue-number>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
This creates a worktree, activates the environment, and runs Claude Code with the plan.
|
|
107
|
+
|
|
108
|
+
### PR Submission
|
|
109
|
+
|
|
110
|
+
5. Submit the PR:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
erk pr submit
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Or from within Claude Code: `/erk:pr-submit`
|
|
117
|
+
|
|
118
|
+
### Code Review Iteration
|
|
119
|
+
|
|
120
|
+
6. Review PR feedback in GitHub
|
|
121
|
+
|
|
122
|
+
7. Address feedback:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
/erk:pr-address
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
8. Repeat until approved
|
|
129
|
+
|
|
130
|
+
### Landing
|
|
131
|
+
|
|
132
|
+
9. Merge and clean up:
|
|
133
|
+
```bash
|
|
134
|
+
erk pr land
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
> **Note:** This entire workflow—from planning through shipping—can happen without opening an IDE. You create plans, submit code, review feedback in GitHub, address it via Claude Code, and land.
|
|
138
|
+
|
|
139
|
+
## Iteration Patterns
|
|
140
|
+
|
|
141
|
+
### Quick Iteration
|
|
142
|
+
|
|
143
|
+
For rapid commits within a worktree:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
/quick-submit
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Commits all changes and submits with Graphite.
|
|
150
|
+
|
|
151
|
+
### Rebasing and Stack Management
|
|
152
|
+
|
|
153
|
+
When your stack needs rebasing:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
erk pr auto-restack --dangerous
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Or from Claude Code: `/erk:auto-restack`
|
|
160
|
+
|
|
161
|
+
To fix merge conflicts during a rebase:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
/erk:fix-conflicts
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Common Workflows
|
|
168
|
+
|
|
169
|
+
### Auto-Restack: Intelligent Conflict Resolution
|
|
170
|
+
|
|
171
|
+
When working with stacked PRs, rebasing is a frequent operation. `erk pr auto-restack` automates this process with intelligent conflict resolution.
|
|
172
|
+
|
|
173
|
+
**What it does:**
|
|
174
|
+
|
|
175
|
+
1. Runs `gt restack` to rebase your stack onto the latest trunk
|
|
176
|
+
2. If conflicts occur, launches Claude Code with the `/erk:fix-conflicts` command
|
|
177
|
+
3. After resolution, automatically continues the restack process
|
|
178
|
+
4. Repeats until the entire stack is cleanly rebased
|
|
179
|
+
|
|
180
|
+
**Basic usage:**
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
erk pr auto-restack --dangerous
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**From within Claude Code:**
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
/erk:auto-restack
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
> Note: The `--dangerous` flag acknowledges that auto-restack invokes Claude with `--dangerously-skip-permissions`.
|
|
193
|
+
|
|
194
|
+
**When to use it:**
|
|
195
|
+
|
|
196
|
+
- After merging a PR that's below yours in the stack
|
|
197
|
+
- When trunk has been updated and you need to incorporate changes
|
|
198
|
+
- When Graphite shows your stack needs rebasing
|
|
199
|
+
- After running `erk pr land` on a parent branch
|
|
200
|
+
|
|
201
|
+
**How conflict resolution works:**
|
|
202
|
+
|
|
203
|
+
When conflicts are detected, erk spawns a Claude Code session that:
|
|
204
|
+
|
|
205
|
+
1. Identifies all conflicting files
|
|
206
|
+
2. Analyzes the nature of each conflict (content vs import conflicts)
|
|
207
|
+
3. Resolves conflicts while preserving the intent of both changes
|
|
208
|
+
4. Stages resolved files and continues the rebase
|
|
209
|
+
|
|
210
|
+
**Example scenario:**
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
trunk ← feature-a ← feature-b ← feature-c (you are here)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
If `feature-a` merges into trunk, running `erk pr auto-restack --dangerous` will:
|
|
217
|
+
|
|
218
|
+
1. Rebase `feature-b` onto the new trunk
|
|
219
|
+
2. Resolve any conflicts (with Claude's help if needed)
|
|
220
|
+
3. Rebase `feature-c` onto the updated `feature-b`
|
|
221
|
+
4. Resolve any conflicts at this level too
|
|
222
|
+
|
|
223
|
+
The result: your entire stack is cleanly rebased with minimal manual intervention.
|
|
224
|
+
|
|
225
|
+
### Checkout PR from GitHub
|
|
226
|
+
|
|
227
|
+
When reviewing or debugging a PR—whether from a teammate or a remote agent run—you can check it out directly using the PR number or URL from the GitHub page.
|
|
228
|
+
|
|
229
|
+
**Basic usage:**
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# Using PR number
|
|
233
|
+
erk pr checkout 123
|
|
234
|
+
|
|
235
|
+
# Using GitHub URL (copy directly from browser)
|
|
236
|
+
erk pr checkout https://github.com/owner/repo/pull/123
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
This creates a local worktree for the PR branch and changes your shell to that directory.
|
|
240
|
+
|
|
241
|
+
**Syncing with Graphite:**
|
|
242
|
+
|
|
243
|
+
After checkout, sync with Graphite to enable stack management:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
erk pr sync --dangerous
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
This registers the branch with Graphite so you can use standard `gt` commands (`gt pr`, `gt land`, etc.).
|
|
250
|
+
|
|
251
|
+
> Note: The `--dangerous` flag acknowledges that sync invokes Claude with `--dangerously-skip-permissions`.
|
|
252
|
+
|
|
253
|
+
**Complete workflow:**
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# 1. Checkout the PR (copy URL from GitHub)
|
|
257
|
+
erk pr checkout https://github.com/myorg/myrepo/pull/456
|
|
258
|
+
|
|
259
|
+
# 2. Sync with Graphite
|
|
260
|
+
erk pr sync --dangerous
|
|
261
|
+
|
|
262
|
+
# 3. Now iterate normally
|
|
263
|
+
claude
|
|
264
|
+
# ... make changes ...
|
|
265
|
+
/quick-submit
|
|
266
|
+
|
|
267
|
+
# 4. Or land when approved
|
|
268
|
+
erk pr land
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**When to use it:**
|
|
272
|
+
|
|
273
|
+
- Reviewing a teammate's PR locally
|
|
274
|
+
- Debugging a PR created by remote agent execution
|
|
275
|
+
- Taking over a PR that needs local iteration
|
|
276
|
+
- Running tests or making fixes on someone else's branch
|
|
277
|
+
|
|
278
|
+
## Documentation Extraction
|
|
279
|
+
|
|
280
|
+
Erk supports extracting reusable documentation from implementation sessions into the `docs/learned/` folder—a directory of **agent-generated, agent-consumed documentation**.
|
|
281
|
+
|
|
282
|
+
This documentation:
|
|
283
|
+
|
|
284
|
+
- Captures patterns discovered during implementation
|
|
285
|
+
- Gets loaded by future agent sessions via AGENTS.md routing
|
|
286
|
+
- Builds institutional knowledge over time
|
|
287
|
+
|
|
288
|
+
To extract documentation from a session:
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
/erk:create-extraction-plan
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Remote Execution
|
|
295
|
+
|
|
296
|
+
For sandboxed, parallel execution via GitHub Actions:
|
|
297
|
+
|
|
298
|
+
1. Create a plan (via Claude Code plan mode)
|
|
299
|
+
|
|
300
|
+
2. Submit for remote execution:
|
|
301
|
+
```bash
|
|
302
|
+
erk plan submit <issue-number>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
The agent runs in GitHub Actions and creates a PR automatically.
|
|
306
|
+
|
|
307
|
+
## Debugging Remote PRs
|
|
308
|
+
|
|
309
|
+
When a remote implementation needs local iteration:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
erk pr checkout <pr-number>
|
|
313
|
+
erk pr sync --dangerous
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
This checks out the PR into a local worktree for debugging and iteration.
|
|
317
|
+
|
|
318
|
+
## Planless Workflow
|
|
319
|
+
|
|
320
|
+
For smaller changes that don't require formal planning:
|
|
321
|
+
|
|
322
|
+
1. Create a worktree:
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
erk wt create <branch-name>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
2. Iterate normally in Claude Code
|
|
329
|
+
|
|
330
|
+
3. Submit PR:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
erk pr submit
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
4. Merge and clean up:
|
|
337
|
+
```bash
|
|
338
|
+
erk pr land
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## File Locations
|
|
342
|
+
|
|
343
|
+
| Location | Contents |
|
|
344
|
+
| ---------- | ------------------------------------------------ |
|
|
345
|
+
| `.erk/` | Erk configuration, scratch storage, session data |
|
|
346
|
+
| `.impl/` | Implementation plans (at worktree root) |
|
|
347
|
+
| `.claude/` | Claude Code commands, skills, hooks |
|
|
348
|
+
|
|
349
|
+
### Gitignore
|
|
350
|
+
|
|
351
|
+
`erk init` automatically adds these entries to your `.gitignore`. If you ran `erk init`, this is already configured:
|
|
352
|
+
|
|
353
|
+
```gitignore
|
|
354
|
+
.erk/scratch/
|
|
355
|
+
.impl/
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
`.impl/` contains temporary implementation plans that shouldn't be committed. `.erk/scratch/` holds session-specific working files.
|
|
359
|
+
|
|
360
|
+
## Plan Mode GitHub Integration
|
|
361
|
+
|
|
362
|
+
By default, erk modifies Claude Code's plan mode behavior. When you exit plan mode, erk prompts you to save the plan to GitHub as an issue before proceeding. This enables the plan-driven workflow where plans become trackable issues that can be implemented via `erk implement <issue-number>`.
|
|
363
|
+
|
|
364
|
+
To disable this behavior and use standard Claude Code plan mode:
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
erk config set github_planning false
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
To re-enable:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
erk config set github_planning true
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
When disabled, exiting plan mode works exactly as it does in standard Claude Code.
|