lemming-cli 0.4.0__tar.gz → 0.4.1__tar.gz
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.
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/PKG-INFO +1 -1
- lemming_cli-0.4.1/SKILL.md +103 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/pyproject.toml +1 -1
- lemming_cli-0.4.0/SKILL.md +0 -86
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/.github/workflows/ci.yml +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/.github/workflows/publish.yml +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/.github/workflows/screenshots.yml +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/.gitignore +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/.prettierignore +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/.prettierrc +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/Dockerfile +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/LICENSE +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/README.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/biome.json +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docker-compose.yml +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docs/EVALS.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docs/HOOKS.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docs/screenshots/dashboard-desktop.png +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docs/screenshots/dashboard-mobile.png +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docs/screenshots/task-log-desktop.png +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/docs/screenshots/task-log-mobile.png +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/package-lock.json +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/package.json +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/playwright.config.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/__init__.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/__init__.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/auth.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/auth_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/config.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/config_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/conftest.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/context.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/context_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/directories.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/directories_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/files.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/files_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/hooks.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/hooks_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/logging.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/logging_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/loop.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/loop_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/main.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/main_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/tasks.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api/tasks_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/api_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/brief_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/__init__.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/brief.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/config.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/config_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/exec_cli.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/exec_cli_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/goal.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/goal_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/hooks.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/hooks_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/machine_output_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/main.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/main_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/operations.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/operations_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/progress.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/progress_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/readability_cli.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/readability_cli_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/skill.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/skill_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/stop_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/tasks.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli/tasks_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/cli_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/conftest.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/__init__.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/__main__.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/cli.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/cli_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/container.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/container_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/fixtures.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/fixtures_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/harness.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/harness_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/readability.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/readability_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/roadmap.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/roadmap_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/scenarios.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/scenarios_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/suites.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/trial.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/evals/trial_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/hooks.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/hooks_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/integration_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/main.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/main_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/models.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/models_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/orchestrator.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/orchestrator_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/paths.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/paths_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/persistence.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/persistence_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts/hooks/50-readability.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts/hooks/60-testing.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts/hooks/70-ux.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts/hooks/90-roadmap.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts/taskrunner.md +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/prompts_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/providers.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/providers_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/runner.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/runner_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/scope.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/scope_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/shutdown.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/shutdown_integration_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/shutdown_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/__init__.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/lifecycle.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/lifecycle_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/limits.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/operations.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/operations_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/progress.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/progress_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/queries.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/tasks/queries_test.py +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/dashboard.spec.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/dashboard.test.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/favicon.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/favicon.spec.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/files.html +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/files.spec.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/index.html +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/index.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/logs.html +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/logs.test.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/mancha.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/src/lemming/web/screenshots.spec.js +0 -0
- {lemming_cli-0.4.0 → lemming_cli-0.4.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: lemming-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: An autonomous, iterative task runner for AI coding agents.
|
|
5
5
|
Project-URL: Homepage, https://github.com/owahltinez/lemming
|
|
6
6
|
Project-URL: Repository, https://github.com/owahltinez/lemming
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lemming
|
|
3
|
+
description: One interface over the AI coding agent CLIs (agy, claude, codex). Delegate a single task to another agent to spare a quota or play to its strengths; run a readability, testing, or UX review over changed files, a branch, or a path; or drive a multi-task project through a roadmap that survives context limits. Use whenever work should run under a different agent than the current one, when reviewing a diff before opening a pull request, or when a job is too large for one agent run.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# lemming
|
|
8
|
+
|
|
9
|
+
One interface over several agent CLIs. You do not need to know how `agy`,
|
|
10
|
+
`claude`, or `codex` spell their flags — only `lemming`.
|
|
11
|
+
|
|
12
|
+
Use `exec` for one unit of work, and a roadmap for anything larger than a
|
|
13
|
+
single agent run can hold.
|
|
14
|
+
|
|
15
|
+
## Delegate one task
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
lemming exec "Fix the flaky heartbeat test in src/runner_test.py" --runner codex
|
|
19
|
+
|
|
20
|
+
# Pipe a longer handoff rather than fighting shell quoting; no length limit
|
|
21
|
+
cat handoff.md | lemming exec -f - --runner agy
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The agent's closing message comes back on **stdout**, everything else on
|
|
25
|
+
stderr, and the exit code is 0 only if the task completed. Read that message
|
|
26
|
+
instead of hunting through logs.
|
|
27
|
+
|
|
28
|
+
The task starts with an empty context and sees nothing of your conversation,
|
|
29
|
+
so give it everything it needs.
|
|
30
|
+
|
|
31
|
+
## Run a review
|
|
32
|
+
|
|
33
|
+
With no description there is nothing for a task runner to do, so only the
|
|
34
|
+
reviews run — against work that already exists.
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
lemming exec --review readability # uncommitted work
|
|
38
|
+
lemming exec --review testing --scope main...HEAD
|
|
39
|
+
lemming exec --review all --scope src/api/
|
|
40
|
+
lemming exec "Add pagination" --review all # do the work, then gate it
|
|
41
|
+
|
|
42
|
+
# Someone else's branch, in a worktree so your own tree is untouched
|
|
43
|
+
git worktree add /tmp/pr-123 && (cd /tmp/pr-123 && gh pr checkout 123)
|
|
44
|
+
lemming -C /tmp/pr-123 exec --review testing --scope main...HEAD
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`--scope` takes paths, which pass through untouched, or a git revision range,
|
|
48
|
+
which is resolved to the files it changed. It defaults to uncommitted work,
|
|
49
|
+
and a clean tree stops the run rather than reviewing everything.
|
|
50
|
+
|
|
51
|
+
Reviews **edit the workspace** — readability applies fixes and reruns checks.
|
|
52
|
+
That is the point, but it means a review is not read-only.
|
|
53
|
+
|
|
54
|
+
## Drive a roadmap
|
|
55
|
+
|
|
56
|
+
For work that outlasts one agent run — a migration, a multi-step feature —
|
|
57
|
+
break it into tasks. Each runs with a fresh context seeded only by the goal
|
|
58
|
+
and recorded progress, so the project survives context limits.
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
lemming goal "Add offline support with a service worker and a sync queue"
|
|
62
|
+
lemming add "Register the service worker and cache the app shell"
|
|
63
|
+
lemming add "Queue writes in IndexedDB while offline"
|
|
64
|
+
lemming run # runs until the queue drains
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Check on it, and read what an agent actually did:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
lemming status # queue, attempts, and recorded progress
|
|
71
|
+
lemming status <id> # one task in detail, including its runner command
|
|
72
|
+
lemming logs # the active task's log, or logs <id> for one task
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Adjust it while it runs — new tasks are picked up automatically:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
lemming add "Add a retry backoff to the sync queue" --index 0 # jump the queue
|
|
79
|
+
lemming stop --after-current-task # drain, then stop
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
After each task, review hooks run automatically and a roadmap hook may revise
|
|
83
|
+
the queue. `lemming hooks list` shows them; `lemming hooks disable <name>`
|
|
84
|
+
turns one off for the project.
|
|
85
|
+
|
|
86
|
+
## What to know before running any of it
|
|
87
|
+
|
|
88
|
+
- **The agent runs unattended.** `--yolo` is the default, so it does not
|
|
89
|
+
inherit the permission prompts of whatever launched it. Treat this as
|
|
90
|
+
granting an agent unsupervised write access to the working directory.
|
|
91
|
+
- **`exec` makes one attempt, no retry.** A failure is final. A roadmap task
|
|
92
|
+
retries (3 by default) with its progress carried forward.
|
|
93
|
+
- **Interrupting leaves partial edits.** Nothing is restored, so there is no
|
|
94
|
+
atomicity to rely on.
|
|
95
|
+
- **Concurrent runs in one checkout interleave their edits.** Give each
|
|
96
|
+
writing run its own worktree and address it with `-C`.
|
|
97
|
+
- **Failures keep their state.** The directory is printed on stderr and holds
|
|
98
|
+
the run's log directly, so `cat <that dir>/*-runner.log` is the whole
|
|
99
|
+
recovery. It is retired automatically after a week.
|
|
100
|
+
- **`--tasks-file` and `-C` are group options.** They go before the
|
|
101
|
+
subcommand — `lemming -C ../other exec ...`, never `exec -C ../other`.
|
|
102
|
+
|
|
103
|
+
`lemming --help`, or `--help` on any subcommand, has the full flag list.
|
lemming_cli-0.4.0/SKILL.md
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lemming
|
|
3
|
-
description: Delegate a single coding task to another AI agent CLI (agy, claude, codex) through one interface, or run a code review — readability, testing, UX — over changed files, a PR branch, or a path. Use when handing work to a different agent to spare a quota or play to its strengths, or when reviewing a diff before opening a pull request. Not for driving a multi-task project; that is a roadmap.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# lemming
|
|
8
|
-
|
|
9
|
-
One interface over several agent CLIs. You do not need to know how `agy`,
|
|
10
|
-
`claude`, or `codex` spell their flags — only `lemming exec`.
|
|
11
|
-
|
|
12
|
-
## Delegate one task
|
|
13
|
-
|
|
14
|
-
```sh
|
|
15
|
-
lemming exec "Fix the flaky heartbeat test in src/runner_test.py" --runner codex
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
The agent's closing message comes back on **stdout**; progress and the event
|
|
19
|
-
trace go to stderr. Exit code is 0 only if the task completed. That message is
|
|
20
|
-
the return value — read it instead of hunting through logs.
|
|
21
|
-
|
|
22
|
-
Pipe a longer handoff rather than fighting shell quoting. There is no length
|
|
23
|
-
limit, unlike a roadmap task description:
|
|
24
|
-
|
|
25
|
-
```sh
|
|
26
|
-
cat handoff.md | lemming exec -f - --runner agy
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Delegate when another agent's quota, price, or strengths suit the work better
|
|
30
|
-
than yours. Give the task everything it needs: it starts with an empty context
|
|
31
|
-
and sees nothing of your conversation.
|
|
32
|
-
|
|
33
|
-
## Run a review
|
|
34
|
-
|
|
35
|
-
With no description there is nothing for a task runner to do, so only the
|
|
36
|
-
reviews run — against work that already exists.
|
|
37
|
-
|
|
38
|
-
```sh
|
|
39
|
-
lemming exec --review readability # uncommitted work
|
|
40
|
-
lemming exec --review testing --scope main...HEAD
|
|
41
|
-
lemming exec --review all --scope src/api/
|
|
42
|
-
lemming exec "Add pagination" --review all # do the work, then gate it
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
`--scope` takes paths, which pass through untouched, or a git revision range,
|
|
46
|
-
which is resolved to the files it changed. It defaults to uncommitted work.
|
|
47
|
-
A clean tree stops the run rather than reviewing everything.
|
|
48
|
-
|
|
49
|
-
Reviews **edit the workspace**: readability applies fixes and reruns checks.
|
|
50
|
-
That is the point — but it means a review is not read-only.
|
|
51
|
-
|
|
52
|
-
## Reviewing someone else's branch
|
|
53
|
-
|
|
54
|
-
Check it out in a worktree so your own tree is untouched, and point `-C` at it:
|
|
55
|
-
|
|
56
|
-
```sh
|
|
57
|
-
git worktree add /tmp/pr-123 && (cd /tmp/pr-123 && gh pr checkout 123)
|
|
58
|
-
lemming -C /tmp/pr-123 exec --review testing --scope main...HEAD
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## What to know before running it
|
|
62
|
-
|
|
63
|
-
- **The agent runs unattended.** `--yolo` is the default, so it does not
|
|
64
|
-
inherit the permission prompts of whatever launched it. Treat `lemming exec`
|
|
65
|
-
as granting an agent unsupervised write access to the working directory.
|
|
66
|
-
- **One agent run, no retry.** A failure is final; it does not silently try
|
|
67
|
-
again. `--time-limit` caps the wall clock (default 60 minutes).
|
|
68
|
-
- **Interrupting leaves partial edits.** The workspace is not restored, so
|
|
69
|
-
there is no atomicity to rely on.
|
|
70
|
-
- **Failures keep their log.** The state directory path is printed on stderr;
|
|
71
|
-
read it with `lemming logs` pointed at that tasks file.
|
|
72
|
-
|
|
73
|
-
## Running several at once
|
|
74
|
-
|
|
75
|
-
Concurrent runs in one checkout will interleave their edits. Give each write
|
|
76
|
-
task its own worktree and address it with `-C`. Read-only work parallelizes
|
|
77
|
-
safely as-is.
|
|
78
|
-
|
|
79
|
-
## When not to use it
|
|
80
|
-
|
|
81
|
-
`exec` is for one unit of work. Anything needing more context than a single
|
|
82
|
-
agent run can hold — a migration across a large codebase, a multi-step feature
|
|
83
|
-
— belongs on a roadmap: `lemming add`, then `lemming run`. In particular,
|
|
84
|
-
`--scope .` over a large repository *samples*; it does not cover.
|
|
85
|
-
|
|
86
|
-
Run `lemming exec --help` for the full flag list.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|