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.
Files changed (131) hide show
  1. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/PKG-INFO +3 -2
  2. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/README.md +2 -1
  3. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/pyproject.toml +1 -1
  4. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/orchestrator.py +2 -0
  5. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/orchestrator_test.py +8 -0
  6. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/runner.py +9 -0
  7. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/runner_test.py +37 -2
  8. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/lifecycle_test.py +1 -3
  9. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/uv.lock +1 -1
  10. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.github/workflows/ci.yml +0 -0
  11. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.github/workflows/publish.yml +0 -0
  12. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.github/workflows/screenshots.yml +0 -0
  13. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.gitignore +0 -0
  14. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.prettierignore +0 -0
  15. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/.prettierrc +0 -0
  16. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/Dockerfile +0 -0
  17. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/LICENSE +0 -0
  18. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/biome.json +0 -0
  19. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docker-compose.yml +0 -0
  20. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/EVALS.md +0 -0
  21. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/HOOKS.md +0 -0
  22. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/dashboard-desktop.png +0 -0
  23. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/dashboard-mobile.png +0 -0
  24. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/task-log-desktop.png +0 -0
  25. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/docs/screenshots/task-log-mobile.png +0 -0
  26. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/package-lock.json +0 -0
  27. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/package.json +0 -0
  28. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/playwright.config.js +0 -0
  29. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/__init__.py +0 -0
  30. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/__init__.py +0 -0
  31. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/auth.py +0 -0
  32. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/auth_test.py +0 -0
  33. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/config.py +0 -0
  34. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/config_test.py +0 -0
  35. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/conftest.py +0 -0
  36. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/context.py +0 -0
  37. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/context_test.py +0 -0
  38. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/directories.py +0 -0
  39. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/directories_test.py +0 -0
  40. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/files.py +0 -0
  41. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/files_test.py +0 -0
  42. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/hooks.py +0 -0
  43. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/hooks_test.py +0 -0
  44. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/logging.py +0 -0
  45. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/logging_test.py +0 -0
  46. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/loop.py +0 -0
  47. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/loop_test.py +0 -0
  48. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/main.py +0 -0
  49. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/main_test.py +0 -0
  50. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/tasks.py +0 -0
  51. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api/tasks_test.py +0 -0
  52. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/api_test.py +0 -0
  53. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/__init__.py +0 -0
  54. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/config.py +0 -0
  55. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/config_test.py +0 -0
  56. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/goal.py +0 -0
  57. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/goal_test.py +0 -0
  58. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/hooks.py +0 -0
  59. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/hooks_test.py +0 -0
  60. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/main.py +0 -0
  61. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/main_test.py +0 -0
  62. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/operations.py +0 -0
  63. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/operations_test.py +0 -0
  64. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/progress.py +0 -0
  65. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/progress_test.py +0 -0
  66. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/readability_cli.py +0 -0
  67. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/readability_cli_test.py +0 -0
  68. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/tasks.py +0 -0
  69. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli/tasks_test.py +0 -0
  70. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/cli_test.py +0 -0
  71. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/conftest.py +0 -0
  72. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/__init__.py +0 -0
  73. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/__main__.py +0 -0
  74. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/cli.py +0 -0
  75. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/cli_test.py +0 -0
  76. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/container.py +0 -0
  77. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/container_test.py +0 -0
  78. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/fixtures.py +0 -0
  79. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/fixtures_test.py +0 -0
  80. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/harness.py +0 -0
  81. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/harness_test.py +0 -0
  82. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/readability.py +0 -0
  83. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/readability_test.py +0 -0
  84. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/roadmap.py +0 -0
  85. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/roadmap_test.py +0 -0
  86. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/scenarios.py +0 -0
  87. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/scenarios_test.py +0 -0
  88. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/suites.py +0 -0
  89. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/trial.py +0 -0
  90. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/evals/trial_test.py +0 -0
  91. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/hooks.py +0 -0
  92. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/hooks_test.py +0 -0
  93. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/integration_test.py +0 -0
  94. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/main.py +0 -0
  95. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/main_test.py +0 -0
  96. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/models.py +0 -0
  97. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/models_test.py +0 -0
  98. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/paths.py +0 -0
  99. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/paths_test.py +0 -0
  100. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/persistence.py +0 -0
  101. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/persistence_test.py +0 -0
  102. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/50-readability.md +0 -0
  103. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/60-testing.md +0 -0
  104. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/70-ux.md +0 -0
  105. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/hooks/90-roadmap.md +0 -0
  106. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts/taskrunner.md +0 -0
  107. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts.py +0 -0
  108. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/prompts_test.py +0 -0
  109. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/providers.py +0 -0
  110. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/providers_test.py +0 -0
  111. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/__init__.py +0 -0
  112. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/lifecycle.py +0 -0
  113. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/limits.py +0 -0
  114. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/operations.py +0 -0
  115. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/operations_test.py +0 -0
  116. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/progress.py +0 -0
  117. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/progress_test.py +0 -0
  118. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/queries.py +0 -0
  119. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/tasks/queries_test.py +0 -0
  120. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/dashboard.spec.js +0 -0
  121. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/dashboard.test.js +0 -0
  122. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/favicon.js +0 -0
  123. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/favicon.spec.js +0 -0
  124. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/files.html +0 -0
  125. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/files.spec.js +0 -0
  126. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/index.html +0 -0
  127. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/index.js +0 -0
  128. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/logs.html +0 -0
  129. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/logs.test.js +0 -0
  130. {lemming_cli-0.3.2 → lemming_cli-0.3.3}/src/lemming/web/mancha.js +0 -0
  131. {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.2
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "lemming-cli"
7
- version = "0.3.2"
7
+ version = "0.3.3"
8
8
  description = "An autonomous, iterative task runner for AI coding agents."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -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", "my prompt", yolo=True, time_limit=45
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}}", "do stuff", yolo=True
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
@@ -222,7 +222,7 @@ wheels = [
222
222
 
223
223
  [[package]]
224
224
  name = "lemming-cli"
225
- version = "0.3.2"
225
+ version = "0.3.3"
226
226
  source = { editable = "." }
227
227
  dependencies = [
228
228
  { name = "beautifulsoup4" },
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