lemming-cli 0.5.0__tar.gz → 0.5.2__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 (191) hide show
  1. lemming_cli-0.5.0/README.md → lemming_cli-0.5.2/PKG-INFO +39 -5
  2. lemming_cli-0.5.0/PKG-INFO → lemming_cli-0.5.2/README.md +16 -28
  3. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/SKILL.md +6 -2
  4. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docs/HOOKS.md +20 -5
  5. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/pyproject.toml +3 -3
  6. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/conftest.py +4 -8
  7. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/context_test.py +9 -6
  8. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/exec_cli.py +1 -1
  9. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/hooks_test.py +1 -0
  10. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/models_test.py +3 -1
  11. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/lifecycle_test.py +1 -0
  12. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/queries_test.py +1 -0
  13. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/uv.lock +9 -9
  14. lemming_cli-0.5.0/pyrefly.toml +0 -21
  15. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.dockerignore +0 -0
  16. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.github/workflows/ci.yml +0 -0
  17. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.github/workflows/publish.yml +0 -0
  18. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.github/workflows/screenshots.yml +0 -0
  19. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.gitignore +0 -0
  20. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.prettierignore +0 -0
  21. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/.prettierrc +0 -0
  22. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/Dockerfile +0 -0
  23. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/LICENSE +0 -0
  24. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/biome.json +0 -0
  25. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docker-compose.yml +0 -0
  26. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docs/EVALS.md +0 -0
  27. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docs/screenshots/dashboard-desktop.png +0 -0
  28. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docs/screenshots/dashboard-mobile.png +0 -0
  29. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docs/screenshots/task-log-desktop.png +0 -0
  30. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/docs/screenshots/task-log-mobile.png +0 -0
  31. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/package-lock.json +0 -0
  32. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/package.json +0 -0
  33. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/playwright.config.js +0 -0
  34. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/__init__.py +0 -0
  35. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/__init__.py +0 -0
  36. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/auth.py +0 -0
  37. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/auth_test.py +0 -0
  38. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/config.py +0 -0
  39. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/config_test.py +0 -0
  40. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/context.py +0 -0
  41. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/directories.py +0 -0
  42. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/directories_test.py +0 -0
  43. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/files.py +0 -0
  44. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/files_test.py +0 -0
  45. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/hooks.py +0 -0
  46. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/hooks_test.py +0 -0
  47. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/logging.py +0 -0
  48. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/logging_test.py +0 -0
  49. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/loop.py +0 -0
  50. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/loop_test.py +0 -0
  51. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/main.py +0 -0
  52. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/main_test.py +0 -0
  53. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/tasks.py +0 -0
  54. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api/tasks_test.py +0 -0
  55. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/api_test.py +0 -0
  56. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/brief_test.py +0 -0
  57. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/__init__.py +0 -0
  58. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/brief.py +0 -0
  59. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/config.py +0 -0
  60. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/config_test.py +0 -0
  61. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/exec_cli_test.py +0 -0
  62. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/goal.py +0 -0
  63. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/goal_test.py +0 -0
  64. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/hooks.py +0 -0
  65. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/hooks_test.py +0 -0
  66. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/machine_output_test.py +0 -0
  67. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/main.py +0 -0
  68. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/main_test.py +0 -0
  69. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/operations.py +0 -0
  70. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/operations_test.py +0 -0
  71. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/progress.py +0 -0
  72. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/progress_test.py +0 -0
  73. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/readability_cli.py +0 -0
  74. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/readability_cli_test.py +0 -0
  75. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/skill.py +0 -0
  76. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/skill_test.py +0 -0
  77. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/stop_test.py +0 -0
  78. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/tasks.py +0 -0
  79. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli/tasks_test.py +0 -0
  80. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/cli_test.py +0 -0
  81. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/conftest.py +0 -0
  82. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/__init__.py +0 -0
  83. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/__main__.py +0 -0
  84. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/cli.py +0 -0
  85. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/cli_test.py +0 -0
  86. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/container.py +0 -0
  87. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/container_test.py +0 -0
  88. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/fixtures.py +0 -0
  89. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/fixtures_test.py +0 -0
  90. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/harness.py +0 -0
  91. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/harness_test.py +0 -0
  92. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/metrics.py +0 -0
  93. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/metrics_test.py +0 -0
  94. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/base/README.md +0 -0
  95. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/base/calc/__init__.py +0 -0
  96. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/base/calc/legacy.py +0 -0
  97. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/base/calc/ops.py +0 -0
  98. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/base/calc/ops_test.py +0 -0
  99. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/clean/calc/ops.py +0 -0
  100. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/clean/calc/ops_test.py +0 -0
  101. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/dead-code/calc/ops.py +0 -0
  102. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/dead-code/calc/ops_test.py +0 -0
  103. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/duplicated-behavior/calc/ops.py +0 -0
  104. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/duplicated-behavior/calc/ops_test.py +0 -0
  105. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/false-reuse/calc/limits.py +0 -0
  106. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/false-reuse/calc/limits_test.py +0 -0
  107. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/lint-debt/calc/ops.py +0 -0
  108. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/readability/lint-debt/calc/ops_test.py +0 -0
  109. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/add-only/README.md +0 -0
  110. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/add-only/calc/__init__.py +0 -0
  111. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/add-only/calc/ops.py +0 -0
  112. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/add-only/calc/ops_test.py +0 -0
  113. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/buggy-subtract/README.md +0 -0
  114. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/buggy-subtract/calc/__init__.py +0 -0
  115. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/buggy-subtract/calc/ops.py +0 -0
  116. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/buggy-subtract/calc/ops_test.py +0 -0
  117. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/full-ops/README.md +0 -0
  118. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/full-ops/calc/__init__.py +0 -0
  119. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/full-ops/calc/ops.py +0 -0
  120. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/full-ops/calc/ops_test.py +0 -0
  121. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/unwired-cli/README.md +0 -0
  122. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/unwired-cli/calc/__init__.py +0 -0
  123. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/unwired-cli/calc/cli.py +0 -0
  124. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/unwired-cli/calc/cli_test.py +0 -0
  125. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/unwired-cli/calc/ops.py +0 -0
  126. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/roadmap/unwired-cli/calc/ops_test.py +0 -0
  127. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/task/hidden/stats/summary_hidden_test.py +0 -0
  128. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/task/summary/README.md +0 -0
  129. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/task/summary/stats/__init__.py +0 -0
  130. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/task/summary/stats/summary.py +0 -0
  131. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/projects/task/summary/stats/summary_test.py +0 -0
  132. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/readability.py +0 -0
  133. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/readability_test.py +0 -0
  134. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/report.py +0 -0
  135. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/report_test.py +0 -0
  136. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/roadmap.py +0 -0
  137. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/roadmap_test.py +0 -0
  138. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/scenarios.py +0 -0
  139. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/scenarios_test.py +0 -0
  140. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/suites.py +0 -0
  141. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/task.py +0 -0
  142. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/task_test.py +0 -0
  143. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/trial.py +0 -0
  144. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/evals/trial_test.py +0 -0
  145. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/hooks.py +0 -0
  146. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/integration_test.py +0 -0
  147. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/main.py +0 -0
  148. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/main_test.py +0 -0
  149. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/models.py +0 -0
  150. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/orchestrator.py +0 -0
  151. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/orchestrator_test.py +0 -0
  152. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/paths.py +0 -0
  153. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/paths_test.py +0 -0
  154. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/persistence.py +0 -0
  155. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/persistence_test.py +0 -0
  156. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts/hooks/50-readability.md +0 -0
  157. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts/hooks/60-testing.md +0 -0
  158. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts/hooks/70-ux.md +0 -0
  159. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts/hooks/90-roadmap.md +0 -0
  160. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts/taskrunner.md +0 -0
  161. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts.py +0 -0
  162. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/prompts_test.py +0 -0
  163. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/providers.py +0 -0
  164. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/providers_test.py +0 -0
  165. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/runner.py +0 -0
  166. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/runner_test.py +0 -0
  167. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/scope.py +0 -0
  168. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/scope_test.py +0 -0
  169. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/shutdown.py +0 -0
  170. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/shutdown_integration_test.py +0 -0
  171. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/shutdown_test.py +0 -0
  172. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/__init__.py +0 -0
  173. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/lifecycle.py +0 -0
  174. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/limits.py +0 -0
  175. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/operations.py +0 -0
  176. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/operations_test.py +0 -0
  177. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/progress.py +0 -0
  178. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/progress_test.py +0 -0
  179. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/tasks/queries.py +0 -0
  180. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/dashboard.spec.js +0 -0
  181. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/dashboard.test.js +0 -0
  182. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/favicon.js +0 -0
  183. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/favicon.spec.js +0 -0
  184. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/files.html +0 -0
  185. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/files.spec.js +0 -0
  186. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/index.html +0 -0
  187. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/index.js +0 -0
  188. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/logs.html +0 -0
  189. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/logs.test.js +0 -0
  190. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/mancha.js +0 -0
  191. {lemming_cli-0.5.0 → lemming_cli-0.5.2}/src/lemming/web/screenshots.spec.js +0 -0
@@ -1,3 +1,26 @@
1
+ Metadata-Version: 2.5
2
+ Name: lemming-cli
3
+ Version: 0.5.2
4
+ Summary: An autonomous, iterative task runner for AI coding agents.
5
+ Project-URL: Homepage, https://github.com/owahltinez/lemming
6
+ Project-URL: Repository, https://github.com/owahltinez/lemming
7
+ Author: Lemming Contributors
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: agents,ai,antigravity,automation,claude,opencode
11
+ Requires-Python: >=3.12
12
+ Requires-Dist: beautifulsoup4>=4.13.3
13
+ Requires-Dist: click-agentcli>=0.4.1
14
+ Requires-Dist: click>=8.0.0
15
+ Requires-Dist: fastapi>=0.124.4
16
+ Requires-Dist: markdownify>=0.14.1
17
+ Requires-Dist: pydantic>=2.12.5
18
+ Requires-Dist: pyyaml>=6.0.3
19
+ Requires-Dist: readability-cli>=0.10.0
20
+ Requires-Dist: requests>=2.32.3
21
+ Requires-Dist: uvicorn>=0.33.0
22
+ Description-Content-Type: text/markdown
23
+
1
24
  # Lemming 🐹
2
25
 
3
26
  **The transparent, tool-agnostic orchestrator for autonomous AI coding agents.**
@@ -121,6 +144,14 @@ lemming exec "Add pagination to the tasks API" --review all
121
144
  which is resolved to the files it changed. It defaults to uncommitted work, or
122
145
  to the whole tree outside a git repository.
123
146
 
147
+ Reviews may edit the working directory. The built-in readability review
148
+ intentionally applies fixes, and testing may repair production code or tests.
149
+ UX is instructed to remain advisory, but its prompt and `--no-yolo` do not
150
+ enforce filesystem isolation. A global review override may perform any actions
151
+ its prompt requests. When isolation is required, follow the working-copy
152
+ guidance below and pass a separate VCS-managed working copy with
153
+ `lemming -C <working-copy> exec --review ...`.
154
+
124
155
  Each run is self-contained: nothing is read from the project's roadmap or its
125
156
  local hooks, it runs only the requested task and reviews, and its state
126
157
  directory is removed unless it failed — in which case it is kept, and its path
@@ -261,13 +292,15 @@ Lemming comes with several built-in hooks to help manage your project:
261
292
  unnecessary complexity and duplicate implementations, then reviews changes for
262
293
  adherence to the Google Style Guide and general readability using the
263
294
  [readability](https://github.com/owahltinez/readability) tool (exposed as
264
- `lemming readability`). It can record findings as task progress or suggest
265
- follow-up refactoring tasks.
295
+ `lemming readability`). It intentionally applies automated and targeted fixes
296
+ in the working directory and records broader findings as task progress.
266
297
  - **`testing`**: Verifies that changed behavior has focused test coverage and
267
- that the relevant tests pass.
298
+ that the relevant tests pass. It may repair small, targeted problems in
299
+ production code or tests and may add, merge, or remove tests.
268
300
  - **`ux`**: Reviews at most one critical user journey affected by a user-visible
269
301
  change. It reports only concrete, reproducible continuity gaps and exits
270
- immediately for non-user-facing tasks.
302
+ immediately for non-user-facing tasks. Its prompt instructs the agent to stay
303
+ advisory, but this is not sandbox-enforced.
271
304
 
272
305
  ### Custom and Global Hooks
273
306
 
@@ -409,7 +442,8 @@ These come before the subcommand and apply to all of them.
409
442
  `add`, there is no length cap.
410
443
  - `--review <names>`: Reviews to run after the task, comma-separated or
411
444
  repeated; `all` selects every one. With no description, only the reviews
412
- run. Hooks that revise the roadmap cannot be selected.
445
+ run. Reviews may edit the working directory. Hooks that revise the roadmap
446
+ cannot be selected.
413
447
  - `--scope <path|range>`: What the reviews look at. Paths pass through; a git
414
448
  revision range is resolved to the files it changed. Defaults to uncommitted
415
449
  work, or the whole tree outside a repository.
@@ -1,26 +1,3 @@
1
- Metadata-Version: 2.5
2
- Name: lemming-cli
3
- Version: 0.5.0
4
- Summary: An autonomous, iterative task runner for AI coding agents.
5
- Project-URL: Homepage, https://github.com/owahltinez/lemming
6
- Project-URL: Repository, https://github.com/owahltinez/lemming
7
- Author: Lemming Contributors
8
- License: MIT
9
- License-File: LICENSE
10
- Keywords: agents,ai,antigravity,automation,claude,opencode
11
- Requires-Python: >=3.12
12
- Requires-Dist: beautifulsoup4>=4.13.3
13
- Requires-Dist: click-agentcli>=0.3.0
14
- Requires-Dist: click>=8.0.0
15
- Requires-Dist: fastapi>=0.124.4
16
- Requires-Dist: markdownify>=0.14.1
17
- Requires-Dist: pydantic>=2.12.5
18
- Requires-Dist: pyyaml>=6.0.3
19
- Requires-Dist: readability-cli>=0.9.0
20
- Requires-Dist: requests>=2.32.3
21
- Requires-Dist: uvicorn>=0.33.0
22
- Description-Content-Type: text/markdown
23
-
24
1
  # Lemming 🐹
25
2
 
26
3
  **The transparent, tool-agnostic orchestrator for autonomous AI coding agents.**
@@ -144,6 +121,14 @@ lemming exec "Add pagination to the tasks API" --review all
144
121
  which is resolved to the files it changed. It defaults to uncommitted work, or
145
122
  to the whole tree outside a git repository.
146
123
 
124
+ Reviews may edit the working directory. The built-in readability review
125
+ intentionally applies fixes, and testing may repair production code or tests.
126
+ UX is instructed to remain advisory, but its prompt and `--no-yolo` do not
127
+ enforce filesystem isolation. A global review override may perform any actions
128
+ its prompt requests. When isolation is required, follow the working-copy
129
+ guidance below and pass a separate VCS-managed working copy with
130
+ `lemming -C <working-copy> exec --review ...`.
131
+
147
132
  Each run is self-contained: nothing is read from the project's roadmap or its
148
133
  local hooks, it runs only the requested task and reviews, and its state
149
134
  directory is removed unless it failed — in which case it is kept, and its path
@@ -284,13 +269,15 @@ Lemming comes with several built-in hooks to help manage your project:
284
269
  unnecessary complexity and duplicate implementations, then reviews changes for
285
270
  adherence to the Google Style Guide and general readability using the
286
271
  [readability](https://github.com/owahltinez/readability) tool (exposed as
287
- `lemming readability`). It can record findings as task progress or suggest
288
- follow-up refactoring tasks.
272
+ `lemming readability`). It intentionally applies automated and targeted fixes
273
+ in the working directory and records broader findings as task progress.
289
274
  - **`testing`**: Verifies that changed behavior has focused test coverage and
290
- that the relevant tests pass.
275
+ that the relevant tests pass. It may repair small, targeted problems in
276
+ production code or tests and may add, merge, or remove tests.
291
277
  - **`ux`**: Reviews at most one critical user journey affected by a user-visible
292
278
  change. It reports only concrete, reproducible continuity gaps and exits
293
- immediately for non-user-facing tasks.
279
+ immediately for non-user-facing tasks. Its prompt instructs the agent to stay
280
+ advisory, but this is not sandbox-enforced.
294
281
 
295
282
  ### Custom and Global Hooks
296
283
 
@@ -432,7 +419,8 @@ These come before the subcommand and apply to all of them.
432
419
  `add`, there is no length cap.
433
420
  - `--review <names>`: Reviews to run after the task, comma-separated or
434
421
  repeated; `all` selects every one. With no description, only the reviews
435
- run. Hooks that revise the roadmap cannot be selected.
422
+ run. Reviews may edit the working directory. Hooks that revise the roadmap
423
+ cannot be selected.
436
424
  - `--scope <path|range>`: What the reviews look at. Paths pass through; a git
437
425
  revision range is resolved to the files it changed. Defaults to uncommitted
438
426
  work, or the whole tree outside a repository.
@@ -136,8 +136,12 @@ lemming -C /tmp/pr-123 exec --review testing --scope main...HEAD
136
136
  which is resolved to the files it changed. It defaults to uncommitted work, and
137
137
  a clean tree stops the run rather than reviewing everything.
138
138
 
139
- Reviews **edit the workspace** — readability applies fixes and reruns checks.
140
- That is the point, but it means a review is not read-only.
139
+ Reviews may edit the working directory. Readability intentionally applies fixes,
140
+ and testing may repair production code or tests. UX is instructed to remain
141
+ advisory, but its prompt and `--no-yolo` do not enforce filesystem isolation. A
142
+ global review override may perform any actions its prompt requests. When
143
+ isolation is required, use a separate VCS-managed working copy and pass it with
144
+ the global `-C` option, as in the example above.
141
145
 
142
146
  ## Drive a roadmap
143
147
 
@@ -54,20 +54,34 @@ a broad task).
54
54
  A code quality and simplification hook that challenges unnecessary complexity,
55
55
  indirection, and duplicated implementations before reviewing changes for
56
56
  adherence to the Google Style Guide and general readability using the bundled
57
- `lemming readability` tool. It provides feedback via task progress or suggests
58
- follow-up refactoring tasks.
57
+ `lemming readability` tool. It intentionally applies automated and targeted
58
+ fixes in the working directory and records broader findings as task progress.
59
59
 
60
60
  ### `testing`
61
61
 
62
62
  Checks that changed behavior has focused test coverage and runs the relevant
63
- tests. It records larger testing gaps as task progress for the roadmap hook.
63
+ tests. It may repair small, targeted problems in production code or tests and
64
+ may add, merge, or remove tests. It records larger testing gaps as task progress
65
+ for the roadmap hook.
64
66
 
65
67
  ### `ux`
66
68
 
67
69
  A lightweight journey-continuity review for user-visible changes. It considers
68
70
  at most one affected critical journey, reports only concrete and reproducible
69
71
  gaps, and exits immediately when the task did not change user-facing behavior.
70
- It runs after `testing` and before `roadmap`.
72
+ Its prompt instructs the agent to stay advisory, but this is not
73
+ sandbox-enforced. It runs after `testing` and before `roadmap`.
74
+
75
+ ### Reviews Are Not Read-Only
76
+
77
+ When selected with `lemming exec --review`, the hooks above may edit the working
78
+ directory. Prompt instructions and `--no-yolo` do not enforce filesystem
79
+ isolation. When isolation is required, create a separate VCS-managed working
80
+ copy and pass it through the global option:
81
+
82
+ ```bash
83
+ lemming -C <working-copy> exec --review <name>
84
+ ```
71
85
 
72
86
  ### Editing Built-in Hook Prompts
73
87
 
@@ -104,7 +118,8 @@ Because of this precedence order, overriding a built-in hook only requires
104
118
  creating a Markdown file with the same logical name in the project or global
105
119
  directory (e.g. `~/.local/lemming/hooks/90-roadmap.md`); delete the file to
106
120
  restore the built-in version. Global hooks are available to all Lemming projects
107
- on the system.
121
+ on the system. A global review override selected by `lemming exec --review` may
122
+ perform any actions its prompt requests.
108
123
 
109
124
  ### Example: `lint` hook
110
125
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "lemming-cli"
7
- version = "0.5.0"
7
+ version = "0.5.2"
8
8
  description = "An autonomous, iterative task runner for AI coding agents."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -16,12 +16,12 @@ keywords = ["ai", "agents", "automation", "antigravity", "claude", "opencode"]
16
16
  dependencies = [
17
17
  "beautifulsoup4>=4.13.3",
18
18
  "click>=8.0.0",
19
- "click-agentcli>=0.3.0",
19
+ "click-agentcli>=0.4.1",
20
20
  "fastapi>=0.124.4",
21
21
  "markdownify>=0.14.1",
22
22
  "pydantic>=2.12.5",
23
23
  "pyyaml>=6.0.3",
24
- "readability-cli>=0.9.0",
24
+ "readability-cli>=0.10.0",
25
25
  "requests>=2.32.3",
26
26
  "uvicorn>=0.33.0",
27
27
  ]
@@ -86,8 +86,7 @@ def git_repo():
86
86
  api.app.state.root = pathlib.Path(test_dir).resolve()
87
87
 
88
88
  # Clear cached git repo check from previous tests
89
- if hasattr(paths.in_git_repo, "_result"):
90
- del paths.in_git_repo._result
89
+ paths.in_git_repo.cache_clear()
91
90
 
92
91
  subprocess.run(["git", "init"], check=True)
93
92
  subprocess.run(
@@ -113,8 +112,7 @@ def git_repo():
113
112
  yield pathlib.Path(test_dir)
114
113
 
115
114
  # Clear cached git repo check and restore cwd
116
- if hasattr(paths.in_git_repo, "_result"):
117
- del paths.in_git_repo._result
115
+ paths.in_git_repo.cache_clear()
118
116
  os.chdir(orig_cwd)
119
117
  api.app.state.root = original_root
120
118
  shutil.rmtree(test_dir)
@@ -130,8 +128,7 @@ def non_git_dir():
130
128
  api.app.state.root = pathlib.Path(test_dir).resolve()
131
129
 
132
130
  # Clear cached git repo check
133
- if hasattr(paths.in_git_repo, "_result"):
134
- del paths.in_git_repo._result
131
+ paths.in_git_repo.cache_clear()
135
132
 
136
133
  # Create files (including one that would be "ignored" if git were present)
137
134
  (pathlib.Path(test_dir) / "file1.txt").write_text("content1")
@@ -139,8 +136,7 @@ def non_git_dir():
139
136
 
140
137
  yield pathlib.Path(test_dir)
141
138
 
142
- if hasattr(paths.in_git_repo, "_result"):
143
- del paths.in_git_repo._result
139
+ paths.in_git_repo.cache_clear()
144
140
  os.chdir(orig_cwd)
145
141
  api.app.state.root = original_root
146
142
  shutil.rmtree(test_dir)
@@ -6,10 +6,13 @@ import pytest
6
6
  from lemming.api import context
7
7
 
8
8
 
9
- class MockAppState:
10
- def __init__(self, root: pathlib.Path, tasks_file: pathlib.Path):
11
- self.root = root
12
- self.tasks_file = tasks_file
9
+ def _app_state(
10
+ root: pathlib.Path, tasks_file: pathlib.Path
11
+ ) -> fastapi.datastructures.State:
12
+ """The real state object, since it is just an attribute bag."""
13
+ return fastapi.datastructures.State(
14
+ {"root": root, "tasks_file": tasks_file}
15
+ )
13
16
 
14
17
 
15
18
  def test_resolve_project_dir(tmp_path):
@@ -18,7 +21,7 @@ def test_resolve_project_dir(tmp_path):
18
21
  project = root / "project"
19
22
  project.mkdir()
20
23
 
21
- app_state = MockAppState(root, root / "tasks.yml")
24
+ app_state = _app_state(root, root / "tasks.yml")
22
25
 
23
26
  # Default (no project)
24
27
  assert context.resolve_project_dir(app_state) == root
@@ -46,7 +49,7 @@ def test_resolve_tasks_file(tmp_path):
46
49
  project.mkdir()
47
50
 
48
51
  default_tasks = root / "tasks.yml"
49
- app_state = MockAppState(root, default_tasks)
52
+ app_state = _app_state(root, default_tasks)
50
53
 
51
54
  # Default
52
55
  assert context.resolve_tasks_file(app_state) == default_tasks
@@ -223,7 +223,7 @@ def _task_status(
223
223
  help=(
224
224
  "Reviews to run after the task, comma-separated or repeated. "
225
225
  "Use 'all' for every review. With no description, only the "
226
- "reviews run."
226
+ "reviews run. Reviews may edit the working directory."
227
227
  ),
228
228
  )
229
229
  @click.option(
@@ -103,6 +103,7 @@ def test_disable_hooks_keeps_priority_in_mask(tmp_path, monkeypatch):
103
103
  # The mask filename carries the hook's priority so listings still
104
104
  # report the priority it would run at if re-enabled
105
105
  mask = results["roadmap"]
106
+ assert mask is not None
106
107
  assert mask.name == "90-roadmap.md"
107
108
  assert mask.read_text(encoding="utf-8") == ""
108
109
 
@@ -27,12 +27,14 @@ def test_task_model_defaults():
27
27
 
28
28
 
29
29
  def test_task_model_validation():
30
- # description is required
30
+ # description is required; the omission is the assertion, not a mistake
31
31
  with pytest.raises(pydantic.ValidationError):
32
+ # pyrefly: ignore[missing-argument]
32
33
  models.Task(id="123")
33
34
 
34
35
  # id is required
35
36
  with pytest.raises(pydantic.ValidationError):
37
+ # pyrefly: ignore[missing-argument]
36
38
  models.Task(description="Test")
37
39
 
38
40
 
@@ -169,6 +169,7 @@ def test_finish_task_attempt(tmp_path):
169
169
  persistence.save_tasks(tasks_file, data)
170
170
 
171
171
  finished = lifecycle.finish_task_attempt(tasks_file, "1")
172
+ assert finished is not None
172
173
  assert finished.status == models.TaskStatus.PENDING
173
174
  assert finished.pid is None
174
175
 
@@ -235,6 +235,7 @@ def test_get_pending_task(tmp_path):
235
235
  ]
236
236
  )
237
237
  pending = queries.get_pending_task(data)
238
+ assert pending is not None
238
239
  assert pending.id == "1"
239
240
 
240
241
 
@@ -204,14 +204,14 @@ wheels = [
204
204
 
205
205
  [[package]]
206
206
  name = "click-agentcli"
207
- version = "0.3.0"
207
+ version = "0.4.1"
208
208
  source = { registry = "https://pypi.org/simple" }
209
209
  dependencies = [
210
210
  { name = "click" },
211
211
  ]
212
- sdist = { url = "https://files.pythonhosted.org/packages/75/d5/660cd6f973e3cda14aaec0b31306c739069ae6a45e3b5ca86632a0af8561/click_agentcli-0.3.0.tar.gz", hash = "sha256:55a4c6d60f93a04c0e25df47df75c1e4169a1224ac2306da2fd544ca272ae579", size = 24098, upload-time = "2026-08-22T01:13:19.54Z" }
212
+ sdist = { url = "https://files.pythonhosted.org/packages/5f/f3/38a4a99f28121e48e848681dd80b54e490ec32a86d09a2d33f5c1a5d22cc/click_agentcli-0.4.1.tar.gz", hash = "sha256:f8bef4e82b2d61957764af3d806bc377eaba43bbd363552a966a04aecf05e9bb", size = 25736, upload-time = "2026-08-29T01:11:34.368Z" }
213
213
  wheels = [
214
- { url = "https://files.pythonhosted.org/packages/d4/c7/fec03b1cae7febb4bb67ab8b18000af29859526b55850b45e0ba2732c16a/click_agentcli-0.3.0-py3-none-any.whl", hash = "sha256:5115cdbde546e8eb8abe60ca1e22eedff9174591431e760e237d7c418d86e8dd", size = 24500, upload-time = "2026-08-22T01:13:18.346Z" },
214
+ { url = "https://files.pythonhosted.org/packages/e5/81/e50bd1adf77cc31283b642b729f9aefc002b0a5e1338dec19539b902c39d/click_agentcli-0.4.1-py3-none-any.whl", hash = "sha256:a39bc96c364970225ddbede45bc4307b4f73013f32c2744e6a02807b1aee27c6", size = 26364, upload-time = "2026-08-29T01:11:32.949Z" },
215
215
  ]
216
216
 
217
217
  [[package]]
@@ -307,7 +307,7 @@ wheels = [
307
307
 
308
308
  [[package]]
309
309
  name = "lemming-cli"
310
- version = "0.5.0"
310
+ version = "0.5.2"
311
311
  source = { editable = "." }
312
312
  dependencies = [
313
313
  { name = "beautifulsoup4" },
@@ -338,12 +338,12 @@ evals = [
338
338
  requires-dist = [
339
339
  { name = "beautifulsoup4", specifier = ">=4.13.3" },
340
340
  { name = "click", specifier = ">=8.0.0" },
341
- { name = "click-agentcli", specifier = ">=0.3.0" },
341
+ { name = "click-agentcli", specifier = ">=0.4.1" },
342
342
  { name = "fastapi", specifier = ">=0.124.4" },
343
343
  { name = "markdownify", specifier = ">=0.14.1" },
344
344
  { name = "pydantic", specifier = ">=2.12.5" },
345
345
  { name = "pyyaml", specifier = ">=6.0.3" },
346
- { name = "readability-cli", specifier = ">=0.9.0" },
346
+ { name = "readability-cli", specifier = ">=0.10.0" },
347
347
  { name = "requests", specifier = ">=2.32.3" },
348
348
  { name = "uvicorn", specifier = ">=0.33.0" },
349
349
  ]
@@ -573,7 +573,7 @@ wheels = [
573
573
 
574
574
  [[package]]
575
575
  name = "readability-cli"
576
- version = "0.9.0"
576
+ version = "0.10.0"
577
577
  source = { registry = "https://pypi.org/simple" }
578
578
  dependencies = [
579
579
  { name = "beautifulsoup4" },
@@ -581,9 +581,9 @@ dependencies = [
581
581
  { name = "markdownify" },
582
582
  { name = "requests" },
583
583
  ]
584
- sdist = { url = "https://files.pythonhosted.org/packages/eb/aa/7570aaa1ec46c74b8359b2d2a47bdc70d7ee6adff94501cbdaf347810f19/readability_cli-0.9.0.tar.gz", hash = "sha256:4e14e182be391d70092fe159d8d81c6d94e34e8099fdfc9ca8b8ad3ffc31d4c5", size = 343257, upload-time = "2026-08-20T00:51:02.731Z" }
584
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/1e/879bc39b3e9127dfac23822b333093237b95f9ac8891295c039c21481bdd/readability_cli-0.10.0.tar.gz", hash = "sha256:201bf386850d8e465d154bab307399cc5516eb779d1032f75bc97cf38dbf636d", size = 349921, upload-time = "2026-08-23T23:44:08.64Z" }
585
585
  wheels = [
586
- { url = "https://files.pythonhosted.org/packages/8d/94/1857a49eaf9a3efddcdf6f6f413f0aac804915a58d1ccbd64b32a6994602/readability_cli-0.9.0-py3-none-any.whl", hash = "sha256:1709c282575c3f5fc9351d585f069a92b79312d33a22a5ff3713aef8cb834850", size = 324977, upload-time = "2026-08-20T00:51:01.416Z" },
586
+ { url = "https://files.pythonhosted.org/packages/e1/e2/c573dd0f508e9eb3b4ad0167fc1d60cd361297b6ed8daaf7e4825ad7f6cf/readability_cli-0.10.0-py3-none-any.whl", hash = "sha256:09227180ce6e66ca5f9ef386a9f4e254aeecbed880296c188d0dccc33f918b15", size = 326908, upload-time = "2026-08-23T23:44:06.691Z" },
587
587
  ]
588
588
 
589
589
  [[package]]
@@ -1,21 +0,0 @@
1
- # Type checking covers the code that ships, not the code that exercises it.
2
- #
3
- # Test doubles are duck-typed on purpose, so a strict checker reports every
4
- # one of them as an incompatible argument; the eval fixture projects are
5
- # sample repositories seeded into a workspace, several deliberately broken,
6
- # and they are data rather than source.
7
- project-excludes = [
8
- "**/*_test.py",
9
- "**/conftest.py",
10
- "**/evals/projects/**",
11
- ]
12
-
13
- # The fixture projects are checked when a path names one directly, where
14
- # project-excludes does not apply. Their imports are relative to the
15
- # workspace they get seeded into, not to this repository.
16
- [[sub-config]]
17
- matches = "**/evals/projects/**"
18
-
19
- [sub-config.errors]
20
- missing-import = false
21
- missing-module-attribute = false
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