led-review 0.1.0__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.
- led_review-0.1.0/.env.example +13 -0
- led_review-0.1.0/.github/workflows/ci.yml +22 -0
- led_review-0.1.0/.github/workflows/publish.yml +44 -0
- led_review-0.1.0/.github/workflows/review.yml +44 -0
- led_review-0.1.0/.gitignore +22 -0
- led_review-0.1.0/.pre-commit-config.yaml +10 -0
- led_review-0.1.0/.python-version +1 -0
- led_review-0.1.0/AGENTS.md +54 -0
- led_review-0.1.0/LICENSE +21 -0
- led_review-0.1.0/PKG-INFO +17 -0
- led_review-0.1.0/README.md +128 -0
- led_review-0.1.0/action.yml +90 -0
- led_review-0.1.0/bench/EXPERIMENTS.md +740 -0
- led_review-0.1.0/bench/__init__.py +0 -0
- led_review-0.1.0/bench/compare_ab.py +113 -0
- led_review-0.1.0/bench/run_bench.py +392 -0
- led_review-0.1.0/bench/scoring.py +151 -0
- led_review-0.1.0/bench/tasks/explain_idempotency/META.json +7 -0
- led_review-0.1.0/bench/tasks/explain_idempotency/PROMPT.md +1 -0
- led_review-0.1.0/bench/tasks/explain_idempotency/workspace/README.md +4 -0
- led_review-0.1.0/bench/tasks/find_secret/META.json +7 -0
- led_review-0.1.0/bench/tasks/find_secret/PROMPT.md +1 -0
- led_review-0.1.0/bench/tasks/find_secret/verify.py +6 -0
- led_review-0.1.0/bench/tasks/find_secret/workspace/notes.txt +8 -0
- led_review-0.1.0/bench/tasks/fix_binary_search/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_binary_search/PROMPT.md +5 -0
- led_review-0.1.0/bench/tasks/fix_binary_search/verify.py +14 -0
- led_review-0.1.0/bench/tasks/fix_binary_search/workspace/binary_search.py +16 -0
- led_review-0.1.0/bench/tasks/fix_checkout/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_checkout/PROMPT.md +13 -0
- led_review-0.1.0/bench/tasks/fix_checkout/verify.py +17 -0
- led_review-0.1.0/bench/tasks/fix_checkout/workspace/main.py +4 -0
- led_review-0.1.0/bench/tasks/fix_checkout/workspace/store/__init__.py +0 -0
- led_review-0.1.0/bench/tasks/fix_checkout/workspace/store/catalog.py +13 -0
- led_review-0.1.0/bench/tasks/fix_checkout/workspace/store/checkout.py +13 -0
- led_review-0.1.0/bench/tasks/fix_count_words/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_count_words/PROMPT.md +6 -0
- led_review-0.1.0/bench/tasks/fix_count_words/verify.py +12 -0
- led_review-0.1.0/bench/tasks/fix_count_words/workspace/count_words.py +12 -0
- led_review-0.1.0/bench/tasks/fix_crlf_edit/.gitattributes +1 -0
- led_review-0.1.0/bench/tasks/fix_crlf_edit/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_crlf_edit/PROMPT.md +9 -0
- led_review-0.1.0/bench/tasks/fix_crlf_edit/verify.py +17 -0
- led_review-0.1.0/bench/tasks/fix_crlf_edit/workspace/pricing.py +6 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/PROMPT.md +8 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/verify.py +20 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/auth.py +14 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/routes/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/routes/health.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/routes/notify.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/routes/templates.py +10 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/routes/users.py +10 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/routes/webhooks.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/api/server.py +24 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/data/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/data/models.py +43 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/data/repository.py +34 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/main.py +22 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/providers/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/providers/email.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/providers/push.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/providers/sms.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/providers/webhook.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/services/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/services/audit.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/services/event_bus.py +26 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/services/metrics.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/services/notifier.py +44 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/services/scheduler.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/cache.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/dates.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/files.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/hashing.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/ids.py +7 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/logging.py +12 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/pagination.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/ratelimit.py +25 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/slug.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/timeutil.py +15 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/utils/validation.py +12 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/worker/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/worker/health.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/worker/helpers.py +20 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/worker/queue.py +26 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/worker/retry.py +22 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_obf/workspace/src/worker/serializer.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/PROMPT.md +12 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/verify.py +20 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/auth.py +14 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/routes/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/routes/health.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/routes/notify.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/routes/templates.py +10 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/routes/users.py +10 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/routes/webhooks.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/api/server.py +24 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/data/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/data/models.py +43 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/data/repository.py +34 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/main.py +22 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/providers/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/providers/email.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/providers/push.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/providers/sms.py +21 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/providers/webhook.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/services/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/services/audit.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/services/event_bus.py +26 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/services/metrics.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/services/notifier.py +44 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/services/scheduler.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/cache.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/dates.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/files.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/hashing.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/ids.py +7 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/logging.py +12 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/pagination.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/ratelimit.py +25 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/slug.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/timeutil.py +15 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/utils/validation.py +12 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/worker/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/worker/health.py +9 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/worker/helpers.py +20 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/worker/queue.py +26 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/worker/retry.py +22 -0
- led_review-0.1.0/bench/tasks/fix_dedupe_verify/workspace/src/worker/serializer.py +9 -0
- led_review-0.1.0/bench/tasks/fix_discount/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_discount/PROMPT.md +17 -0
- led_review-0.1.0/bench/tasks/fix_discount/verify.py +27 -0
- led_review-0.1.0/bench/tasks/fix_discount/workspace/package.json +1 -0
- led_review-0.1.0/bench/tasks/fix_discount/workspace/src/checkout.js +6 -0
- led_review-0.1.0/bench/tasks/fix_discount/workspace/src/fees.js +14 -0
- led_review-0.1.0/bench/tasks/fix_discount/workspace/src/index.js +5 -0
- led_review-0.1.0/bench/tasks/fix_discount/workspace/src/lineItems.js +7 -0
- led_review-0.1.0/bench/tasks/fix_fizzbuzz/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_fizzbuzz/PROMPT.md +1 -0
- led_review-0.1.0/bench/tasks/fix_fizzbuzz/verify.py +11 -0
- led_review-0.1.0/bench/tasks/fix_fizzbuzz/workspace/fizzbuzz.py +21 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/PROMPT.md +8 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/verify.py +19 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/auth.py +14 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/routes/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/routes/health.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/routes/notify.py +21 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/routes/templates.py +10 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/routes/users.py +10 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/routes/webhooks.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/api/server.py +24 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/data/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/data/models.py +43 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/data/repository.py +34 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/main.py +22 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/providers/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/providers/email.py +21 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/providers/push.py +21 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/providers/sms.py +21 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/providers/webhook.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/services/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/services/audit.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/services/event_bus.py +26 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/services/metrics.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/services/notifier.py +44 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/services/scheduler.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/cache.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/dates.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/files.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/hashing.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/ids.py +7 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/logging.py +12 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/pagination.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/ratelimit.py +25 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/slug.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/timeutil.py +15 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/utils/validation.py +12 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/worker/__init__.py +1 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/worker/health.py +9 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/worker/helpers.py +20 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/worker/queue.py +26 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/worker/retry.py +22 -0
- led_review-0.1.0/bench/tasks/fix_notify_dedupe/workspace/src/worker/serializer.py +9 -0
- led_review-0.1.0/bench/tasks/fix_paginate/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_paginate/PROMPT.md +6 -0
- led_review-0.1.0/bench/tasks/fix_paginate/verify.py +15 -0
- led_review-0.1.0/bench/tasks/fix_paginate/workspace/paginate.py +14 -0
- led_review-0.1.0/bench/tasks/fix_retry/META.json +7 -0
- led_review-0.1.0/bench/tasks/fix_retry/PROMPT.md +15 -0
- led_review-0.1.0/bench/tasks/fix_retry/verify.py +36 -0
- led_review-0.1.0/bench/tasks/fix_retry/workspace/service/__init__.py +0 -0
- led_review-0.1.0/bench/tasks/fix_retry/workspace/service/config.py +3 -0
- led_review-0.1.0/bench/tasks/fix_retry/workspace/service/http_client.py +1 -0
- led_review-0.1.0/bench/tasks/fix_retry/workspace/service/retry.py +17 -0
- led_review-0.1.0/bench/tasks/fix_retry/workspace/service/run.py +10 -0
- led_review-0.1.0/bench/tasks/implement_flatten/META.json +7 -0
- led_review-0.1.0/bench/tasks/implement_flatten/PROMPT.md +6 -0
- led_review-0.1.0/bench/tasks/implement_flatten/verify.py +12 -0
- led_review-0.1.0/bench/tasks/implement_flatten/workspace/flatten.py +12 -0
- led_review-0.1.0/bench/tasks/implement_parse_keyval/META.json +7 -0
- led_review-0.1.0/bench/tasks/implement_parse_keyval/PROMPT.md +6 -0
- led_review-0.1.0/bench/tasks/implement_parse_keyval/verify.py +12 -0
- led_review-0.1.0/bench/tasks/implement_parse_keyval/workspace/parse_keyval.py +12 -0
- led_review-0.1.0/bench/tasks/implement_safe_divide/META.json +7 -0
- led_review-0.1.0/bench/tasks/implement_safe_divide/PROMPT.md +1 -0
- led_review-0.1.0/bench/tasks/implement_safe_divide/verify.py +11 -0
- led_review-0.1.0/bench/tasks/implement_safe_divide/workspace/calc.py +10 -0
- led_review-0.1.0/bench/tasks/implement_safe_get/META.json +7 -0
- led_review-0.1.0/bench/tasks/implement_safe_get/PROMPT.md +9 -0
- led_review-0.1.0/bench/tasks/implement_safe_get/verify.py +35 -0
- led_review-0.1.0/bench/tasks/implement_safe_get/workspace/safe_get.py +6 -0
- led_review-0.1.0/bench/tasks/manifest.json +4 -0
- led_review-0.1.0/bench/tasks/review_cache_key/META.json +37 -0
- led_review-0.1.0/bench/tasks/review_cache_key/base/cli.py +12 -0
- led_review-0.1.0/bench/tasks/review_cache_key/base/models.py +10 -0
- led_review-0.1.0/bench/tasks/review_cache_key/base/store.py +16 -0
- led_review-0.1.0/bench/tasks/review_cache_key/bug.patch +42 -0
- led_review-0.1.0/bench/tasks/review_mirror_index_stale/META.json +28 -0
- led_review-0.1.0/bench/tasks/review_mirror_index_stale/base/registry.py +27 -0
- led_review-0.1.0/bench/tasks/review_mirror_index_stale/bug.patch +12 -0
- led_review-0.1.0/bench/tasks/review_misleading_refactor/META.json +29 -0
- led_review-0.1.0/bench/tasks/review_misleading_refactor/base/config_loader.py +17 -0
- led_review-0.1.0/bench/tasks/review_misleading_refactor/bug.patch +16 -0
- led_review-0.1.0/bench/tasks/review_missing_guard/META.json +19 -0
- led_review-0.1.0/bench/tasks/review_missing_guard/base/profile.py +11 -0
- led_review-0.1.0/bench/tasks/review_missing_guard/bug.patch +13 -0
- led_review-0.1.0/bench/tasks/review_multi_bug/META.json +28 -0
- led_review-0.1.0/bench/tasks/review_multi_bug/base/pricing.py +13 -0
- led_review-0.1.0/bench/tasks/review_multi_bug/bug.patch +18 -0
- led_review-0.1.0/bench/tasks/review_off_by_one/META.json +19 -0
- led_review-0.1.0/bench/tasks/review_off_by_one/base/app.py +13 -0
- led_review-0.1.0/bench/tasks/review_off_by_one/base/paginate.py +9 -0
- led_review-0.1.0/bench/tasks/review_off_by_one/bug.patch +11 -0
- led_review-0.1.0/bench/tasks/review_oss_chrono_offset_24h/META.json +33 -0
- led_review-0.1.0/bench/tasks/review_oss_click_sentinel/META.json +24 -0
- led_review-0.1.0/bench/tasks/review_oss_click_synopsis/META.json +24 -0
- led_review-0.1.0/bench/tasks/review_oss_mapstructure_unmarshal_panic/META.json +43 -0
- led_review-0.1.0/bench/tasks/review_oss_morgan_token_escape/META.json +33 -0
- led_review-0.1.0/bench/tasks/review_oss_packaging_ranges/META.json +24 -0
- led_review-0.1.0/bench/tasks/review_pool_lease_leak/META.json +28 -0
- led_review-0.1.0/bench/tasks/review_pool_lease_leak/base/pool.py +30 -0
- led_review-0.1.0/bench/tasks/review_pool_lease_leak/bug.patch +30 -0
- led_review-0.1.0/bench/tasks/review_retry_swallow/META.json +45 -0
- led_review-0.1.0/bench/tasks/review_retry_swallow/base/fetcher.py +19 -0
- led_review-0.1.0/bench/tasks/review_retry_swallow/bug.patch +10 -0
- led_review-0.1.0/bench/tasks/review_session_ttl_scale/META.json +28 -0
- led_review-0.1.0/bench/tasks/review_session_ttl_scale/base/auth_check.py +7 -0
- led_review-0.1.0/bench/tasks/review_session_ttl_scale/base/auth_issue.py +8 -0
- led_review-0.1.0/bench/tasks/review_session_ttl_scale/bug.patch +28 -0
- led_review-0.1.0/bench/tasks/review_ttl_refresh_stale/META.json +28 -0
- led_review-0.1.0/bench/tasks/review_ttl_refresh_stale/base/cache.py +24 -0
- led_review-0.1.0/bench/tasks/review_ttl_refresh_stale/bug.patch +40 -0
- led_review-0.1.0/bench/tasks/review_txn_dedupe_flush/META.json +39 -0
- led_review-0.1.0/bench/tasks/review_txn_dedupe_flush/base/reconcile.py +15 -0
- led_review-0.1.0/bench/tasks/review_txn_dedupe_flush/bug.patch +39 -0
- led_review-0.1.0/bench/tasks/review_window_quota_slide/META.json +19 -0
- led_review-0.1.0/bench/tasks/review_window_quota_slide/base/ratelimit.py +22 -0
- led_review-0.1.0/bench/tasks/review_window_quota_slide/bug.patch +15 -0
- led_review-0.1.0/docs/USAGE.md +583 -0
- led_review-0.1.0/docs/superpowers/plans/2026-08-31-mini-agent-evals-observability.md +872 -0
- led_review-0.1.0/docs/superpowers/plans/2026-08-31-textual-tui-steering.md +951 -0
- led_review-0.1.0/docs/superpowers/specs/2026-08-31-mini-agent-evals-observability-design.md +141 -0
- led_review-0.1.0/docs/superpowers/specs/2026-08-31-textual-tui-steering-design.md +108 -0
- led_review-0.1.0/mini_agent/__init__.py +10 -0
- led_review-0.1.0/mini_agent/__main__.py +5 -0
- led_review-0.1.0/mini_agent/commands/__init__.py +1 -0
- led_review-0.1.0/mini_agent/commands/builtin.py +126 -0
- led_review-0.1.0/mini_agent/commands/registry.py +23 -0
- led_review-0.1.0/mini_agent/config.py +279 -0
- led_review-0.1.0/mini_agent/eval/__init__.py +1 -0
- led_review-0.1.0/mini_agent/eval/judge.py +72 -0
- led_review-0.1.0/mini_agent/eval/trace.py +78 -0
- led_review-0.1.0/mini_agent/hooks.py +127 -0
- led_review-0.1.0/mini_agent/kernel/__init__.py +1 -0
- led_review-0.1.0/mini_agent/kernel/agent.py +473 -0
- led_review-0.1.0/mini_agent/kernel/bridge.py +63 -0
- led_review-0.1.0/mini_agent/kernel/compact.py +347 -0
- led_review-0.1.0/mini_agent/kernel/events.py +133 -0
- led_review-0.1.0/mini_agent/kernel/streaming.py +149 -0
- led_review-0.1.0/mini_agent/main.py +110 -0
- led_review-0.1.0/mini_agent/models.default.json +50 -0
- led_review-0.1.0/mini_agent/repo_map.py +798 -0
- led_review-0.1.0/mini_agent/review.py +262 -0
- led_review-0.1.0/mini_agent/skills.py +100 -0
- led_review-0.1.0/mini_agent/tools/__init__.py +1 -0
- led_review-0.1.0/mini_agent/tools/builtin.py +962 -0
- led_review-0.1.0/mini_agent/tools/gitdiff.py +223 -0
- led_review-0.1.0/mini_agent/tools/registry.py +82 -0
- led_review-0.1.0/mini_agent/ui/__init__.py +1 -0
- led_review-0.1.0/mini_agent/ui/input.py +196 -0
- led_review-0.1.0/mini_agent/ui/renderer.py +366 -0
- led_review-0.1.0/mini_agent/ui/segments.py +59 -0
- led_review-0.1.0/models.json.example +14 -0
- led_review-0.1.0/permissions.json +8 -0
- led_review-0.1.0/pyproject.toml +49 -0
- led_review-0.1.0/pytest.ini +2 -0
- led_review-0.1.0/requirements.txt +14 -0
- led_review-0.1.0/tests/conftest.py +81 -0
- led_review-0.1.0/tests/test_agent.py +410 -0
- led_review-0.1.0/tests/test_bench.py +43 -0
- led_review-0.1.0/tests/test_bench_review.py +54 -0
- led_review-0.1.0/tests/test_bridge.py +83 -0
- led_review-0.1.0/tests/test_commands.py +127 -0
- led_review-0.1.0/tests/test_compact.py +356 -0
- led_review-0.1.0/tests/test_config.py +126 -0
- led_review-0.1.0/tests/test_edit_file.py +82 -0
- led_review-0.1.0/tests/test_gitdiff.py +118 -0
- led_review-0.1.0/tests/test_hooks.py +71 -0
- led_review-0.1.0/tests/test_input_utils.py +55 -0
- led_review-0.1.0/tests/test_judge.py +43 -0
- led_review-0.1.0/tests/test_post_write_checks.py +83 -0
- led_review-0.1.0/tests/test_registry.py +132 -0
- led_review-0.1.0/tests/test_repo_map.py +234 -0
- led_review-0.1.0/tests/test_repo_map_langs.py +193 -0
- led_review-0.1.0/tests/test_review.py +182 -0
- led_review-0.1.0/tests/test_scoring.py +88 -0
- led_review-0.1.0/tests/test_skills.py +96 -0
- led_review-0.1.0/tests/test_spawn_researchers.py +228 -0
- led_review-0.1.0/tests/test_stream_segments.py +53 -0
- led_review-0.1.0/tests/test_streaming.py +185 -0
- led_review-0.1.0/tests/test_subagent.py +446 -0
- led_review-0.1.0/tests/test_tools.py +341 -0
- led_review-0.1.0/tests/test_trace.py +79 -0
- led_review-0.1.0/tests/test_ui.py +129 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# 真实运行所需的 API key(复制本文件为 .env 后填入)
|
|
2
|
+
|
|
3
|
+
# Moonshot 通用 API key(kimi / kimi-k2.7-code / kimi-k2.6 等)
|
|
4
|
+
# 获取地址:https://platform.moonshot.cn/
|
|
5
|
+
MOONSHOT_API_KEY=sk-your-key-here
|
|
6
|
+
|
|
7
|
+
# Kimi Code 专用 API key(kimi-code / kimi-code-256k / kimi-code-k2.7 等)
|
|
8
|
+
# 获取地址:https://www.kimi.com/code/console
|
|
9
|
+
#KIMI_CODE_API_KEY=sk-your-key-here
|
|
10
|
+
|
|
11
|
+
# 默认启动的模型档案(可选,默认 kimi-code;可选值见 models.default.json 或 /model 列表)
|
|
12
|
+
# 默认 kimi-code 需要配置 KIMI_CODE_API_KEY;切回 kimi / kimi-k2.7-code 等用 MOONSHOT_API_KEY
|
|
13
|
+
#MINI_AGENT_MODEL=kimi-code
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, master]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: actions/setup-python@v5
|
|
14
|
+
with:
|
|
15
|
+
python-version: "3.13"
|
|
16
|
+
cache: pip
|
|
17
|
+
- name: Install dependencies
|
|
18
|
+
run: pip install -r requirements.txt pytest ruff
|
|
19
|
+
- name: Lint
|
|
20
|
+
run: ruff check .
|
|
21
|
+
- name: Test
|
|
22
|
+
run: python -m pytest -q
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 发布到 PyPI:led-review(用户 pipx install led-review 即可用,BYOK——自带 key)
|
|
2
|
+
#
|
|
3
|
+
# 触发:push 任意 tag(推荐语义化:v0.1.0)
|
|
4
|
+
# 前置(一次性,需人工完成):
|
|
5
|
+
# 1. 注册 https://pypi.org/account/register/(用户名如 jljleo)
|
|
6
|
+
# 2. 在 https://pypi.org/manage/account/token/ 创建 API token(scope: 整个账号)
|
|
7
|
+
# 3. 仓库 Settings → Secrets → Actions 添加: PYPI_API_TOKEN=<token>
|
|
8
|
+
# 4. 可选:test.pypi 先试发(把 publish 步骤的 repository 指到 test.pypi 账号同理)
|
|
9
|
+
#
|
|
10
|
+
# 产物:pipx install led-review → 命令 `led`:
|
|
11
|
+
# led review "origin/main...HEAD" # 分支审查,high findings → exit 1
|
|
12
|
+
# led review --format json # 机器消费
|
|
13
|
+
# led # 交互 REPL
|
|
14
|
+
|
|
15
|
+
name: publish
|
|
16
|
+
|
|
17
|
+
on:
|
|
18
|
+
push:
|
|
19
|
+
tags:
|
|
20
|
+
- "v*"
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
publish:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
|
|
31
|
+
- uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: "3.13"
|
|
34
|
+
cache: pip
|
|
35
|
+
|
|
36
|
+
- name: 构建 wheel + sdist
|
|
37
|
+
run: |
|
|
38
|
+
pip install -q build
|
|
39
|
+
python -m build
|
|
40
|
+
|
|
41
|
+
- name: 发布到 PyPI
|
|
42
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
43
|
+
with:
|
|
44
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# PR 自动 code review:led dogfood 闭环——uses 仓库自身的 action(自举)
|
|
2
|
+
#
|
|
3
|
+
# 每个 PR 用 PR 自己的代码 review 自己的 diff:
|
|
4
|
+
# - uses: ./ 是本地 action 路径(本仓库根 action.yml),install_from: . 装的是
|
|
5
|
+
# PR 分支源码——改坏 review 能力的 PR 会立刻体现在自己的 review 质量里。
|
|
6
|
+
# - 用户场景唯一差异是 install_from 缺省(PyPI 包 led-review),其余逻辑相同。
|
|
7
|
+
# - action 封装被每个 PR 实测,封装坏了的 PR 会自己卡住自己/报错在评论里。
|
|
8
|
+
#
|
|
9
|
+
# 需要在仓库 Settings → Secrets 配置 KIMI_CODE_API_KEY(BYOK)。
|
|
10
|
+
# 设计决策:
|
|
11
|
+
# - fail_on_high 缺省 false:review 是信息性评论,不阻塞合并(precision 未被
|
|
12
|
+
# 充分证明前不做门禁;E8-E10 的误报数据够格后再开门禁)
|
|
13
|
+
# - fork PR 跳过(secrets 不可用,也防外部 PR 烧 key)
|
|
14
|
+
# - concurrency cancel:force-push 时取消过期的 review
|
|
15
|
+
|
|
16
|
+
name: review
|
|
17
|
+
|
|
18
|
+
on:
|
|
19
|
+
pull_request:
|
|
20
|
+
|
|
21
|
+
concurrency:
|
|
22
|
+
group: review-${{ github.event.pull_request.number }}
|
|
23
|
+
cancel-in-progress: true
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
review:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
if: github.event.pull_request.head.repo.full_name == github.repository
|
|
29
|
+
permissions:
|
|
30
|
+
pull-requests: write # gh pr comment 需要(默认 token 在某些仓库设置下只读)
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
with:
|
|
34
|
+
fetch-depth: 0 # review 需要 base...HEAD 的完整祖先
|
|
35
|
+
|
|
36
|
+
- uses: actions/setup-python@v5
|
|
37
|
+
with:
|
|
38
|
+
python-version: "3.13"
|
|
39
|
+
cache: pip
|
|
40
|
+
|
|
41
|
+
- uses: ./
|
|
42
|
+
with:
|
|
43
|
+
api_key: ${{ secrets.KIMI_CODE_API_KEY }}
|
|
44
|
+
install_from: "."
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/.env
|
|
2
|
+
/.venv/
|
|
3
|
+
__pycache__/
|
|
4
|
+
.DS_Store
|
|
5
|
+
.chat_history
|
|
6
|
+
session_todos.json
|
|
7
|
+
.session.json
|
|
8
|
+
models.json
|
|
9
|
+
bench/results/
|
|
10
|
+
# 个人笔记/设计文档:只保留本地,不进仓库
|
|
11
|
+
ROADMAP.md
|
|
12
|
+
AGENT_DESIGN.md
|
|
13
|
+
DESIGN_NOTES.md
|
|
14
|
+
|
|
15
|
+
# 打包构建产物
|
|
16
|
+
build/
|
|
17
|
+
*.egg-info/
|
|
18
|
+
|
|
19
|
+
# 构建/发布产物与 IDE
|
|
20
|
+
dist/
|
|
21
|
+
build/
|
|
22
|
+
.idea/
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 提交前自动检查:ruff lint(自动修复)
|
|
2
|
+
# 安装:pip install pre-commit && pre-commit install
|
|
3
|
+
# 注:刻意不含 ruff-format——仓库现有手工排版(中文注释对齐、刻意折行),
|
|
4
|
+
# 全量格式化会改写 31 个文件;如将来决定统一排版,一次性跑 ruff format 后再加回该钩子。
|
|
5
|
+
repos:
|
|
6
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
7
|
+
rev: v0.14.5
|
|
8
|
+
hooks:
|
|
9
|
+
- id: ruff
|
|
10
|
+
args: [--fix]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
> 本文件会被 `mini_agent/kernel/agent.py` 自动注入 system prompt(随会话保留,compact 不截断):
|
|
4
|
+
> 它是对 AI 协作者的行为契约(编码规范/架构边界/踩坑清单),与 `mini_agent/repo_map.py`
|
|
5
|
+
> 注入的代码库地图互补——地图回答「仓库有什么」,本文件回答「应该怎么改」。
|
|
6
|
+
> 修改后即刻生效,无需重启。不要把一次性指令/环境特定信息写在这里(放 .env/README)。
|
|
7
|
+
|
|
8
|
+
## 项目形态
|
|
9
|
+
|
|
10
|
+
- 项目主线是 **code review agent**:`mini_agent/review.py` 是 review 管道与子命令(主形态:非交互批处理、CI 可消费、exit code 门禁);交互 REPL 是辅助形态。diff 提取在 `mini_agent/tools/gitdiff.py`(只读确定性),skills 机制在 `mini_agent/skills.py`(索引常驻注入 + read_file 惰性加载,规范轴载体)。
|
|
11
|
+
- Python 3.13 CLI agent,代码组织为 `mini_agent/` 包(kernel / tools / commands / ui / eval 分层);有最小 `requirements.txt`(openai / python-dotenv / prompt_toolkit / rich),没有构建步骤、lint 配置或代码生成。使用仓库内虚拟环境:`.venv/bin/python`;新环境先 `.venv/bin/pip install -r requirements.txt`。
|
|
12
|
+
- 代码库感知(mini_agent/repo_map.py)全语言统一走 tree-sitter 解析(lazy import,语言包缺失时该语言静默为空):python / javascript / typescript(含 tsx) / go / rust / java。加新语言 = 在 repo_map.py 注册 `@_extractor(".xxx")` 提取器 + 装对应 tree-sitter-xxx 包,索引/排序/缓存/检索逻辑语言无关无需改动。
|
|
13
|
+
- 入口是 `mini_agent/main.py`(`.venv/bin/python -m mini_agent`,发布后安装 `pipx install led-review` 得到命令 `led`):`led review` 子命令走 review.py 管道,无子命令进交互主循环 `_chat_loop`(tty/管道自适应)。曾有的 Textual 全屏 TUI 与 patch_stdout 常驻输入框均已于 2026-09 移除(R0:自研全屏 UI 是负资产;patch_stdout 与 Live 光标重绘互斥必闪烁),不要再引入全屏前端或运行中输入框。
|
|
14
|
+
- 运行时配置在 `config.py`,会加载 `.env`;真实运行需要对应档案的 API key(默认档案 kimi-code → `KIMI_CODE_API_KEY`,详见 `.env.example`)。不要读取或提交 `.env`。
|
|
15
|
+
- 内核/UI 边界很重要:`mini_agent/kernel/`(agent / streaming / compact)必须保持为事件生产者,不能 import `mini_agent/ui/`。通过产出/消费 `kernel/events.py` 事件来渲染或上报(`ui.renderer.consume`、bench 消费者)。
|
|
16
|
+
|
|
17
|
+
## 命令
|
|
18
|
+
|
|
19
|
+
- 运行应用:`.venv/bin/python -m mini_agent`
|
|
20
|
+
- 运行全部测试:`.venv/bin/python -m pytest -q`
|
|
21
|
+
- 运行单个测试文件:`.venv/bin/python -m pytest tests/test_compact.py -q`
|
|
22
|
+
- 运行单个测试:`.venv/bin/python -m pytest tests/test_compact.py::test_name -q`
|
|
23
|
+
- 运行 benchmark:`.venv/bin/python bench/run_bench.py [task_name]`;会访问真实 API,在每个任务独立的临时沙箱里自动批准,并写入 `bench/results/*.json`。
|
|
24
|
+
- Lint:`.venv/bin/ruff check .`(配置在 `pyproject.toml`,规则集 E/F/I/UP/B,E501 行长不查);pre-commit 钩子可选(`pip install pre-commit && pre-commit install`)。仓库未配置 formatter 与 typecheck,不要臆造必须的命令顺序。
|
|
25
|
+
|
|
26
|
+
## 测试规则
|
|
27
|
+
|
|
28
|
+
- `pytest.ini` 只设置 `testpaths = tests`。
|
|
29
|
+
- `tests/conftest.py` 会把仓库根目录插入 `sys.path`,重置 `compact._chars_per_token`,并把 `socket.socket` 替换成哨兵类:任何真实网络请求都会立即失败。OpenAI client 调用必须打桩;测试绝不能访问网络。
|
|
30
|
+
- 使用 `session` fixture 获得隔离的 `ChatSession`:假 API key + `tmp_path` 会话文件。
|
|
31
|
+
- 优先写行为契约回归测试,而不是实现细节断言;文件系统和全局状态隔离用 `tmp_path`/`monkeypatch`。
|
|
32
|
+
|
|
33
|
+
## 仓库特有约定与坑
|
|
34
|
+
|
|
35
|
+
- 工具只在 `mini_agent/tools/builtin.py` 里用 `@tool` 注册;工具 schema 和实现共用这一个事实来源。常驻工具只由 `tools/registry.py` 的 `RESIDENT_TOOL_NAMES` 控制;新工具默认通过 `search_tools` 可发现,除非显式加入常驻名单。
|
|
36
|
+
- 斜杠命令在 `mini_agent/commands/builtin.py` 里用 `@command` 注册;`main.py` 导入 `tools.builtin` 和 `commands.builtin` 是为了触发注册副作用。
|
|
37
|
+
- 上下文压缩只做发送时投影:`kernel/compact.py` 变换的是消息副本,绝不能改存储历史。必须保留 assistant `tool_calls` 与 tool 消息配对;截断不能制造孤儿 tool 消息。
|
|
38
|
+
- 如果流式响应 `finish_reason == "length"` 且带 tool calls,要整批拒绝执行并补上明确的 tool 结果;半截 arguments 不安全,孤儿 tool calls 会导致 API 400。
|
|
39
|
+
- 交互循环刻意没有硬性最大轮次限制。保险丝是 `config.py` 的 `MAX_SAME_TOOL_CALLS`;无人值守场景的轮次限制应放在调用侧(如 bench、子 agent 的 `max_turns`),不要污染核心循环。
|
|
40
|
+
- 子 agent(`spawn_subagent`):类型化派生(`config.SUBAGENT_TYPES`——researcher 只读 / coder 可写可跑),进程内新 `ChatSession(tools=类型工具表, depth+1)`,上下文隔离只回结论;子 agent 直接操作真实项目,安全由工具表 + command_policy + 用户审批保证(沙箱机制已移除)。子 agent 的 bash 命令按 command_policy 裁决:researcher 命中只读白名单直通、非白名单一律硬拒(零 LLM 成本);coder 即使命中 allow 也降级为 ask、未命中冒泡给人工审批(带 `[子 agent]` 前缀);越界路径硬拒绝(不评审不冒泡)。防套娃双保险:类型工具表不含 spawn_subagent + `MAX_SUBAGENT_DEPTH=1`。
|
|
41
|
+
- 命令权限随类型声明(`SUBAGENT_TYPES[*].command_policy`):researcher=read_only(白名单直通,非白名单确定性硬拒,零 LLM 成本);coder=human(allow 也降级为 ask,与 ambiguous 一起冒泡给人工审批,带 `[子 agent]` 前缀)。限制的唯一可信来源是 config,不是模型生成的参数。
|
|
42
|
+
- 防乱派生:`spawn_subagent` 工具描述写死派生纪律(先规划边界、任务自包含、别乱派);子 agent 运行中被拒的命令/访问计入 `_subagent_context`,达到 `SUBAGENT_DENIAL_LIMIT`(默认 3)即 `control.abort()` 熔断本轮,拒绝次数附在结论里回传主 agent 自我修正。
|
|
43
|
+
- 文件工具是窄接口,围栏限制在 `PROJECT_ROOT`;项目外路径需要确认。`run_bash` 由 `permissions.json` 裁决:`deny > allow > ask`;如果命令包含项目外路径,即使命中 allow 也会降级为 ask。不要用 bash 绕过文件围栏访问项目外路径。
|
|
44
|
+
- `edit_file` 是容错策略链(AGENT_DESIGN 13 条):L1 精确匹配(count>1 拒绝防误改)→ L2 行级宽容定位(忽略行尾空白/换行差异,仍强制唯一)→ L3 失败时报错带 read_file 指引 + 文件头部预览。改后自动做语法冒烟(tree-sitter),坏代码以带行号的 ⚠ 报错附在工具结果里回喂。两个工程纪律:读写必须 `newline=""` 保真(否则 CRLF 仓库换行风格被毁);`_resolve_safe_path` 必须对 `PROJECT_ROOT` realpath 化(macOS /var→/private/var 符号链接会误判越界)。
|
|
45
|
+
- `$web_search` 在 `config.py` 中被刻意禁用,因为 kimi-k3 当前处理内置工具结果会失败;需要联网时用 `run_bash` + `curl`,并先告诉用户要访问的 URL。
|
|
46
|
+
- UI 输出统一走语义化 helper;tty 与管道都用 `mini_agent/ui/renderer.py`(StreamRenderer:tty 下 Live 增量重排,管道自动降级纯文本直出)。动态/模型文本必须用 `Text`/`markup=False`,避免 `[brackets]` 被当成 Rich markup 解析。
|
|
47
|
+
- `.session.json`、`.chat_history`、`session_todos.json`、`bench/results/` 都是运行时产物,已 gitignore。
|
|
48
|
+
- **评测必留档**:任何真实 API 评测(`bench/run_bench.py` 真跑)完成后必须追加一节到 `bench/EXPERIMENTS.md`(文件头部的强制规范与模板)并随代码提交——负结果也要记;评测抓到内核缺陷(已发生三次:动态注入时序 400、符号链接根误判、@tool 装饰器挂错)是本体系最高价值产出,不许丢在对话里。
|
|
49
|
+
- **评测任务设计准则**(E12 系列豆腐块——新任务/改判分前必须过一遍,每条都有实测事故背书):
|
|
50
|
+
合成 bug 保持无关行为不变(别把 base 既有行为弄丢,如 get 的过期清理 pop);
|
|
51
|
+
ground truth zones 间距必须 > 2×line_tolerance、alias 不得与其它 bug 的 zone 重叠(重叠 → finder 错配 → 假漏检,E12.5 实锤);
|
|
52
|
+
alias 应收录「契约声明处」——docstring 声明契约、实现违反它的 bug,报声明位置是模型的合理定位(E8/E12.8 两次数过);
|
|
53
|
+
OSS 注入(remote revert)只选「修 bug」型单父提交(revert「加功能」型得到的是删功能,不是潜伏缺陷),测试文件回退区标 neutral;
|
|
54
|
+
多样本统计排除 tokens=0 的运行(那是基础设施故障,不是模型漏检,E12.9 实锤)。
|
led_review-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 jljleo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: led-review
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: led——可度量检出率的 code review agent(BYOK:用户自配 AI API key)
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Requires-Python: >=3.13
|
|
7
|
+
Requires-Dist: openai>=1.0
|
|
8
|
+
Requires-Dist: prompt-toolkit>=3.0
|
|
9
|
+
Requires-Dist: python-dotenv>=1.0
|
|
10
|
+
Requires-Dist: rich>=13.0
|
|
11
|
+
Requires-Dist: tree-sitter-go>=0.25
|
|
12
|
+
Requires-Dist: tree-sitter-java>=0.23
|
|
13
|
+
Requires-Dist: tree-sitter-javascript>=0.25
|
|
14
|
+
Requires-Dist: tree-sitter-python>=0.25
|
|
15
|
+
Requires-Dist: tree-sitter-rust>=0.24
|
|
16
|
+
Requires-Dist: tree-sitter-typescript>=0.23
|
|
17
|
+
Requires-Dist: tree-sitter>=0.26
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# led
|
|
2
|
+
|
|
3
|
+
一个 code review CLI:审查一个 diff 范围(PR、分支、工作区改动),输出结构化 findings
|
|
4
|
+
(severity / 文件:行号 / 问题描述 / 修复建议),带 CI 门禁语义。
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
led review main...HEAD # 审查分支改动
|
|
8
|
+
led review # 审查工作区+暂存(默认)
|
|
9
|
+
led review --format json # 机器消费(CI/评测)
|
|
10
|
+
# 有 high findings 时退出码为 1——任何 CI 都能直接当门禁用,不绑定特定平台
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
不带子命令启动则进入通用 coding agent REPL(辅助形态)。
|
|
14
|
+
|
|
15
|
+
> 📖 **完整使用文档见 [docs/USAGE.md](docs/USAGE.md)**——安装、模型档案、review/REPL
|
|
16
|
+
> 两种形态、权限与安全模型、评测体系、开发与排查。
|
|
17
|
+
|
|
18
|
+
## 零操作接入:GitHub Action(用户不需要源码)
|
|
19
|
+
|
|
20
|
+
用户自己的仓库里放一个 workflow(3 行核心 + 一个 secret),PR 一开就自动
|
|
21
|
+
review 并评论,不需要任何人手动调用:
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
# .github/workflows/review.yml
|
|
25
|
+
on: pull_request
|
|
26
|
+
permissions:
|
|
27
|
+
pull-requests: write
|
|
28
|
+
jobs:
|
|
29
|
+
review:
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
with: { fetch-depth: 0 }
|
|
34
|
+
- uses: jljleo/mini-agent@v1
|
|
35
|
+
with:
|
|
36
|
+
api_key: ${{ secrets.KIMI_CODE_API_KEY }} # BYOK:用户自己的 key
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- led 自动从 PyPI 安装(用户仓库拿不到本项目源码也没关系)
|
|
40
|
+
- 默认信息性评论不阻塞合并;想开门禁加 `fail_on_high: "true"`
|
|
41
|
+
- fork PR 自动跳过(防止外部 PR 烧用户的 key)
|
|
42
|
+
|
|
43
|
+
## 凭什么不同
|
|
44
|
+
|
|
45
|
+
- **检出率可度量**:自带 benchmark 体系(`bench/`),review 质量用注入 bug 任务量化
|
|
46
|
+
(检出率/误报率),不靠「看起来能 review」。当前 35 任务(合成 + 真实仓库 revert
|
|
47
|
+
注入,覆盖 Python/Go/Rust/JS),k3 实测结论:合成/跨文件/multi-bug 全检出、
|
|
48
|
+
OSS n=3 零误报(E12 系列,见 `bench/EXPERIMENTS.md`)
|
|
49
|
+
- **代码库感知**:tree-sitter 符号索引(Python/JS/TS/Go/Rust/Java),review 时能定位
|
|
50
|
+
变更的影响面,而不是孤立看 diff
|
|
51
|
+
- **规范可沉淀**:项目的 AGENTS.md 与 `skills/` 约定自动注入 system prompt,作为审查依据
|
|
52
|
+
- **dogfood**:本仓库的提交由它自己 review——首个版本就抓到过一个真 bug(见提交 565d621)
|
|
53
|
+
|
|
54
|
+
## 快速开始
|
|
55
|
+
|
|
56
|
+
要求 Python 3.13+。
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pipx install .
|
|
60
|
+
# 配置 API key:默认档案 kimi-code 需要 KIMI_CODE_API_KEY 环境变量
|
|
61
|
+
# (也可在项目目录放 .env;更多模型档案见 mini_agent/models.default.json)
|
|
62
|
+
cd 你的项目 && led review HEAD
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
从源码运行:`pip install -r requirements.txt` 后 `.venv/bin/python -m mini_agent review HEAD`。
|
|
66
|
+
|
|
67
|
+
## 工作原理
|
|
68
|
+
|
|
69
|
+
review 是一个确定性管道,不是一句 prompt:
|
|
70
|
+
|
|
71
|
+
1. **diff 提取**(`tools/gitdiff.py`):纯 Python、只读——文件级概览(状态/增删行)常驻,
|
|
72
|
+
patch 详情按预算分配,超预算文件降级为概览条目
|
|
73
|
+
2. **审查**:只读会话(read_file / search_symbols / 只读 bash)执行双轴审查——
|
|
74
|
+
正确性(主)+ 规范(对照 AGENTS.md/skills);AGENTS.md、repo map、skills 索引
|
|
75
|
+
自动注入 system prompt
|
|
76
|
+
3. **输出**:约定格式的 findings 由程序解析成结构(解析不动的由 raw 原文兜底),
|
|
77
|
+
high findings → exit code 1
|
|
78
|
+
|
|
79
|
+
底座是一个完整的 coding agent 内核:三级上下文压缩、工具分档发现、类型化子 agent、
|
|
80
|
+
权限裁决、benchmark 评测(见「项目结构」)。
|
|
81
|
+
|
|
82
|
+
## CI 集成
|
|
83
|
+
|
|
84
|
+
review 是宿主无关的批处理命令,任何 CI 都能接入(exit code 门禁 / `--format json` 机器消费)。
|
|
85
|
+
本仓库自带的 GitHub Actions 示例见 `.github/workflows/review.yml`:PR 上自动 review
|
|
86
|
+
并把 findings 评论到 PR——它同时是本项目的 dogfood 闭环(用 PR 自己的代码 review 自己)。
|
|
87
|
+
需要配置 `KIMI_CODE_API_KEY` secret。
|
|
88
|
+
|
|
89
|
+
## 开发
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
.venv/bin/python -m pytest -q # 全部测试(零网络,OpenAI client 已打桩)
|
|
93
|
+
.venv/bin/ruff check . # lint
|
|
94
|
+
.venv/bin/python bench/run_bench.py # benchmark(访问真实 API,写入 bench/results/)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
测试约定见 `tests/conftest.py`(socket 被替换为哨兵,任何真实网络请求立即失败)。
|
|
98
|
+
|
|
99
|
+
## 安全模型
|
|
100
|
+
|
|
101
|
+
- review 会话只读:不能写文件;bash 只有只读白名单命令直通,其余在非交互环境默认拒绝
|
|
102
|
+
- 通用 REPL:文件工具围栏在项目根内,项目外路径需逐次确认;`run_bash` 由
|
|
103
|
+
`permissions.json` 裁决(`deny > allow > ask`);子 agent 权限随类型收窄
|
|
104
|
+
|
|
105
|
+
> ⚠️ 这个项目会让 LLM 在你机器上执行命令。请理解 `permissions.json` 的规则后再放权。
|
|
106
|
+
|
|
107
|
+
## 项目结构
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
mini_agent/
|
|
111
|
+
├── main.py 入口(review 子命令分发 + tty/管道单一主循环)
|
|
112
|
+
├── review.py code review 管道(确定性输入→双轴审查→结构化 findings→门禁)
|
|
113
|
+
├── skills.py skills 机制(索引常驻注入 + read_file 惰性加载)
|
|
114
|
+
├── config.py 运行时配置(模型档案、子 agent 类型、阈值)
|
|
115
|
+
├── repo_map.py tree-sitter 代码库感知
|
|
116
|
+
├── kernel/ 事件生产者(agent / streaming / compact / events / bridge)
|
|
117
|
+
├── tools/ 工具实现与注册表(builtin / registry / gitdiff)
|
|
118
|
+
├── commands/ 斜杠命令实现与注册表(builtin / registry)
|
|
119
|
+
├── ui/ 界面层(renderer / input / segments)
|
|
120
|
+
└── eval/ 评测支撑(judge / trace)
|
|
121
|
+
bench/ benchmark 任务包与驱动
|
|
122
|
+
tests/ 行为契约测试
|
|
123
|
+
AGENTS.md 面向 AI 协作者的仓库约定
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 许可证
|
|
127
|
+
|
|
128
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# led review — 可复用 GitHub Action
|
|
2
|
+
#
|
|
3
|
+
# 用户接入(自己的仓库 .github/workflows/review.yml):
|
|
4
|
+
# name: led review
|
|
5
|
+
# on: pull_request
|
|
6
|
+
# permissions:
|
|
7
|
+
# pull-requests: write
|
|
8
|
+
# jobs:
|
|
9
|
+
# review:
|
|
10
|
+
# runs-on: ubuntu-latest
|
|
11
|
+
# steps:
|
|
12
|
+
# - uses: actions/checkout@v4
|
|
13
|
+
# with: { fetch-depth: 0 } # review 需要 base...HEAD 完整祖先
|
|
14
|
+
# - uses: jljleo/mini-agent@v1
|
|
15
|
+
# with:
|
|
16
|
+
# api_key: ${{ secrets.KIMI_CODE_API_KEY }} # BYOK:用户自己的 key
|
|
17
|
+
#
|
|
18
|
+
# PR 一开就自动 review 并评论,无需用户主动调用。默认信息性评论(--no-fail);
|
|
19
|
+
# 想开门禁设 fail_on_high: "true"(会阻止合并,precision 够格后再用)。
|
|
20
|
+
|
|
21
|
+
name: "led review"
|
|
22
|
+
description: >
|
|
23
|
+
PR 上自动运行 led code review(检出率/误报率可复现的 review agent)并评论
|
|
24
|
+
findings。BYOK:用户自配 KIMI_CODE_API_KEY。
|
|
25
|
+
author: jljleo
|
|
26
|
+
branding:
|
|
27
|
+
icon: "clipboard-check"
|
|
28
|
+
color: "purple"
|
|
29
|
+
|
|
30
|
+
inputs:
|
|
31
|
+
api_key:
|
|
32
|
+
description: "KIMI_CODE_API_KEY(用户自己的 key,Repository secrets 传入)"
|
|
33
|
+
required: true
|
|
34
|
+
review_spec:
|
|
35
|
+
description: "审查范围(git revspec);缺省 = origin/<base>...HEAD"
|
|
36
|
+
required: false
|
|
37
|
+
default: ""
|
|
38
|
+
fail_on_high:
|
|
39
|
+
description: "true 时 high findings 让 job 失败(门禁);默认 false 信息性评论"
|
|
40
|
+
required: false
|
|
41
|
+
default: "false"
|
|
42
|
+
install_from:
|
|
43
|
+
description: "安装来源:缺省 PyPI 包名 led-review(用户场景);本项目 dogfood 传 '.' 装 PR 源码(自举)"
|
|
44
|
+
required: false
|
|
45
|
+
default: "led-review"
|
|
46
|
+
|
|
47
|
+
runs:
|
|
48
|
+
using: "composite"
|
|
49
|
+
steps:
|
|
50
|
+
- name: 跳过 fork PR(secrets 不可用,也防外部 PR 烧 key)
|
|
51
|
+
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
|
|
52
|
+
shell: bash
|
|
53
|
+
run: echo "fork PR 跳过(BYOK secret 只在同仓库 PR 可用)" && exit 0
|
|
54
|
+
|
|
55
|
+
- name: 取 base 分支(review 的 diff 端点)
|
|
56
|
+
shell: bash
|
|
57
|
+
run: |
|
|
58
|
+
# GITHUB_BASE_REF 是 PR 触发的内置环境变量(base 分支);缺省 main
|
|
59
|
+
git fetch -q origin "${GITHUB_BASE_REF:-main}"
|
|
60
|
+
|
|
61
|
+
- name: 安装 led
|
|
62
|
+
shell: bash
|
|
63
|
+
run: pip install -q "${{ inputs.install_from }}"
|
|
64
|
+
# 缺省 install_from=led-review(PyPI,用户场景);dogfood 传 "." 装 PR 源码
|
|
65
|
+
|
|
66
|
+
- name: 运行 led review
|
|
67
|
+
shell: bash
|
|
68
|
+
env:
|
|
69
|
+
KIMI_CODE_API_KEY: ${{ inputs.api_key }}
|
|
70
|
+
REVIEW_SPEC: ${{ inputs.review_spec }}
|
|
71
|
+
FAIL_ON_HIGH: ${{ inputs.fail_on_high }}
|
|
72
|
+
run: |
|
|
73
|
+
SPEC="${REVIEW_SPEC:-origin/${GITHUB_BASE_REF:-main}...HEAD}"
|
|
74
|
+
{
|
|
75
|
+
echo "## 🤖 led review"
|
|
76
|
+
echo
|
|
77
|
+
if [ "${FAIL_ON_HIGH}" = "true" ]; then
|
|
78
|
+
led review "$SPEC" # 门禁:high findings → 非零 → step 失败
|
|
79
|
+
else
|
|
80
|
+
led review "$SPEC" --no-fail || true # 默认信息性评论
|
|
81
|
+
fi
|
|
82
|
+
} > review.md
|
|
83
|
+
|
|
84
|
+
- name: 评论 findings
|
|
85
|
+
if: ${{ github.event_name == 'pull_request' }}
|
|
86
|
+
shell: bash
|
|
87
|
+
env:
|
|
88
|
+
GH_TOKEN: ${{ github.token }}
|
|
89
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
90
|
+
run: gh pr comment "$PR_NUMBER" --body-file review.md
|