lemming-cli 0.4.3__tar.gz → 0.4.4__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 (201) hide show
  1. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/.github/workflows/ci.yml +9 -9
  2. lemming_cli-0.4.4/.prettierignore +13 -0
  3. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/Dockerfile +2 -1
  4. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/PKG-INFO +68 -68
  5. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/README.md +66 -66
  6. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/SKILL.md +38 -31
  7. lemming_cli-0.4.4/biome.json +42 -0
  8. lemming_cli-0.4.4/docs/EVALS.md +185 -0
  9. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/docs/HOOKS.md +29 -29
  10. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/package-lock.json +54 -38
  11. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/package.json +3 -2
  12. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/pyproject.toml +14 -2
  13. lemming_cli-0.4.4/pyrefly.toml +21 -0
  14. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/main.py +3 -0
  15. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/main_test.py +9 -0
  16. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/readability_cli_test.py +5 -4
  17. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/cli.py +124 -16
  18. lemming_cli-0.4.4/src/lemming/evals/cli_test.py +273 -0
  19. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/container.py +2 -4
  20. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/container_test.py +1 -2
  21. lemming_cli-0.4.4/src/lemming/evals/fixtures.py +197 -0
  22. lemming_cli-0.4.4/src/lemming/evals/fixtures_test.py +149 -0
  23. lemming_cli-0.4.4/src/lemming/evals/harness.py +445 -0
  24. lemming_cli-0.4.4/src/lemming/evals/harness_test.py +430 -0
  25. lemming_cli-0.4.4/src/lemming/evals/metrics.py +211 -0
  26. lemming_cli-0.4.4/src/lemming/evals/metrics_test.py +215 -0
  27. lemming_cli-0.4.4/src/lemming/evals/projects/readability/base/README.md +1 -0
  28. lemming_cli-0.4.4/src/lemming/evals/projects/readability/base/calc/__init__.py +0 -0
  29. lemming_cli-0.4.4/src/lemming/evals/projects/readability/base/calc/legacy.py +21 -0
  30. lemming_cli-0.4.4/src/lemming/evals/projects/readability/base/calc/ops.py +6 -0
  31. lemming_cli-0.4.4/src/lemming/evals/projects/readability/base/calc/ops_test.py +8 -0
  32. lemming_cli-0.4.4/src/lemming/evals/projects/readability/clean/calc/ops.py +11 -0
  33. lemming_cli-0.4.4/src/lemming/evals/projects/readability/clean/calc/ops_test.py +11 -0
  34. lemming_cli-0.4.4/src/lemming/evals/projects/readability/dead-code/calc/ops.py +16 -0
  35. lemming_cli-0.4.4/src/lemming/evals/projects/readability/dead-code/calc/ops_test.py +11 -0
  36. lemming_cli-0.4.4/src/lemming/evals/projects/readability/duplicated-behavior/calc/ops.py +29 -0
  37. lemming_cli-0.4.4/src/lemming/evals/projects/readability/duplicated-behavior/calc/ops_test.py +23 -0
  38. lemming_cli-0.4.4/src/lemming/evals/projects/readability/false-reuse/calc/limits.py +27 -0
  39. lemming_cli-0.4.4/src/lemming/evals/projects/readability/false-reuse/calc/limits_test.py +15 -0
  40. lemming_cli-0.4.4/src/lemming/evals/projects/readability/lint-debt/calc/ops.py +18 -0
  41. lemming_cli-0.4.4/src/lemming/evals/projects/readability/lint-debt/calc/ops_test.py +17 -0
  42. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/add-only/README.md +1 -0
  43. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/add-only/calc/__init__.py +0 -0
  44. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/add-only/calc/ops.py +6 -0
  45. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/add-only/calc/ops_test.py +8 -0
  46. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/buggy-subtract/README.md +1 -0
  47. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/buggy-subtract/calc/__init__.py +0 -0
  48. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/buggy-subtract/calc/ops.py +16 -0
  49. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/buggy-subtract/calc/ops_test.py +8 -0
  50. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/full-ops/README.md +1 -0
  51. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/full-ops/calc/__init__.py +0 -0
  52. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/full-ops/calc/ops.py +16 -0
  53. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/full-ops/calc/ops_test.py +8 -0
  54. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/unwired-cli/README.md +1 -0
  55. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/unwired-cli/calc/__init__.py +0 -0
  56. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/unwired-cli/calc/cli.py +14 -0
  57. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/unwired-cli/calc/cli_test.py +14 -0
  58. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/unwired-cli/calc/ops.py +16 -0
  59. lemming_cli-0.4.4/src/lemming/evals/projects/roadmap/unwired-cli/calc/ops_test.py +14 -0
  60. lemming_cli-0.4.4/src/lemming/evals/projects/task/hidden/stats/summary_hidden_test.py +22 -0
  61. lemming_cli-0.4.4/src/lemming/evals/projects/task/summary/README.md +1 -0
  62. lemming_cli-0.4.4/src/lemming/evals/projects/task/summary/stats/__init__.py +1 -0
  63. lemming_cli-0.4.4/src/lemming/evals/projects/task/summary/stats/summary.py +25 -0
  64. lemming_cli-0.4.4/src/lemming/evals/projects/task/summary/stats/summary_test.py +15 -0
  65. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/readability.py +155 -172
  66. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/readability_test.py +134 -13
  67. lemming_cli-0.4.4/src/lemming/evals/report.py +223 -0
  68. lemming_cli-0.4.4/src/lemming/evals/report_test.py +211 -0
  69. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/roadmap.py +12 -135
  70. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/roadmap_test.py +1 -2
  71. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/scenarios.py +18 -8
  72. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/suites.py +2 -1
  73. lemming_cli-0.4.4/src/lemming/evals/task.py +234 -0
  74. lemming_cli-0.4.4/src/lemming/evals/task_test.py +243 -0
  75. lemming_cli-0.4.4/src/lemming/evals/trial.py +250 -0
  76. lemming_cli-0.4.4/src/lemming/evals/trial_test.py +306 -0
  77. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/orchestrator.py +6 -1
  78. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/orchestrator_test.py +28 -0
  79. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/runner.py +5 -0
  80. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/dashboard.spec.js +2 -5
  81. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/dashboard.test.js +7 -17
  82. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/files.html +11 -5
  83. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/index.html +37 -25
  84. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/logs.html +5 -1
  85. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/screenshots.spec.js +1 -1
  86. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/uv.lock +34 -5
  87. lemming_cli-0.4.3/.prettierignore +0 -5
  88. lemming_cli-0.4.3/biome.json +0 -32
  89. lemming_cli-0.4.3/docs/EVALS.md +0 -89
  90. lemming_cli-0.4.3/src/lemming/evals/cli_test.py +0 -136
  91. lemming_cli-0.4.3/src/lemming/evals/fixtures.py +0 -90
  92. lemming_cli-0.4.3/src/lemming/evals/fixtures_test.py +0 -60
  93. lemming_cli-0.4.3/src/lemming/evals/harness.py +0 -239
  94. lemming_cli-0.4.3/src/lemming/evals/harness_test.py +0 -187
  95. lemming_cli-0.4.3/src/lemming/evals/trial.py +0 -86
  96. lemming_cli-0.4.3/src/lemming/evals/trial_test.py +0 -133
  97. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/.dockerignore +0 -0
  98. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/.github/workflows/publish.yml +0 -0
  99. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/.github/workflows/screenshots.yml +0 -0
  100. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/.gitignore +0 -0
  101. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/.prettierrc +0 -0
  102. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/LICENSE +0 -0
  103. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/docker-compose.yml +0 -0
  104. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/docs/screenshots/dashboard-desktop.png +0 -0
  105. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/docs/screenshots/dashboard-mobile.png +0 -0
  106. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/docs/screenshots/task-log-desktop.png +0 -0
  107. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/docs/screenshots/task-log-mobile.png +0 -0
  108. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/playwright.config.js +0 -0
  109. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/__init__.py +0 -0
  110. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/__init__.py +0 -0
  111. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/auth.py +0 -0
  112. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/auth_test.py +0 -0
  113. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/config.py +0 -0
  114. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/config_test.py +0 -0
  115. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/conftest.py +0 -0
  116. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/context.py +0 -0
  117. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/context_test.py +0 -0
  118. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/directories.py +0 -0
  119. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/directories_test.py +0 -0
  120. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/files.py +0 -0
  121. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/files_test.py +0 -0
  122. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/hooks.py +0 -0
  123. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/hooks_test.py +0 -0
  124. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/logging.py +0 -0
  125. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/logging_test.py +0 -0
  126. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/loop.py +0 -0
  127. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/loop_test.py +0 -0
  128. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/main.py +0 -0
  129. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/main_test.py +0 -0
  130. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/tasks.py +0 -0
  131. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api/tasks_test.py +0 -0
  132. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/api_test.py +0 -0
  133. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/brief_test.py +0 -0
  134. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/__init__.py +0 -0
  135. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/brief.py +0 -0
  136. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/config.py +0 -0
  137. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/config_test.py +0 -0
  138. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/exec_cli.py +0 -0
  139. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/exec_cli_test.py +0 -0
  140. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/goal.py +0 -0
  141. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/goal_test.py +0 -0
  142. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/hooks.py +0 -0
  143. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/hooks_test.py +0 -0
  144. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/machine_output_test.py +0 -0
  145. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/operations.py +0 -0
  146. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/operations_test.py +0 -0
  147. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/progress.py +0 -0
  148. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/progress_test.py +0 -0
  149. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/readability_cli.py +0 -0
  150. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/skill.py +0 -0
  151. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/skill_test.py +0 -0
  152. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/stop_test.py +0 -0
  153. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/tasks.py +0 -0
  154. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli/tasks_test.py +0 -0
  155. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/cli_test.py +0 -0
  156. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/conftest.py +0 -0
  157. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/__init__.py +0 -0
  158. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/__main__.py +0 -0
  159. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/evals/scenarios_test.py +0 -0
  160. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/hooks.py +0 -0
  161. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/hooks_test.py +0 -0
  162. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/integration_test.py +0 -0
  163. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/main.py +0 -0
  164. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/main_test.py +0 -0
  165. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/models.py +0 -0
  166. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/models_test.py +0 -0
  167. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/paths.py +0 -0
  168. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/paths_test.py +0 -0
  169. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/persistence.py +0 -0
  170. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/persistence_test.py +0 -0
  171. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts/hooks/50-readability.md +0 -0
  172. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts/hooks/60-testing.md +0 -0
  173. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts/hooks/70-ux.md +0 -0
  174. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts/hooks/90-roadmap.md +0 -0
  175. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts/taskrunner.md +0 -0
  176. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts.py +0 -0
  177. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/prompts_test.py +0 -0
  178. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/providers.py +0 -0
  179. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/providers_test.py +0 -0
  180. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/runner_test.py +0 -0
  181. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/scope.py +0 -0
  182. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/scope_test.py +0 -0
  183. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/shutdown.py +0 -0
  184. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/shutdown_integration_test.py +0 -0
  185. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/shutdown_test.py +0 -0
  186. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/__init__.py +0 -0
  187. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/lifecycle.py +0 -0
  188. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/lifecycle_test.py +0 -0
  189. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/limits.py +0 -0
  190. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/operations.py +0 -0
  191. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/operations_test.py +0 -0
  192. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/progress.py +0 -0
  193. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/progress_test.py +0 -0
  194. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/queries.py +0 -0
  195. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/tasks/queries_test.py +0 -0
  196. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/favicon.js +0 -0
  197. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/favicon.spec.js +0 -0
  198. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/files.spec.js +0 -0
  199. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/index.js +0 -0
  200. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/logs.test.js +0 -0
  201. {lemming_cli-0.4.3 → lemming_cli-0.4.4}/src/lemming/web/mancha.js +0 -0
@@ -21,23 +21,23 @@ jobs:
21
21
  - name: Install Python dependencies
22
22
  run: uv sync --locked
23
23
 
24
- - name: Run Python linting
25
- run: uv run ruff check .
26
-
27
- - name: Run Python formatting check
28
- run: uv run ruff format --check .
29
-
30
- - name: Run Python tests
31
- run: uv run pytest
32
-
33
24
  - name: Set up Node.js
34
25
  uses: actions/setup-node@v6
35
26
  with:
36
27
  node-version: '20'
37
28
 
29
+ # Before the Python tests: they invoke readability, which runs this.
38
30
  - name: Install Node.js dependencies
39
31
  run: npm install
40
32
 
33
+ # Runs ruff and ruff format as before, and adds the type and prose
34
+ # checks the separate steps never covered.
35
+ - name: Run linting
36
+ run: uv run readability check .
37
+
38
+ - name: Run Python tests
39
+ run: uv run pytest
40
+
41
41
  - name: Run Web linting
42
42
  run: npm run lint
43
43
 
@@ -0,0 +1,13 @@
1
+ .venv
2
+ node_modules
3
+ dist
4
+ src/lemming/web/mancha.js
5
+ test-results
6
+
7
+ # Prompt templates and web views are rendered, not read as markdown or HTML.
8
+ # Prettier is not template-aware: it joined a {{placeholder}} that expands to
9
+ # a multi-line section onto the end of a sentence, and moved a mancha binding
10
+ # onto its own line inside a <button>, changing the rendered whitespace. Both
11
+ # are product behaviour, so neither file set is prettier's to reflow.
12
+ src/lemming/prompts/
13
+ src/lemming/web/
@@ -21,7 +21,8 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
21
21
 
22
22
  WORKDIR /opt/lemming
23
23
  COPY . .
24
- RUN uv sync --no-dev --frozen
24
+ # The evals group carries the linters readability shells out to.
25
+ RUN uv sync --no-dev --group evals --frozen
25
26
 
26
27
  # Frontend dependencies are always needed: postinstall vendors mancha into
27
28
  # the web assets. The browsers are not, and they are more than half the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: lemming-cli
3
- Version: 0.4.3
3
+ Version: 0.4.4
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
@@ -15,7 +15,7 @@ Requires-Dist: fastapi>=0.124.4
15
15
  Requires-Dist: markdownify>=0.14.1
16
16
  Requires-Dist: pydantic>=2.12.5
17
17
  Requires-Dist: pyyaml>=6.0.3
18
- Requires-Dist: readability-cli>=0.7.0
18
+ Requires-Dist: readability-cli>=0.8.5
19
19
  Requires-Dist: requests>=2.32.3
20
20
  Requires-Dist: uvicorn>=0.33.0
21
21
  Description-Content-Type: text/markdown
@@ -137,13 +137,14 @@ to the whole tree outside a git repository.
137
137
  Each run is self-contained: nothing is read from the project's roadmap or its
138
138
  local hooks, one agent run is attempted, and the run's state directory is
139
139
  removed unless it failed — in which case it is kept, and its path printed, so
140
- the log can be read. Kept directories live in `~/.local/lemming/exec-*` and
141
- are retired automatically a week later, so a recent failure is always still
142
- there to inspect. Stdout carries the agent's message alone and everything
143
- else goes to stderr, so the output can be consumed directly. Stderr reports
144
- the ephemeral tasks file and task ID at startup; pass those to `lemming
145
- --tasks-file <path> status <id>` or `logs <id>` to inspect an active run. Use
146
- the global verbose flag (`lemming -v exec ...`) to stream runner activity.
140
+ the log can be read. Kept directories live in `~/.local/lemming/exec-*` and are
141
+ retired automatically a week later, so a recent failure is always still there to
142
+ inspect. Stdout carries the agent's message alone and everything else goes to
143
+ stderr, so the output can be consumed directly. Stderr reports the ephemeral
144
+ tasks file and task ID at startup; pass those to
145
+ `lemming --tasks-file <path> status <id>` or `logs <id>` to inspect an active
146
+ run. Use the global verbose flag (`lemming -v exec ...`) to stream runner
147
+ activity.
147
148
 
148
149
  Note that the agent runs unattended (`--yolo` by default), so it does not
149
150
  inherit the permission prompts of whatever launched it.
@@ -226,17 +227,16 @@ tasks may not fully achieve the stated goal. **Orchestrator Hooks** address this
226
227
  by running custom agents or scripts after each task execution to evaluate
227
228
  results and adapt the roadmap.
228
229
 
229
- Lemming runs every hook it discovers on the filesystem (including the
230
- built-in `roadmap` hook). Hooks are plain Markdown files, and udev-style
231
- filename conventions control their behavior:
230
+ Lemming runs every hook it discovers on the filesystem (including the built-in
231
+ `roadmap` hook). Hooks are plain Markdown files, and udev-style filename
232
+ conventions control their behavior:
232
233
 
233
- - **Ordering**: A numeric prefix sets the execution order (e.g.
234
- `10-lint.md` runs before `90-roadmap.md`); files without a prefix
235
- default to priority 50.
236
- - **Failure hooks**: Hooks at priority 90 and above also run when a task
237
- fails; all others only run on success.
238
- - **Disabling**: An empty file masks (disables) the hook of the same name
239
- from a lower-precedence layer.
234
+ - **Ordering**: A numeric prefix sets the execution order (e.g. `10-lint.md`
235
+ runs before `90-roadmap.md`); files without a prefix default to priority 50.
236
+ - **Failure hooks**: Hooks at priority 90 and above also run when a task fails;
237
+ all others only run on success.
238
+ - **Disabling**: An empty file masks (disables) the hook of the same name from a
239
+ lower-precedence layer.
240
240
 
241
241
  ```bash
242
242
  # Disable a hook for this project (writes an empty .lemming/hooks/50-lint.md)
@@ -255,16 +255,16 @@ Lemming comes with several built-in hooks to help manage your project:
255
255
  needs to be adjusted (e.g., adding a missing prerequisite, skipping obsolete
256
256
  tasks, or breaking down a broad task).
257
257
  - **`readability`**: A code quality and simplification hook that challenges
258
- unnecessary complexity and duplicate implementations, then reviews changes
259
- for adherence to the Google Style Guide and general readability using the
258
+ unnecessary complexity and duplicate implementations, then reviews changes for
259
+ adherence to the Google Style Guide and general readability using the
260
260
  [readability](https://github.com/owahltinez/readability) tool (exposed as
261
261
  `lemming readability`). It can record findings as task progress or suggest
262
262
  follow-up refactoring tasks.
263
263
  - **`testing`**: Verifies that changed behavior has focused test coverage and
264
264
  that the relevant tests pass.
265
- - **`ux`**: Reviews at most one critical user journey affected by a
266
- user-visible change. It reports only concrete, reproducible continuity gaps
267
- and exits immediately for non-user-facing tasks.
265
+ - **`ux`**: Reviews at most one critical user journey affected by a user-visible
266
+ change. It reports only concrete, reproducible continuity gaps and exits
267
+ immediately for non-user-facing tasks.
268
268
 
269
269
  ### Custom and Global Hooks
270
270
 
@@ -273,10 +273,10 @@ You can create your own hooks by adding Markdown files to:
273
273
  1. **Project-specific**: `.lemming/hooks/*.md`
274
274
  2. **Global**: `~/.local/lemming/hooks/*.md`
275
275
 
276
- To **override** a built-in hook, create a file with the same logical name
277
- (the numeric prefix is not part of the name, so `20-roadmap.md` overrides
278
- the built-in `90-roadmap.md` and also moves it to priority 20); delete the
279
- file to restore the built-in version.
276
+ To **override** a built-in hook, create a file with the same logical name (the
277
+ numeric prefix is not part of the name, so `20-roadmap.md` overrides the
278
+ built-in `90-roadmap.md` and also moves it to priority 20); delete the file to
279
+ restore the built-in version.
280
280
 
281
281
  Hooks follow a specific discovery precedence: **Project > Global > Built-in**.
282
282
  See [docs/HOOKS.md](docs/HOOKS.md) for more details.
@@ -316,22 +316,23 @@ See [docs/EVALS.md](docs/EVALS.md) for details.
316
316
 
317
317
  These come before the subcommand and apply to all of them.
318
318
 
319
- - **`-C, --project-dir <dir>`**: Run as if invoked from `<dir>`, addressing
320
- that project's roadmap. Relative paths in other options resolve against it.
321
- See [Working across projects](#working-across-projects).
319
+ - **`-C, --project-dir <dir>`**: Run as if invoked from `<dir>`, addressing that
320
+ project's roadmap. Relative paths in other options resolve against it. See
321
+ [Working across projects](#working-across-projects).
322
322
  - **`--tasks-file <path>`**: Point at a specific tasks file instead of the one
323
323
  derived from the current directory.
324
324
  - **`-v, --verbose`**: Show verbose output.
325
+ - **`--version`**: Print the installed version and exit.
325
326
 
326
327
  ### Roadmap Management
327
328
 
328
- - **`status [<id>]`**: Queue/history overview or deep-dive into a specific
329
- task, including supersession lineage, the last resolved runner command, and
330
- runner/orchestrator-hook execution times. Superseded and failed history
331
- stays visible in the default overview; `--verbose` also shows routine
329
+ - **`status [<id>]`**: Queue/history overview or deep-dive into a specific task,
330
+ including supersession lineage, the last resolved runner command, and
331
+ runner/orchestrator-hook execution times. Superseded and failed history stays
332
+ visible in the default overview; `--verbose` also shows routine
332
333
  completed/cancelled history.
333
- - `--json`: Emit machine-readable JSON instead of formatted text, so
334
- scripts never have to parse the internal state file.
334
+ - `--json`: Emit machine-readable JSON instead of formatted text, so scripts
335
+ never have to parse the internal state file.
335
336
  - `--brief`: Omit task descriptions, which otherwise dominate the output.
336
337
  - **`goal [<text>]`**: Set or view the long-term goal shared by all tasks.
337
338
  Supports `-f/--file`.
@@ -340,8 +341,8 @@ These come before the subcommand and apply to all of them.
340
341
  - **`edit <id>`**: Modify a task's description, runner, model, or position.
341
342
  - **`brief <id> [text]`**: View or set a task's long-form brief. Unlike the
342
343
  description it has no length cap, and it is appended to the runner prompt
343
- automatically — the right home for measured timings, exact failing
344
- selectors, or why a previous attempt was wrong. Supports `-f/--file`.
344
+ automatically — the right home for measured timings, exact failing selectors,
345
+ or why a previous attempt was wrong. Supports `-f/--file`.
345
346
  - **`delete <id>`**: Remove an unstarted task while retaining its runner log.
346
347
  Tasks with execution history require `--force`; autonomous restructuring
347
348
  should use `supersede`. Supports `--all` and `--completed` for bulk cleanup,
@@ -353,11 +354,11 @@ These come before the subcommand and apply to all of them.
353
354
  - `add <id> <finding>`: Record a new technical detail.
354
355
  - `edit <id> <index> <text>`: Modify an existing progress entry.
355
356
  - `delete <id> <index>`: Remove a progress entry.
356
- - **`config`**: Manage project configuration (runner, model, retries,
357
- time limit).
357
+ - **`config`**: Manage project configuration (runner, model, retries, time
358
+ limit).
358
359
  - `list`: View current configuration.
359
- - `set <key> <value>`: Update a setting. `set model default` clears a
360
- pinned model without touching the runner.
360
+ - `set <key> <value>`: Update a setting. `set model default` clears a pinned
361
+ model without touching the runner.
361
362
  - **`hooks`**: Manage orchestrator hooks.
362
363
  - `list`: View available and active hooks.
363
364
  - `install`: Install built-in hooks to the global directory.
@@ -380,12 +381,12 @@ These come before the subcommand and apply to all of them.
380
381
  - **`fail <id>`**: Mark a task as a terminal failure (will not be retried).
381
382
  - **`cancel <id>`**: Stop an in-progress task (kills the runner process).
382
383
  - **`reset <id>`**: Clear attempts and progress to start a task fresh.
383
- - Superseded tasks remain visible as non-failing history; replacement tasks
384
- link back through their parent task ID.
384
+ - Superseded tasks remain visible as non-failing history; replacement tasks link
385
+ back through their parent task ID.
385
386
  - **`logs [<id>]`**: Print a task's execution log to stdout, including retained
386
387
  logs for removed tasks. If no ID is provided, it defaults to the active or
387
- most recent task. Orchestrator hook output is automatically appended.
388
- Supports `--json` to wrap the log with its task ID and path.
388
+ most recent task. Orchestrator hook output is automatically appended. Supports
389
+ `--json` to wrap the log with its task ID and path.
389
390
 
390
391
  ### Execution
391
392
 
@@ -398,17 +399,17 @@ These come before the subcommand and apply to all of them.
398
399
  per-task `--runner`/`--model` overrides anything passed here.
399
400
  - **`exec [<description>]`**: Run one task, or one set of reviews, outside any
400
401
  roadmap. Prints the agent's closing message to stdout and everything else to
401
- stderr, including its tasks file and task ID at startup. Use `lemming -v
402
- exec ...` to stream runner activity. Exits non-zero if the task did not
403
- complete. See [One-off tasks](#one-off-tasks-without-a-roadmap).
402
+ stderr, including its tasks file and task ID at startup. Use
403
+ `lemming -v exec ...` to stream runner activity. Exits non-zero if the task
404
+ did not complete. See [One-off tasks](#one-off-tasks-without-a-roadmap).
404
405
  - `-f/--file`: Read the description from a file, or `-` for stdin. Unlike
405
406
  `add`, there is no length cap.
406
407
  - `--review <names>`: Reviews to run after the task, comma-separated or
407
408
  repeated; `all` selects every one. With no description, only the reviews
408
409
  run. Hooks that revise the roadmap cannot be selected.
409
- - `--scope <path|range>`: What the reviews look at. Paths pass through; a
410
- git revision range is resolved to the files it changed. Defaults to
411
- uncommitted work, or the whole tree outside a repository.
410
+ - `--scope <path|range>`: What the reviews look at. Paths pass through; a git
411
+ revision range is resolved to the files it changed. Defaults to uncommitted
412
+ work, or the whole tree outside a repository.
412
413
  - `--runner`, `--model`: Which agent CLI and model to use.
413
414
  - `--time-limit`: Minutes before the agent is killed (default 60, 0 for no
414
415
  limit).
@@ -422,12 +423,11 @@ These come before the subcommand and apply to all of them.
422
423
  - `--link`: Symlink instead of copying, so upgrades take effect immediately.
423
424
  - `--force`: Replace an existing installation of this skill.
424
425
  - `--dry-run`: Print what would happen, refusals included.
425
- - **`skill uninstall`**: Remove it again. Same `--to`, `--all`, and
426
- `--dry-run`.
426
+ - **`skill uninstall`**: Remove it again. Same `--to`, `--all`, and `--dry-run`.
427
427
  - **`stop`**: Stop the running loop and its runner.
428
428
  - `--after-current-task`: Drain instead — let the running task finish, then
429
- stop before claiming another. This is the safe way to change the runner
430
- or model without stranding work in flight.
429
+ stop before claiming another. This is the safe way to change the runner or
430
+ model without stranding work in flight.
431
431
  - **`serve`**: Launch the interactive Web UI.
432
432
  - `--port`: The port to bind the server to (default: 8999).
433
433
  - `--host`: The host address to bind the server to (default: 127.0.0.1).
@@ -440,10 +440,10 @@ These come before the subcommand and apply to all of them.
440
440
 
441
441
  ## Working across projects
442
442
 
443
- When work on one project turns up something that belongs to another — a bug in
444
- a dependency you also maintain, a doc fix in a sibling repo — file it directly
445
- on that project's roadmap with `-C` instead of routing it through an external
446
- issue tracker:
443
+ When work on one project turns up something that belongs to another — a bug in a
444
+ dependency you also maintain, a doc fix in a sibling repo — file it directly on
445
+ that project's roadmap with `-C` instead of routing it through an external issue
446
+ tracker:
447
447
 
448
448
  ```bash
449
449
  # From inside project A, queue work on project B
@@ -473,8 +473,8 @@ describing why the work was requested, so the report doesn't lose its origin.
473
473
  Lemming uses **fuzzy matching** to automatically inject the correct "YOLO"
474
474
  (auto-approve) and "Quiet" flags for popular tools:
475
475
 
476
- - **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions` and exposes
477
- the project workspace with `--add-dir`
476
+ - **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions` and exposes the
477
+ project workspace with `--add-dir`
478
478
  - **OpenCode**: Runs non-interactively via `opencode run`, adds `--format json`,
479
479
  and, in YOLO mode, adds `--auto`. For its Google provider, Lemming makes an
480
480
  existing `GOOGLE_API_KEY` or `GEMINI_API_KEY` available under OpenCode's
@@ -496,14 +496,14 @@ lemming config set model default # let the runner decide
496
496
 
497
497
  Precedence, highest first: an explicit `--model` inside a runner string, the
498
498
  task's `--model`, the project's `config model`, then anything passed after
499
- `lemming run --`. A per-task setting always wins over the loop-wide
500
- passthrough — the conflicting global flag is dropped rather than duplicated
501
- on the command line.
499
+ `lemming run --`. A per-task setting always wins over the loop-wide passthrough
500
+ — the conflicting global flag is dropped rather than duplicated on the command
501
+ line.
502
502
 
503
503
  ### Runner strings
504
504
 
505
- A runner is not limited to a binary name: any extra arguments in the string
506
- are appended to the command, which is another way to pin per-task behaviour.
505
+ A runner is not limited to a binary name: any extra arguments in the string are
506
+ appended to the command, which is another way to pin per-task behaviour.
507
507
 
508
508
  ```bash
509
509
  lemming add "Try the fast model" --runner "agy --model fast"
@@ -115,13 +115,14 @@ to the whole tree outside a git repository.
115
115
  Each run is self-contained: nothing is read from the project's roadmap or its
116
116
  local hooks, one agent run is attempted, and the run's state directory is
117
117
  removed unless it failed — in which case it is kept, and its path printed, so
118
- the log can be read. Kept directories live in `~/.local/lemming/exec-*` and
119
- are retired automatically a week later, so a recent failure is always still
120
- there to inspect. Stdout carries the agent's message alone and everything
121
- else goes to stderr, so the output can be consumed directly. Stderr reports
122
- the ephemeral tasks file and task ID at startup; pass those to `lemming
123
- --tasks-file <path> status <id>` or `logs <id>` to inspect an active run. Use
124
- the global verbose flag (`lemming -v exec ...`) to stream runner activity.
118
+ the log can be read. Kept directories live in `~/.local/lemming/exec-*` and are
119
+ retired automatically a week later, so a recent failure is always still there to
120
+ inspect. Stdout carries the agent's message alone and everything else goes to
121
+ stderr, so the output can be consumed directly. Stderr reports the ephemeral
122
+ tasks file and task ID at startup; pass those to
123
+ `lemming --tasks-file <path> status <id>` or `logs <id>` to inspect an active
124
+ run. Use the global verbose flag (`lemming -v exec ...`) to stream runner
125
+ activity.
125
126
 
126
127
  Note that the agent runs unattended (`--yolo` by default), so it does not
127
128
  inherit the permission prompts of whatever launched it.
@@ -204,17 +205,16 @@ tasks may not fully achieve the stated goal. **Orchestrator Hooks** address this
204
205
  by running custom agents or scripts after each task execution to evaluate
205
206
  results and adapt the roadmap.
206
207
 
207
- Lemming runs every hook it discovers on the filesystem (including the
208
- built-in `roadmap` hook). Hooks are plain Markdown files, and udev-style
209
- filename conventions control their behavior:
208
+ Lemming runs every hook it discovers on the filesystem (including the built-in
209
+ `roadmap` hook). Hooks are plain Markdown files, and udev-style filename
210
+ conventions control their behavior:
210
211
 
211
- - **Ordering**: A numeric prefix sets the execution order (e.g.
212
- `10-lint.md` runs before `90-roadmap.md`); files without a prefix
213
- default to priority 50.
214
- - **Failure hooks**: Hooks at priority 90 and above also run when a task
215
- fails; all others only run on success.
216
- - **Disabling**: An empty file masks (disables) the hook of the same name
217
- from a lower-precedence layer.
212
+ - **Ordering**: A numeric prefix sets the execution order (e.g. `10-lint.md`
213
+ runs before `90-roadmap.md`); files without a prefix default to priority 50.
214
+ - **Failure hooks**: Hooks at priority 90 and above also run when a task fails;
215
+ all others only run on success.
216
+ - **Disabling**: An empty file masks (disables) the hook of the same name from a
217
+ lower-precedence layer.
218
218
 
219
219
  ```bash
220
220
  # Disable a hook for this project (writes an empty .lemming/hooks/50-lint.md)
@@ -233,16 +233,16 @@ Lemming comes with several built-in hooks to help manage your project:
233
233
  needs to be adjusted (e.g., adding a missing prerequisite, skipping obsolete
234
234
  tasks, or breaking down a broad task).
235
235
  - **`readability`**: A code quality and simplification hook that challenges
236
- unnecessary complexity and duplicate implementations, then reviews changes
237
- for adherence to the Google Style Guide and general readability using the
236
+ unnecessary complexity and duplicate implementations, then reviews changes for
237
+ adherence to the Google Style Guide and general readability using the
238
238
  [readability](https://github.com/owahltinez/readability) tool (exposed as
239
239
  `lemming readability`). It can record findings as task progress or suggest
240
240
  follow-up refactoring tasks.
241
241
  - **`testing`**: Verifies that changed behavior has focused test coverage and
242
242
  that the relevant tests pass.
243
- - **`ux`**: Reviews at most one critical user journey affected by a
244
- user-visible change. It reports only concrete, reproducible continuity gaps
245
- and exits immediately for non-user-facing tasks.
243
+ - **`ux`**: Reviews at most one critical user journey affected by a user-visible
244
+ change. It reports only concrete, reproducible continuity gaps and exits
245
+ immediately for non-user-facing tasks.
246
246
 
247
247
  ### Custom and Global Hooks
248
248
 
@@ -251,10 +251,10 @@ You can create your own hooks by adding Markdown files to:
251
251
  1. **Project-specific**: `.lemming/hooks/*.md`
252
252
  2. **Global**: `~/.local/lemming/hooks/*.md`
253
253
 
254
- To **override** a built-in hook, create a file with the same logical name
255
- (the numeric prefix is not part of the name, so `20-roadmap.md` overrides
256
- the built-in `90-roadmap.md` and also moves it to priority 20); delete the
257
- file to restore the built-in version.
254
+ To **override** a built-in hook, create a file with the same logical name (the
255
+ numeric prefix is not part of the name, so `20-roadmap.md` overrides the
256
+ built-in `90-roadmap.md` and also moves it to priority 20); delete the file to
257
+ restore the built-in version.
258
258
 
259
259
  Hooks follow a specific discovery precedence: **Project > Global > Built-in**.
260
260
  See [docs/HOOKS.md](docs/HOOKS.md) for more details.
@@ -294,22 +294,23 @@ See [docs/EVALS.md](docs/EVALS.md) for details.
294
294
 
295
295
  These come before the subcommand and apply to all of them.
296
296
 
297
- - **`-C, --project-dir <dir>`**: Run as if invoked from `<dir>`, addressing
298
- that project's roadmap. Relative paths in other options resolve against it.
299
- See [Working across projects](#working-across-projects).
297
+ - **`-C, --project-dir <dir>`**: Run as if invoked from `<dir>`, addressing that
298
+ project's roadmap. Relative paths in other options resolve against it. See
299
+ [Working across projects](#working-across-projects).
300
300
  - **`--tasks-file <path>`**: Point at a specific tasks file instead of the one
301
301
  derived from the current directory.
302
302
  - **`-v, --verbose`**: Show verbose output.
303
+ - **`--version`**: Print the installed version and exit.
303
304
 
304
305
  ### Roadmap Management
305
306
 
306
- - **`status [<id>]`**: Queue/history overview or deep-dive into a specific
307
- task, including supersession lineage, the last resolved runner command, and
308
- runner/orchestrator-hook execution times. Superseded and failed history
309
- stays visible in the default overview; `--verbose` also shows routine
307
+ - **`status [<id>]`**: Queue/history overview or deep-dive into a specific task,
308
+ including supersession lineage, the last resolved runner command, and
309
+ runner/orchestrator-hook execution times. Superseded and failed history stays
310
+ visible in the default overview; `--verbose` also shows routine
310
311
  completed/cancelled history.
311
- - `--json`: Emit machine-readable JSON instead of formatted text, so
312
- scripts never have to parse the internal state file.
312
+ - `--json`: Emit machine-readable JSON instead of formatted text, so scripts
313
+ never have to parse the internal state file.
313
314
  - `--brief`: Omit task descriptions, which otherwise dominate the output.
314
315
  - **`goal [<text>]`**: Set or view the long-term goal shared by all tasks.
315
316
  Supports `-f/--file`.
@@ -318,8 +319,8 @@ These come before the subcommand and apply to all of them.
318
319
  - **`edit <id>`**: Modify a task's description, runner, model, or position.
319
320
  - **`brief <id> [text]`**: View or set a task's long-form brief. Unlike the
320
321
  description it has no length cap, and it is appended to the runner prompt
321
- automatically — the right home for measured timings, exact failing
322
- selectors, or why a previous attempt was wrong. Supports `-f/--file`.
322
+ automatically — the right home for measured timings, exact failing selectors,
323
+ or why a previous attempt was wrong. Supports `-f/--file`.
323
324
  - **`delete <id>`**: Remove an unstarted task while retaining its runner log.
324
325
  Tasks with execution history require `--force`; autonomous restructuring
325
326
  should use `supersede`. Supports `--all` and `--completed` for bulk cleanup,
@@ -331,11 +332,11 @@ These come before the subcommand and apply to all of them.
331
332
  - `add <id> <finding>`: Record a new technical detail.
332
333
  - `edit <id> <index> <text>`: Modify an existing progress entry.
333
334
  - `delete <id> <index>`: Remove a progress entry.
334
- - **`config`**: Manage project configuration (runner, model, retries,
335
- time limit).
335
+ - **`config`**: Manage project configuration (runner, model, retries, time
336
+ limit).
336
337
  - `list`: View current configuration.
337
- - `set <key> <value>`: Update a setting. `set model default` clears a
338
- pinned model without touching the runner.
338
+ - `set <key> <value>`: Update a setting. `set model default` clears a pinned
339
+ model without touching the runner.
339
340
  - **`hooks`**: Manage orchestrator hooks.
340
341
  - `list`: View available and active hooks.
341
342
  - `install`: Install built-in hooks to the global directory.
@@ -358,12 +359,12 @@ These come before the subcommand and apply to all of them.
358
359
  - **`fail <id>`**: Mark a task as a terminal failure (will not be retried).
359
360
  - **`cancel <id>`**: Stop an in-progress task (kills the runner process).
360
361
  - **`reset <id>`**: Clear attempts and progress to start a task fresh.
361
- - Superseded tasks remain visible as non-failing history; replacement tasks
362
- link back through their parent task ID.
362
+ - Superseded tasks remain visible as non-failing history; replacement tasks link
363
+ back through their parent task ID.
363
364
  - **`logs [<id>]`**: Print a task's execution log to stdout, including retained
364
365
  logs for removed tasks. If no ID is provided, it defaults to the active or
365
- most recent task. Orchestrator hook output is automatically appended.
366
- Supports `--json` to wrap the log with its task ID and path.
366
+ most recent task. Orchestrator hook output is automatically appended. Supports
367
+ `--json` to wrap the log with its task ID and path.
367
368
 
368
369
  ### Execution
369
370
 
@@ -376,17 +377,17 @@ These come before the subcommand and apply to all of them.
376
377
  per-task `--runner`/`--model` overrides anything passed here.
377
378
  - **`exec [<description>]`**: Run one task, or one set of reviews, outside any
378
379
  roadmap. Prints the agent's closing message to stdout and everything else to
379
- stderr, including its tasks file and task ID at startup. Use `lemming -v
380
- exec ...` to stream runner activity. Exits non-zero if the task did not
381
- complete. See [One-off tasks](#one-off-tasks-without-a-roadmap).
380
+ stderr, including its tasks file and task ID at startup. Use
381
+ `lemming -v exec ...` to stream runner activity. Exits non-zero if the task
382
+ did not complete. See [One-off tasks](#one-off-tasks-without-a-roadmap).
382
383
  - `-f/--file`: Read the description from a file, or `-` for stdin. Unlike
383
384
  `add`, there is no length cap.
384
385
  - `--review <names>`: Reviews to run after the task, comma-separated or
385
386
  repeated; `all` selects every one. With no description, only the reviews
386
387
  run. Hooks that revise the roadmap cannot be selected.
387
- - `--scope <path|range>`: What the reviews look at. Paths pass through; a
388
- git revision range is resolved to the files it changed. Defaults to
389
- uncommitted work, or the whole tree outside a repository.
388
+ - `--scope <path|range>`: What the reviews look at. Paths pass through; a git
389
+ revision range is resolved to the files it changed. Defaults to uncommitted
390
+ work, or the whole tree outside a repository.
390
391
  - `--runner`, `--model`: Which agent CLI and model to use.
391
392
  - `--time-limit`: Minutes before the agent is killed (default 60, 0 for no
392
393
  limit).
@@ -400,12 +401,11 @@ These come before the subcommand and apply to all of them.
400
401
  - `--link`: Symlink instead of copying, so upgrades take effect immediately.
401
402
  - `--force`: Replace an existing installation of this skill.
402
403
  - `--dry-run`: Print what would happen, refusals included.
403
- - **`skill uninstall`**: Remove it again. Same `--to`, `--all`, and
404
- `--dry-run`.
404
+ - **`skill uninstall`**: Remove it again. Same `--to`, `--all`, and `--dry-run`.
405
405
  - **`stop`**: Stop the running loop and its runner.
406
406
  - `--after-current-task`: Drain instead — let the running task finish, then
407
- stop before claiming another. This is the safe way to change the runner
408
- or model without stranding work in flight.
407
+ stop before claiming another. This is the safe way to change the runner or
408
+ model without stranding work in flight.
409
409
  - **`serve`**: Launch the interactive Web UI.
410
410
  - `--port`: The port to bind the server to (default: 8999).
411
411
  - `--host`: The host address to bind the server to (default: 127.0.0.1).
@@ -418,10 +418,10 @@ These come before the subcommand and apply to all of them.
418
418
 
419
419
  ## Working across projects
420
420
 
421
- When work on one project turns up something that belongs to another — a bug in
422
- a dependency you also maintain, a doc fix in a sibling repo — file it directly
423
- on that project's roadmap with `-C` instead of routing it through an external
424
- issue tracker:
421
+ When work on one project turns up something that belongs to another — a bug in a
422
+ dependency you also maintain, a doc fix in a sibling repo — file it directly on
423
+ that project's roadmap with `-C` instead of routing it through an external issue
424
+ tracker:
425
425
 
426
426
  ```bash
427
427
  # From inside project A, queue work on project B
@@ -451,8 +451,8 @@ describing why the work was requested, so the report doesn't lose its origin.
451
451
  Lemming uses **fuzzy matching** to automatically inject the correct "YOLO"
452
452
  (auto-approve) and "Quiet" flags for popular tools:
453
453
 
454
- - **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions` and exposes
455
- the project workspace with `--add-dir`
454
+ - **Antigravity (`agy`)**: Adds `--dangerously-skip-permissions` and exposes the
455
+ project workspace with `--add-dir`
456
456
  - **OpenCode**: Runs non-interactively via `opencode run`, adds `--format json`,
457
457
  and, in YOLO mode, adds `--auto`. For its Google provider, Lemming makes an
458
458
  existing `GOOGLE_API_KEY` or `GEMINI_API_KEY` available under OpenCode's
@@ -474,14 +474,14 @@ lemming config set model default # let the runner decide
474
474
 
475
475
  Precedence, highest first: an explicit `--model` inside a runner string, the
476
476
  task's `--model`, the project's `config model`, then anything passed after
477
- `lemming run --`. A per-task setting always wins over the loop-wide
478
- passthrough — the conflicting global flag is dropped rather than duplicated
479
- on the command line.
477
+ `lemming run --`. A per-task setting always wins over the loop-wide passthrough
478
+ — the conflicting global flag is dropped rather than duplicated on the command
479
+ line.
480
480
 
481
481
  ### Runner strings
482
482
 
483
- A runner is not limited to a binary name: any extra arguments in the string
484
- are appended to the command, which is another way to pin per-task behaviour.
483
+ A runner is not limited to a binary name: any extra arguments in the string are
484
+ appended to the command, which is another way to pin per-task behaviour.
485
485
 
486
486
  ```bash
487
487
  lemming add "Try the fast model" --runner "agy --model fast"