lemming-cli 0.3.2__tar.gz → 0.3.3__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.3.2 → lemming_cli-0.3.3}/PKG-INFO +3 -2
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/README.md +2 -1
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/pyproject.toml +1 -1
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/orchestrator.py +2 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/orchestrator_test.py +8 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/runner.py +9 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/runner_test.py +37 -2
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/lifecycle_test.py +1 -3
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/uv.lock +1 -1
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.github/workflows/ci.yml +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.github/workflows/publish.yml +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.github/workflows/screenshots.yml +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.gitignore +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.prettierignore +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.prettierrc +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/Dockerfile +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/LICENSE +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/biome.json +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docker-compose.yml +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/EVALS.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/HOOKS.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/dashboard-desktop.png +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/dashboard-mobile.png +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/task-log-desktop.png +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/task-log-mobile.png +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/package-lock.json +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/package.json +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/playwright.config.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/__init__.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/__init__.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/auth.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/auth_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/config.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/config_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/conftest.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/context.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/context_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/directories.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/directories_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/files.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/files_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/hooks.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/hooks_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/logging.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/logging_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/loop.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/loop_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/main.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/main_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/tasks.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/tasks_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/__init__.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/config.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/config_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/goal.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/goal_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/hooks.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/hooks_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/main.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/main_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/operations.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/operations_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/progress.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/progress_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/readability_cli.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/readability_cli_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/tasks.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/tasks_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/conftest.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/__init__.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/__main__.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/cli.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/cli_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/container.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/container_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/fixtures.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/fixtures_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/harness.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/harness_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/readability.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/readability_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/roadmap.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/roadmap_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/scenarios.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/scenarios_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/suites.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/trial.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/trial_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/hooks.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/hooks_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/integration_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/main.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/main_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/models.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/models_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/paths.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/paths_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/persistence.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/persistence_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/50-readability.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/60-testing.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/70-ux.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/90-roadmap.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/taskrunner.md +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/providers.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/providers_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/__init__.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/lifecycle.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/limits.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/operations.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/operations_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/progress.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/progress_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/queries.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/queries_test.py +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/dashboard.spec.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/dashboard.test.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/favicon.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/favicon.spec.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/files.html +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/files.spec.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/index.html +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/index.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/logs.html +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/logs.test.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/mancha.js +0 -0
- {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/screenshots.spec.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lemming-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
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
|
|
@@ -319,7 +319,8 @@ See [docs/EVALS.md](docs/EVALS.md) for details.
|
|
|
319
319
|
Lemming uses **fuzzy matching** to automatically inject the correct "YOLO"
|
|
320
320
|
(auto-approve) and "Quiet" flags for popular tools:
|
|
321
321
|
|
|
322
|
-
- **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions`
|
|
322
|
+
- **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions` and exposes
|
|
323
|
+
the project workspace with `--add-dir`
|
|
323
324
|
- **Aider**: Adds `--yes --quiet`
|
|
324
325
|
- **Claude**: Adds `--dangerously-skip-permissions`
|
|
325
326
|
- **Codex**: Runs non-interactively via `codex exec`, adds `--json`, and, in
|
|
@@ -297,7 +297,8 @@ See [docs/EVALS.md](docs/EVALS.md) for details.
|
|
|
297
297
|
Lemming uses **fuzzy matching** to automatically inject the correct "YOLO"
|
|
298
298
|
(auto-approve) and "Quiet" flags for popular tools:
|
|
299
299
|
|
|
300
|
-
- **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions`
|
|
300
|
+
- **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions` and exposes
|
|
301
|
+
the project workspace with `--add-dir`
|
|
301
302
|
- **Aider**: Adds `--yes --quiet`
|
|
302
303
|
- **Claude**: Adds `--dangerously-skip-permissions`
|
|
303
304
|
- **Codex**: Runs non-interactively via `codex exec`, adds `--json`, and, in
|
|
@@ -111,6 +111,7 @@ def run_hooks(
|
|
|
111
111
|
no_defaults,
|
|
112
112
|
verbose=verbose,
|
|
113
113
|
time_limit=time_limit,
|
|
114
|
+
working_dir=working_dir,
|
|
114
115
|
)
|
|
115
116
|
|
|
116
117
|
try:
|
|
@@ -542,6 +543,7 @@ def run_loop(
|
|
|
542
543
|
no_defaults,
|
|
543
544
|
verbose=verbose,
|
|
544
545
|
time_limit=time_limit,
|
|
546
|
+
working_dir=working_dir,
|
|
545
547
|
)
|
|
546
548
|
|
|
547
549
|
returncode = 0
|
|
@@ -209,6 +209,7 @@ def test_synchronous_hooks_execution_timing(setup_env):
|
|
|
209
209
|
@mock.patch("lemming.runner.run_with_heartbeat")
|
|
210
210
|
def test_run_loop_calls_runner_with_header(mock_run, setup_env):
|
|
211
211
|
test_tasks_file, initial_data = setup_env
|
|
212
|
+
working_dir = test_tasks_file.parent / "project with spaces"
|
|
212
213
|
# Setup runner mock
|
|
213
214
|
mock_run.return_value = (0, "output", "")
|
|
214
215
|
|
|
@@ -225,11 +226,14 @@ def test_run_loop_calls_runner_with_header(mock_run, setup_env):
|
|
|
225
226
|
yolo=True,
|
|
226
227
|
no_defaults=False,
|
|
227
228
|
runner_args=(),
|
|
229
|
+
working_dir=working_dir,
|
|
228
230
|
)
|
|
229
231
|
|
|
230
232
|
# Verify run_with_heartbeat was called with header="Task Runner"
|
|
231
233
|
args, kwargs = mock_run.call_args
|
|
232
234
|
assert kwargs.get("header") == "Task Runner"
|
|
235
|
+
cmd = args[0]
|
|
236
|
+
assert cmd[cmd.index("--add-dir") + 1] == str(working_dir)
|
|
233
237
|
|
|
234
238
|
|
|
235
239
|
@mock.patch("lemming.runner.run_with_heartbeat")
|
|
@@ -609,6 +613,7 @@ def test_run_hooks_success(mock_prepare, mock_list, mock_run, hooks_env):
|
|
|
609
613
|
mock_list.return_value = ["roadmap"]
|
|
610
614
|
mock_prepare.return_value = "Hook Prompt"
|
|
611
615
|
mock_run.return_value = (0, "stdout", "")
|
|
616
|
+
working_dir = hooks_env.parent / "project with spaces"
|
|
612
617
|
|
|
613
618
|
# Task must be IN_PROGRESS for finalization to apply
|
|
614
619
|
tasks.update_task(
|
|
@@ -623,10 +628,13 @@ def test_run_hooks_success(mock_prepare, mock_list, mock_run, hooks_env):
|
|
|
623
628
|
runner_args=(),
|
|
624
629
|
no_defaults=False,
|
|
625
630
|
verbose=True,
|
|
631
|
+
working_dir=working_dir,
|
|
626
632
|
final_status=tasks.TaskStatus.COMPLETED,
|
|
627
633
|
)
|
|
628
634
|
|
|
629
635
|
assert mock_run.called
|
|
636
|
+
cmd = mock_run.call_args.args[0]
|
|
637
|
+
assert cmd[cmd.index("--add-dir") + 1] == str(working_dir)
|
|
630
638
|
data = tasks.load_tasks(hooks_env)
|
|
631
639
|
assert data.tasks[0].status == tasks.TaskStatus.COMPLETED
|
|
632
640
|
|
|
@@ -102,6 +102,7 @@ def build_runner_command(
|
|
|
102
102
|
no_defaults: bool = False,
|
|
103
103
|
verbose: bool = False,
|
|
104
104
|
time_limit: int = 0,
|
|
105
|
+
working_dir: pathlib.Path | None = None,
|
|
105
106
|
) -> list[str]:
|
|
106
107
|
"""Constructs the CLI command for the specified runner.
|
|
107
108
|
|
|
@@ -118,6 +119,8 @@ def build_runner_command(
|
|
|
118
119
|
verbose: If True, enable verbose output for supported runners.
|
|
119
120
|
time_limit: Task time limit in minutes; used to size runner-side
|
|
120
121
|
timeouts for runners that enforce their own (0 means no limit).
|
|
122
|
+
working_dir: Project directory exposed to runners that do not preserve
|
|
123
|
+
the subprocess working directory for their shell tools.
|
|
121
124
|
|
|
122
125
|
Returns:
|
|
123
126
|
A list of command-line arguments.
|
|
@@ -153,6 +156,12 @@ def build_runner_command(
|
|
|
153
156
|
if yolo:
|
|
154
157
|
cmd.append("--dangerously-skip-permissions")
|
|
155
158
|
|
|
159
|
+
# agy runs shell tools in its own scratch directory even when its
|
|
160
|
+
# process cwd is the project. Add the project as a workspace so
|
|
161
|
+
# task runners and hooks execute commands against the repository.
|
|
162
|
+
if working_dir is not None:
|
|
163
|
+
cmd.extend(["--add-dir", str(working_dir)])
|
|
164
|
+
|
|
156
165
|
# Print mode buffers the response until the run completes, so
|
|
157
166
|
# stream JSON events (agent messages, tool calls and their
|
|
158
167
|
# output) for live visibility in the task log. The flag is
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import pathlib
|
|
1
2
|
import signal
|
|
2
3
|
import subprocess
|
|
3
4
|
import sys
|
|
@@ -14,6 +15,31 @@ def test_build_runner_command_agy():
|
|
|
14
15
|
assert "my prompt" in cmd
|
|
15
16
|
|
|
16
17
|
|
|
18
|
+
def test_build_runner_command_agy_adds_project_workspace():
|
|
19
|
+
working_dir = pathlib.Path("/tmp/project with spaces")
|
|
20
|
+
cmd = runner.build_runner_command(
|
|
21
|
+
"agy",
|
|
22
|
+
"my prompt",
|
|
23
|
+
yolo=True,
|
|
24
|
+
working_dir=working_dir,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
add_dir_index = cmd.index("--add-dir")
|
|
28
|
+
assert cmd[add_dir_index + 1] == str(working_dir)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_build_runner_command_agy_without_defaults_skips_project_workspace():
|
|
32
|
+
cmd = runner.build_runner_command(
|
|
33
|
+
"agy",
|
|
34
|
+
"my prompt",
|
|
35
|
+
yolo=True,
|
|
36
|
+
no_defaults=True,
|
|
37
|
+
working_dir=pathlib.Path("/tmp/project"),
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
assert "--add-dir" not in cmd
|
|
41
|
+
|
|
42
|
+
|
|
17
43
|
def test_build_runner_command_agy_streams_json_events():
|
|
18
44
|
# agy print mode buffers the response until the end, so stream-json is
|
|
19
45
|
# used to surface agent messages and tool calls live in the task log.
|
|
@@ -40,9 +66,14 @@ def test_build_runner_command_agy_print_timeout_without_time_limit():
|
|
|
40
66
|
|
|
41
67
|
def test_build_runner_command_time_limit_ignored_by_other_runners():
|
|
42
68
|
cmd = runner.build_runner_command(
|
|
43
|
-
"claude",
|
|
69
|
+
"claude",
|
|
70
|
+
"my prompt",
|
|
71
|
+
yolo=True,
|
|
72
|
+
time_limit=45,
|
|
73
|
+
working_dir=pathlib.Path("/tmp/project"),
|
|
44
74
|
)
|
|
45
75
|
assert "--print-timeout" not in cmd
|
|
76
|
+
assert "--add-dir" not in cmd
|
|
46
77
|
assert "--log-file" not in cmd
|
|
47
78
|
|
|
48
79
|
|
|
@@ -128,9 +159,13 @@ def test_build_runner_command_template_ignores_defaults():
|
|
|
128
159
|
# Even though runner starts with "agy", template mode should not
|
|
129
160
|
# inject --dangerously-skip-permissions etc.
|
|
130
161
|
cmd = runner.build_runner_command(
|
|
131
|
-
"agy --custom {{prompt}}",
|
|
162
|
+
"agy --custom {{prompt}}",
|
|
163
|
+
"do stuff",
|
|
164
|
+
yolo=True,
|
|
165
|
+
working_dir=pathlib.Path("/tmp/project"),
|
|
132
166
|
)
|
|
133
167
|
assert "--dangerously-skip-permissions" not in cmd
|
|
168
|
+
assert "--add-dir" not in cmd
|
|
134
169
|
assert cmd == ["agy", "--custom", "do stuff"]
|
|
135
170
|
|
|
136
171
|
|
|
@@ -264,9 +264,7 @@ def test_cancel_pending_task_does_not_kill_process(tmp_path):
|
|
|
264
264
|
),
|
|
265
265
|
)
|
|
266
266
|
|
|
267
|
-
with patch(
|
|
268
|
-
"lemming.tasks.lifecycle._kill_pid_tree"
|
|
269
|
-
) as mock_kill_tree:
|
|
267
|
+
with patch("lemming.tasks.lifecycle._kill_pid_tree") as mock_kill_tree:
|
|
270
268
|
success = lifecycle.cancel_task(tasks_file, "1")
|
|
271
269
|
|
|
272
270
|
assert success is True
|
|
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
|