Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-25 20:50 UTC

clojure-emacs / clj-refactor.el

A CIDER extension that provides powerful commands for refactoring Clojure code.

Emacs Lisp · GherkinGPL-3.0★ 785 зірок⑂ 111 форківз січ. 2013 р.Переглянути на GitHub ↗

clojure-emacs/clj-refactor.el має індекс здоров’я 64 зі 100, що відповідає смузі «Помірний». Найвищий показник — Community & Adoption (78/100), найнижчий — AI Readiness (32/100). Останнє оновлення було 9 днів тому. Більшість нещодавньої роботи виконують 2 учасники.

64
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

64
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

clojure-emacsОрганізація
91 підписник31 публічний репозиторійз лип. 2013 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

65Помірний · 22% загального індексу
Як обчислюється оцінка
28.8/36Свіжість push — останній push 9 дн. тому
2.8/36Ритм комітів — 4/52 тижнів із комітами
16.2/18Обсяг комітів — 63 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year63
human_commit_share1
days_since_last_push9
active_weeks_last_year4
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 4 релізів
36/36Свіжість релізів — останній реліз 9 дн. тому
5.4/27Ритм релізів — реліз кожні ~776,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count4
latest_release_tagv4.0.0
releases_from_tagsні
days_since_latest_release9
mean_days_between_releases776,4
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

78Добрий · 18% загального індексу
Як обчислюється оцінка
46.9/60Зірки — 785 зірок
17/25Форки — 111 форків
7.7/15Спостерігачі — 25 спостерігачів
Використані вхідні дані
forks111
stars785
watchers25
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (GPL-3.0)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
7.2/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateтак
has_code_of_conductні
has_pull_request_templateтак

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

68Помірний · 24% загального індексу
Як обчислюється оцінка
25.2/54Бас-фактор — на 2 контриб’ютор(ів) припадає половина всіх комітів
14.2/22.5Розподіл комітів — головний контриб’ютор — автор 37% комітів
13.5/13.5Широта контриб’юторів — 53 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 11 contributing companies or organizations
Використані вхідні дані
bus_factor2
contributors_sampled53
top_contributor_share0,368
Як обчислюється оцінка
43.2/46.8Вирішення issue — закрито 92% issue
33.1/38.3Прийняття PR — злито 193/223 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/23 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs193
open_issues29
closed_issues347
issue_closed_ratio0,923
closed_unmerged_prs30
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
14.1/25Охоплення власника — 91 підписників у clojure-emacs
23/25Послужний список — 31 публічних репозиторіїв, вік облікового запису ~13 р.
Використані вхідні дані
followers91
owner_typeOrganization
is_verified
owner_loginclojure-emacs
public_repos31
account_age_days4 749

Інженерна якість

Чи наявні базові інженерні практики та документація?

63Помірний · 20% загального індексу

Інженерні практики

48У зоні ризику
Як обчислюється оцінка
24/24Процеси CI — 1 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 22 merged PRs checked by a CI test -- score normalized to 0
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

85Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
10/10Теми — 8 тем
10/10Wiki
Використані вхідні дані
topicsrefactorings, refactoring-functions, clojure, emacs, emacs-mode, emacs-lisp, cider, nrepl
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

44У зоні ризику · 16% загального індексу

Стан безпеки

44У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
0/2.5CI-Tests — 0 out of 22 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/23 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 11 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,4
Виключено з оцінювання (немає даних або не застосовно): branch_protection, packaging, signed_releases. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

32У зоні ризику · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
32.5/40Читабельна історія комітів — намір зазначено у 61 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,61
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
0/10Відтворюване середовище
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileні
typed_languageні
bootstrap_filesMakefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
0/45Типізований код — Emacs Lisp без конфігурації перевірки типів
0/55Керовані розміри файлів — файлів вихідного коду не виявлено
Використані вхідні дані
primary_languageEmacs Lisp
largest_source_bytes
source_files_sampled0
oversized_source_files0
Виключено з оцінювання (немає даних або не застосовно): Керовані розміри файлів. Залишкові ваги перенормовано.
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

Ключові факти

785зірок GitHub
53контриб'юторів
63комітів за останні 12 місяців
9днів від останнього пушу
4релізів
2бас-фактор
29відкритих issue
пакетних екосистем

Попередження щодо збору даних

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Докладніше

Історія зірок і форків 0 ★ / 111 ⇿
0Зірки
111Форки
3Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

02040608010012011142013-012019-062025-10
Мажорні 1Мінорні 1Патчі 1

Кожна точка охоплює 12 днів.

OpenSSF Scorecard 4.4 / 10
4.4сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-25 20:49 UTC

10Binary-Artifactsno binaries found in the repo
н/дBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
0CI-Tests0 out of 22 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/23 approved changesets -- score normalized to 0
10Contributorsproject has 11 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Усі залежності 0

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 0 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies to assess

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "refactorings",
        "refactoring-functions",
        "clojure",
        "emacs",
        "emacs-mode",
        "emacs-lisp",
        "cider",
        "nrepl"
      ],
      "is_fork": false,
      "size_kb": 6796,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Gherkin": 90714,
        "Makefile": 605,
        "Emacs Lisp": 291005
      },
      "pushed_at": "2026-07-16T15:45:55Z",
      "created_at": "2013-01-30T06:44:10Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-16T15:46:26Z",
      "description": "A CIDER extension that provides powerful commands for refactoring Clojure code.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "master",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "Emacs Lisp",
      "significant_languages": [
        "Emacs Lisp",
        "Gherkin"
      ]
    },
    "owner": {
      "blog": "https://cider.mx",
      "name": null,
      "type": "Organization",
      "login": "clojure-emacs",
      "company": null,
      "location": null,
      "followers": 91,
      "avatar_url": "https://avatars.githubusercontent.com/u/5080083?v=4",
      "created_at": "2013-07-24T09:34:37Z",
      "is_verified": null,
      "public_repos": 31,
      "account_age_days": 4749
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-3.0",
      "raw_spdx": "GPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2026-07-16T15:46:13Z"
        },
        {
          "tag": "3.0.0",
          "kind": "major",
          "published_at": "2021-10-26T06:02:30Z"
        },
        {
          "tag": "v2.5.1",
          "kind": "patch",
          "published_at": "2021-02-16T09:58:24Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2020-02-29T11:07:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "2805bd5f505fdb199a8c5a25fca398ec9c161e5b",
          "body": null,
          "is_bot": false,
          "headline": "Release 4.0.0",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:45:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f759387d8ddede6dd768c08266476086efca80aa",
          "body": "With CIDER 2.0 out the door there's little reason to keep supporting\nyear-old CIDER releases in a new major version of clj-refactor. Bump\nPackage-Requires and drop the load-time defaliases that papered over\nthe pre-2.0 API names (cider-nrepl-send-sync-request,\ncider-ensure-connected).",
          "is_bot": false,
          "headline": "Require CIDER 2.0",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:28:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0171a1bfb00bb5c47403917c221e56bedc59ec9",
          "body": "The dep-slimming and alias removal shipped with the 4.0 work, and the\necukes suite is in fact wired into CI. Add the clojure-ts-mode vetting\nsweep and the eventual jack-in injection API migration as known work.",
          "is_bot": false,
          "headline": "ROADMAP: mark the finished cleanup items, add two new ones",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d6abf9aea4cd21f3c6067d521deca73f3833c6b",
          "body": "The setup instructions only mentioned clojure-mode-hook, so\nclojure-ts-mode users following them never got clj-refactor-mode\nenabled.",
          "is_bot": false,
          "headline": "README: document enabling clj-refactor-mode with clojure-ts-mode",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03dcf8b3ce41827fd644398d3d2d3273ff28fde0",
          "body": "The Version header said 3.12.0, cljr-version said 3.11.3, and the\nREADME compatibility table already talks about 4.0.0+. Set both to\n4.0.0-snapshot (the convention CIDER uses between releases); the\n-snapshot suffix gets dropped at the release cut. cljr-version is\nuser-visible - the middleware out-of-sync warning prints it.",
          "is_bot": false,
          "headline": "Align the version metadata ahead of 4.0",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61d131b96f19dc1b4ecb4ed401c26d19e55ec6fd",
          "body": "clojure-ts-mode installs a tree-sitter forward-sexp-function, which\nturns clojure-sort-ns's syntax-table-based walk into a silent no-op:\ncljr-clean-ns without a REPL reported success while leaving the ns\nform untouched (same for cljr-auto-sort-ns). Force the default sexp\nmovement around the sort. The proper fix belongs in clojure-sort-ns\nitself; this shields our two call sites until that lands.",
          "is_bot": false,
          "headline": "Fix the offline ns sort doing nothing in clojure-ts-mode",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c267fd9858e54d100d276d77e6eef03bb0689239",
          "body": null,
          "is_bot": false,
          "headline": "README: old refactor-nrepl works again, 3.13.0+ is just recommended",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1afc013c4bfadb6848d251c07ec5cc9f627d7d5a",
          "body": "CIDER 2.0's senders reject unsupported ops client-side, so when\nrefactor-nrepl isn't on the classpath the connect-time version probe\nsignaled a user-error from cider-connected-hook: the out-of-sync\nwarning never fired, the artifact-cache init was skipped, and the echo\narea showed a cryptic message blaming cider-nrepl. Report a failed\nprobe as a message and return nil, so the existing warning path kicks\nin instead.",
          "is_bot": false,
          "headline": "Don't error out of cider-connected-hook when the middleware is missing",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c76af580b59c3ba481247e66b477a36e7f7dce2",
          "body": "The switch to namespaced middleware ops silently broke every command\nagainst refactor-nrepl < 3.13.0, which only advertises the bare names.\nWorst hit was cljr-slash: its middleware-unavailable fallback is\ndeliberately quiet, so magic requires for project aliases just stopped\ndoing anything.\n\nResolve each op against the connection instead: prefer the canonical\nrefactor/ form and fall back to the bare name when only that is\nadvertised, mirroring what CIDER 2.0 does for its own legacy op names.",
          "is_bot": false,
          "headline": "Fall back to bare op names on old refactor-nrepl",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fda7cffff635facf057d4bf4901a8ad22184aae",
          "body": "Normalize all bullets to dashes, disable the line-length and\nduplicate-heading rules that don't fit a changelog, and wrap one\nbare issue URL.",
          "is_bot": false,
          "headline": "Make the changelog pass markdownlint",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c889b207b26ade7ba5917a0cfcd13fec333939f2",
          "body": "Mirrors the config used in CIDER.",
          "is_bot": false,
          "headline": "Add markdownlint config",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f11383b643a46bb41f657455a55900682e6baf1c",
          "body": "Three improvements found while auditing the middleware request/response\nshapes:\n\n- Use refactor-nrepl's namespaced op names (refactor/find-symbol, etc.)\n  instead of the bare ones. refactor-nrepl registers every op under both\n  forms, treats the namespaced one as canonical, and plans to drop the\n  b\n[…]\ner-language-context /\n  input-language-context since 3.7.0.\n\nValidated live against refactor-nrepl 3.14.0: op-support, version,\nrename, clean-ns and suggest-libspecs all work under the namespaced ops.",
          "is_bot": false,
          "headline": "Use namespaced middleware ops; tidy two request params",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T14:23:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9bdd019975fd2033d2c83e7129ddfeb9958c3739",
          "body": "The async operations (cljr-rename-symbol, cljr-change-function-signature,\ncljr-rename-file-or-dir) now run a mode-line spinner while the middleware\nis working, so it's obvious the command is still in progress rather than\nhaving silently done nothing.\n\nThe spinner is started in the calling buffer whe\n[…]\neuses\nCIDER's spinner (cider-spinner-start), so it respects cider-show-spinner\nand the related settings. Adds spinner to Package-Requires - it's a tiny\nlibrary already pulled in transitively by cider.",
          "is_bot": false,
          "headline": "Show a mode-line spinner during async refactorings",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T10:37:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af61112d51720c81488b96368c84f23ac4753da9",
          "body": "cljr-rename-symbol and cljr-change-function-signature located every\noccurrence with the blocking cljr--find-symbol-sync, freezing Emacs while\nthe middleware analysed the whole project - which on a cold cache or a\nlarge project could be a long time.\n\nThey now use a new cljr--find-symbol-occurrences, \n[…]\nied across two files on confirm (left\nthem untouched on decline); change-signature returned before its edit\nbuffer existed, the deferred callback opened it, and commit swapped params\nacross two files.",
          "is_bot": false,
          "headline": "Find occurrences asynchronously in rename and change-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T09:54:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a0cf1d8716c4b8bb829e4664f1b1da3b9f6c876",
          "body": "Renaming a file rewrites references to it across the whole project, which\ncan take a while. It used a blocking cljr--call-middleware-sync, freezing\nEmacs until the middleware responded. It now fires the request through a\nnew cljr--call-middleware-async-collect helper and does the rest - the\ncompleti\n[…]\n\nValidated live against a real refactor-nrepl connection: the command\nreturns immediately, then renames the file, updates its ns, and rewrites\na requiring file's :require once the middleware responds.",
          "is_bot": false,
          "headline": "Run cljr-rename-file-or-dir asynchronously",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T09:34:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa49bbddca4adeddb3e93aeba2ae795b0feef65e",
          "body": "Route cljr-inline-symbol through cljr--run-previewable-refactoring, like\nrename and change-signature: gather the edits, show a diff, and write\nonly on confirm. Its two save-buffer calls (after the occurrence loop and\nin cljr--delete-definition) become cljr--save-buffer so they defer during\na preview\n[…]\nactually being applied.\n\nValidated live against a real refactor-nrepl connection: inlining a def\n(both usages replaced, definition removed) previewed and applied on\nconfirm, left untouched on decline.",
          "is_bot": false,
          "headline": "Preview cljr-inline-symbol too",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T09:16:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4022852ce0c7a630e158f1d6f54156cb0f7def7",
          "body": "cljr-rename-symbol and cljr-change-function-signature rewrite files\nacross the whole project and used to save each one immediately, with no\nway to see the changes first or take them back.\n\nThey now run through cljr--run-previewable-refactoring: the edits are\ngathered in-memory (cljr--save-buffer def\n[…]\nr's unrelated\nunsaved work is never silently lost or written out.\n\nValidated live against a real refactor-nrepl connection (rename across\ntwo files: confirm applied both, decline left both untouched).",
          "is_bot": false,
          "headline": "Preview project-wide refactorings before applying them",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T07:48:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7ac3c832d0b91f66dd9571b57543478378985550",
          "body": "Building on the tagged add/remove model, the command now handles\nmulti-arity defns. It prompts for which arity to change (cljr--choose-arity\nover cljr--get-function-arities) and edits just that one: the definition's\nmatching lambda list plus the call sites whose argument count matches.\n\ncljr--goto-a\n[…]\neal refactor-nrepl connection: reordering a chosen arity\nswapped its lambda list, an internal recursive call, and external calls\nof that arity, while the other arity and its call sites were untouched.",
          "is_bot": false,
          "headline": "Support multi-arity functions in cljr-change-function-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T07:01:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ccf45d6a1983ac0a42a26f97f9bf0cbf996a5dfd",
          "body": "Extends the refactor beyond reorder/rename. The signature-changes model\nis now tagged with an :op per entry - :keep (reorder/rename, the default\nwhen absent, for backward compatibility), :add (a new parameter, with a\nplaceholder for call sites), and :remove. The edit buffer gains `a` to\nadd a parame\n[…]\nked test suite never exercised the\nreal format.\n\nValidated end to end against a live refactor-nrepl connection: add,\nremove and reorder across multiple files, including a cross-file aliased\ncall site.",
          "is_bot": false,
          "headline": "Add and remove parameters in cljr-change-function-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T06:30:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e961de4ad9b339e4192b511cf8857b14f598750e",
          "body": "cljr-clean-ns errored out whenever the clean-ns middleware op wasn't\navailable. Pruning unused libspecs does need analysis, but sorting the\nns form is purely syntactic - so when the op is unavailable, fall back\nto clojure-mode's clojure-sort-ns and skip pruning, instead of failing\noutright.\n\nSame fallback for the auto-sort hook (cljr-auto-sort-ns): it now sorts\nthe ns form offline rather than doing nothing until a REPL is connected.",
          "is_bot": false,
          "headline": "Make cljr-clean-ns degrade gracefully without a REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T07:07:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80f4df309889719108b6913673fceb2a99c6fbec",
          "body": "cljr--op-supported-p delegates to cider-nrepl-op-supported-p, which\nresolves the REPL with the `ensure' flag and signals \"No linked CIDER\nsessions\" when nothing is connected. So the offline fallbacks that gate\non this predicate never got a chance to run: typing `/' offline\n(cljr-slash) or invoking c\n[…]\nalling back to the static cljr-magic-require-namespaces\ntable.\n\nGuard on cider-connected-p first so the predicate returns a plain nil\nwhen disconnected, matching how it's used everywhere as a boolean.",
          "is_bot": false,
          "headline": "Don't error in cljr--op-supported-p when no REPL is connected",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T07:07:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18a3f605a30800a64ff21327321e3a75605cb80f",
          "body": "cljr--init-artifact-cache / cljr--update-artifact-cache fire an async\nartifact-list request on REPL connect (governed by\ncljr-populate-artifact-cache-on-startup, on by default), but their\ncallbacks only logged and threw the response away. That warmed\nrefactor-nrepl's server-side cache, yet the Emacs\n[…]\nll blocked on the full artifact-list\ntransfer and parse.\n\nHave both warmers populate cljr--artifacts-cache from the response, so\nthe common case is served from cache without any middleware round-trip.",
          "is_bot": false,
          "headline": "Populate the Emacs-side artifact cache from the async warmer",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:48:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eec36894551dfe1a0e4341fcb7b53dc658dfcfe0",
          "body": "cljr-slash has defaulted to the language-context-aware suggest-libspecs\nop (with a static offline fallback) for a while now, gated behind\ncljr-slash-uses-suggest-libspec. Drop the old namespace-aliases code\npath entirely, along with that flag and the two options that only fed\nit: cljr-suggest-namesp\n[…]\ns at the live path (stub\ncljr--call-middleware-suggest-libspec instead of the old op) so the\nintegration coverage of the guards, keyword aliases and reader-\nconditional context detection carries over.",
          "is_bot": false,
          "headline": "Remove the deprecated namespace-aliases path from cljr-slash",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:24:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fefbcaf34f5704dbf2b35a4f47e488a64ee08bf2",
          "body": "Removing a let and inlining its bindings is a purely local structural\nedit, but cljr-remove-let drove cljr-inline-symbol once per binding -\nrequiring the extract-definition middleware op and showing the\n\"the project will be evaluated\" warning each time.\n\nReimplement it locally: inline each binding's\n[…]\n refers to an earlier one resolves), then\nsplice the let with the existing cljr--eliminate-let. Reuses clojure-mode's\nsexp matching, so it's no less accurate than the move-to-let direction it\nmirrors.",
          "is_bot": false,
          "headline": "Make cljr-remove-let work without a REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:14:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0337057a742275b5fbb781d3fb6c2f05bc30439c",
          "body": "cljr-promote-function required the find-used-locals middleware op (and\nshowed the scary \"the project will be evaluated\" warning) even to turn a\n#() literal into an fn - a purely local edit. And its literal converter\nduplicated, less robustly, clojure-mode's clojure-promote-fn-literal.\n\nDelegate the \n[…]\nning) and gate the middleware/warning only on the fn->defn\npromotion, which genuinely needs captured-locals analysis. Removes the\nnow-dead cljr--promote-function-literal and cljr--append-fn-parameter.",
          "is_bot": false,
          "headline": "Promote #() literals without a REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:10:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a305a4e78ea535ebaddbdd3ea1b366d58975dd7a",
          "body": "Audit follow-up:\n\n- cljr-introduce-let / cljr-move-to-let were one-line pass-throughs to\n  clojure-introduce-let / clojure-move-to-let; make them obsolete aliases\n  and point the keybindings and menu at the clojure-* commands directly\n  (the thread/unwind/cycle/convert commands already work this way\n[…]\ning.\n\n- Surface cljr-reify-to-defrecord in clj-refactor-menu (it had no binding\n  or menu entry).\n\n- Delete the dead cljr--goto-if (leftover from before cljr-cycle-if\n  delegated to clojure-cycle-if).",
          "is_bot": false,
          "headline": "Clean up redundant wrappers and small UX gaps",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T11:35:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9afc99b448d6a813d85cddbca1c3f45fc5d9f620",
          "body": "From an audit of the public command surface:\n\n- cljr-add-declaration: cljr--already-declared-p fed the def name to\n  re-search-backward as a regexp without quoting or symbol boundaries, so\n  names with regexp specials (*db*, valid?, +, ...) matched wrong and\n  substrings of a symbol counted as decla\n[…]\ndependency: bound the\n  :deps/:dependencies searches and error clearly when absent instead of a\n  raw \"search failed\"; remove a stray no-op op-check after hotloading;\n  note deps.edn in the docstring.",
          "is_bot": false,
          "headline": "Fix correctness issues in several commands",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T11:32:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c3b32b52679c83d2af720198584204baa3a5416",
          "body": "cljr-add-missing-libspec hard-required the resolve-missing middleware op,\nso it errored without a REPL, and dead-ended with \"Can't find on\nclasspath\" when a referenced library wasn't a dependency.\n\nKeep the resolve-missing path (its main, symbol-based resolution), but\nwhen the op is unavailable or f\n[…]\nng library (cljr-slash-add-missing-libs).\n\nThis folds the two genuinely-useful bits of the reverted\ncljr-require-alias-at-point into the existing command instead of adding a\nseparate, overlapping one.",
          "is_bot": false,
          "headline": "Give cljr-add-missing-libspec an offline fallback",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T10:49:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b84b88950ab9c7dcf385f4c5b78cfe9f38b09b78",
          "body": "This reverts commit db214d1. The command overlaps with the existing\ncljr-add-missing-libspec, which already requires the aliased symbol at\npoint (str/join -> aliases the ns to str). The only thing the new command\nadded was working without a REPL, which is too niche to justify a second,\noverlapping command.",
          "is_bot": false,
          "headline": "Revert \"Add cljr-require-alias-at-point\"",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T10:32:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db214d19f162f54f821fd68753379d0c8fe68ee1",
          "body": "cljr-slash only adds a require as you type the / after an alias, so it\ncan't help code you pasted (where the / is already there). Add a command\nthat requires the unresolved alias of the symbol at point - point can be\nanywhere in the aliased symbol, e.g. on str/join. It reuses cljr-slash's\nresolution (offline-capable via cljr-magic-require-namespaces, and can add\na missing lib), and is bound to ra and listed in clj-refactor-menu.",
          "is_bot": false,
          "headline": "Add cljr-require-alias-at-point",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T08:28:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0f62e880c4a13e09dc3ebaf661c4eeb35a0615b",
          "body": "Extend cljr-magic-require-namespaces so an entry can carry an :artifact\ncoordinate, e.g. (\"json\" \"cheshire.core\" :artifact \"cheshire/cheshire\").\nWhen cljr-slash resolves an alias to such an entry and the namespace\nisn't on the classpath, it offers (with confirmation) to add that\nartifact at its late\n[…]\n on) and only\nfires for aliases explicitly configured with an :artifact. The runtime\nadd/hotload composes existing, tested commands; unit tests cover the\nconfig parsing and the orchestration (mocked).",
          "is_bot": false,
          "headline": "Let cljr-slash add and hotload a missing library",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T05:27:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b86ffebef337007a9d586c7b243485fadd6bff7",
          "body": "cljr-slash resolves an unresolved alias to a require via the\nsuggest-libspecs middleware op. When no REPL is connected, that op check\n(cljr--ensure-op-supported -> cljr--assert-middleware) signals a\nuser-error, so typing / after an alias did nothing but complain.\n\nFall back to the static cljr-magic-\n[…]\nlanguage context) and insert the libspec directly - no network, no error.\nCommon aliases (str, io, set, ...) now work before you jack in, and the\nmiddleware path is unchanged when a REPL is connected.",
          "is_bot": false,
          "headline": "Make cljr-slash work without a running REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T05:24:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcb9b72dab69d7f310f132e84d614d31f2c63255",
          "body": "Captures the plan for add/remove parameters and multi-arity support:\nthe current permutation-only model, why add/remove/multi-arity break it,\nthe proposed tagged signature-changes model, edit-buffer UI, call-site\nsemantics (placeholders for adds, manual-intervention for removes), the\nmulti-arity phase, risks, testing strategy and phasing. To be revisited\nwhen we implement it (needs a live REPL for integration testing).",
          "is_bot": false,
          "headline": "Add a design doc for extending change-function-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-08T07:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fc45d4ca4db73d12260d1b6d80da9439abc5162",
          "body": "clojure-mode already provides clojure-convert-collection-to-list/map/\nvector/set/quoted-list (the old cljr-cycle-coll was removed in 2.3.0 in\nfavor of these), so rather than reimplement, add a \"Convert collection\nto\" group to clj-refactor-menu that invokes them - making them\ndiscoverable from clj-refactor without duplicating the logic.",
          "is_bot": false,
          "headline": "Surface collection-type conversions in the menu",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-08T07:13:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c3396455a07b8ae1f34e01b9fe737555d10c4da",
          "body": "cljr-slash fires on every / keystroke and, for an unresolved alias, did a\nsynchronous suggest-libspecs middleware round-trip each time - felt\ndirectly while typing str/, io/, etc. Cache the suggestions per (alias,\nlanguage-context), expiring per cljr-artifact-cache-ttl, so repeated use\nof the same a\n[…]\nsn't queried\nagain, keeping the cache correct.\n\nFull async was avoided on purpose: the flow can prompt for a libspec, and\nfiring that prompt from an async callback would interrupt the user\nmid-typing.",
          "is_bot": false,
          "headline": "Cache cljr-slash libspec suggestions per alias",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-08T07:12:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e0075eff0c5337573d8843cc59054f5695f44ac",
          "body": "Three focused improvements to how project-wide and network-bound\ncommands behave:\n\n- Don't leak buffers. Rename symbol, inline symbol and change function\n  signature opened every affected file with find-file-noselect and never\n  killed the ones they opened, accumulating buffers (and slowing Emacs)\n \n[…]\nhe dependency commands\n  (new cljr-artifact-cache-ttl, default 300s) so they aren't re-fetched\n  from the middleware on every invocation.\n\nAdds unit tests for the buffer-tracking helper and the cache.",
          "is_bot": false,
          "headline": "Responsiveness quick wins",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T17:02:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7909baec7fd92e6ac3d98c0a166a00631c8c5ec",
          "body": "Restore the discoverability the hydra menus used to provide, using a\nbuilt-in transient instead of the dropped hydra dependency.\n\nclj-refactor-menu groups every command by category (namespace, code,\ntop-level form, project) keyed by the same two-letter mnemonics as the\nkeybindings, so the menu doubl\n[…]\nrs)\nfor the session. It's bound to hh under the user's prefix (the old hydra\nkey).\n\nA drift test asserts every command in cljr--all-helpers is reachable in\nthe menu, so the two can't fall out of sync.",
          "is_bot": false,
          "headline": "Add a transient menu for the command surface",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T12:58:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f55d2e6ff7ccd62147f2392a1317d4e6880a6821",
          "body": "Bump the example refactor-nrepl/cider-nrepl plugin versions (3.10.0 ->\n3.14.0, 0.45.0 -> 0.61.0), which were years out of date, and add a\ncompatibility-table row for the 4.0 line plus a note about the Emacs 28.1+\nrequirement.",
          "is_bot": false,
          "headline": "Refresh the README",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T12:18:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c99141cad0369e8a92913095d34fb7d3e08edc6",
          "body": "- Inline cl-evenp at its one call site and drop the pointless\n  cljr--evenp alias.\n- Remove the dead &optional _for-compat arg from cljr--version (all\n  callers already pass no args).\n- Use with-eval-after-load instead of the old eval-after-load + quoted\n  form for the jack-in dependency injection.\n\n[…]\nngs wrappers around cider-current-repl and\n  cider-nrepl-eval-session; both are current, defined CIDER functions, so\n  the suppression is no longer needed (compiles clean with\n  --warnings-as-errors).",
          "is_bot": false,
          "headline": "Tidy up remaining dead code",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T12:18:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8852c2cfc84b48b42884cb3beb13341c1a0429a4",
          "body": "The hydra menus were removed along with the hydra dependency, so the\npointer to them (and the Hydra wiki page) no longer applies.",
          "is_bot": false,
          "headline": "Drop the README reference to the hydra popup menus",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T10:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0845975856f18b2b902776c595a2da17f6eecee0",
          "body": "Add a short list of the inherent limitations of the AST-based commands\n(need a live REPL, don't work on uncompilable code or ClojureScript, slow\nfirst use, macros only approximated), with pointers to\ncljr-ignore-analyzer-errors, refactor-nrepl's fuller writeup, and\nclojure-lsp for the static/cljs/no-REPL cases.",
          "is_bot": false,
          "headline": "Document what to expect from the AST-based refactorings",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T10:15:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "628e246037fa92f51cde6465dfb9c493102e6f20",
          "body": "These are niche these days and pulled real weight for narrow features:\n\n- hydra backed only the discoverability menus, which just mirror bindings\n  that already exist in the keymap. Drop the menus and the hh/hn/... keys.\n- multiple-cursors backed an optional interactive mode for the let, extract\n  a\n[…]\nead.\n\nUpdate the ecukes let-binding scenarios to drive the name prompt via an\naction chain (as the promote-function feature already does), and drop the\nnow-defunct \"I don't use multiple-cursors\" step.",
          "is_bot": false,
          "headline": "Drop the multiple-cursors, hydra and inflections dependencies",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T10:15:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b725cc39bfff17a949daa147eb37f391cfbb5591",
          "body": "Track a released tag instead of master, matching what CIDER does. Keeps\nCI reproducible and avoids surprise changes from the action's master\nbranch.",
          "is_bot": false,
          "headline": "Pin the setup-emacs action to v3",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T14:09:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac0af32d1cbd0548442ee9859f1882286f4393db",
          "body": "The threading and cycling refactorings moved to clojure-mode years ago,\nand these cljr- aliases have carried obsolescence warnings since 2.3.0.\nAt this point they're just dead surface, so drop them along with the\n2.3.0 cljr-find-usages-ignore-analyzer-errors variable alias. Users\nshould call the clojure-* commands (or cljr-ignore-analyzer-errors)\ndirectly.",
          "is_bot": false,
          "headline": "Remove the long-obsolete 2.3.0-era aliases",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:28:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f30f85d35deb8f7044dacf547888253ae625b3b8",
          "body": "The command was stubbed out years ago because the old Alembic-based\nmiddleware didn't work on Java 9/10. refactor-nrepl since reimplemented\nhotloading on top of clojure.tools.deps (refactor-nrepl #231), so restore\nthe real implementation and flip cljr-hotload-dependencies back to its\noriginal default of t. The backend now also accepts deps.edn-style\ncoordinate maps, not just Leiningen vectors.",
          "is_bot": false,
          "headline": "Re-enable cljr-hotload-dependency",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:27:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7c31736b824a980c0366ca7a73d2540979cf83e",
          "body": "There's no run-tests.sh in the repo; tests run via make test (as the\nREADME already documents).",
          "is_bot": false,
          "headline": "Fix the test command in the PR template",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:26:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08be5f155cf9617623e16af37f52d23fb474d50e",
          "body": "Spell out where clj-refactor.el and refactor-nrepl are headed: slim down\nthe Emacs client, move the analysis-free features into CIDER, and replace\nthe tools.analyzer index with a faster, static clj-kondo-based one. Mirrors\nthe CIDER 2.0 direction (see CIDER #3356).",
          "is_bot": false,
          "headline": "Add a project roadmap",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "394d273e0dc3e087c0c3eb58322e887ed5cf2dc4",
          "body": "CIDER 1.23 deprecated cider-nrepl-send-sync-request (now\ncider-nrepl-sync-request) and cider-ensure-connected (now\ncider-ensure-session), which turned our byte-compilation red against\nrecent CIDER. Alias to the modern names when they're available and fall\nback to the old ones, so we keep working wit\n[…]\npported check in cljr--ns-path:\nit checked the bare \"ns-path\" op while the request actually sends the\nnamespaced \"cider/ns-path\", whose support modern CIDER enforces in the\nnREPL sender automatically.",
          "is_bot": false,
          "headline": "Use CIDER 1.23's renamed nREPL API with a fallback",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:23:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39c9688c79e1d00965621d04c04fe1ddde4b571f",
          "body": "- Fix docstring typos (\"in in\" -> \"in\")\n- Fix variable name typo (cjr--occurrence-count -> cljr--occurrence-count)\n- Replace cljr--evenp with cl-evenp (already using cl-lib)\n- Replace cljr--aget with alist-get (built-in)\n- Replace seq-elt with seq-first and remove outdated compat comment\n- Make cljr--empty-buffer-p more efficient (search instead of\n  copying entire buffer contents into a string)",
          "is_bot": false,
          "headline": "Misc code cleanup: fix typos, remove compat shims, simplify helpers",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-04-03T08:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa18cd463568b2710eabf1a664ab11e260d0c777",
          "body": "… 24)",
          "is_bot": false,
          "headline": "Simplify cljr--pkg-version (package-get-version available since Emacs…",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-04-03T08:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "578d918aec74c213d6ec1a43cfb3d689759a947b",
          "body": null,
          "is_bot": false,
          "headline": "Remove seq from Package-Requires (built-in since Emacs 25)",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-04-03T08:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30a9d2716097b825e0cc00cd298dcb9547bcc78d",
          "body": null,
          "is_bot": false,
          "headline": "Update actions/checkout to v5 to fix Node.js 20 deprecation warning",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:19:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19d16e2722b76ce1dc5a2f0365fd263d98de905c",
          "body": null,
          "is_bot": false,
          "headline": "Fix remaining indentation in clean-ns form",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:16:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f255ebb4febc68fe75ccbc80352e19693dfedad",
          "body": null,
          "is_bot": false,
          "headline": "Fix indentation for if-let*/when-let* and run lint only on Emacs 30",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:14:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2c2b30e9416346fe20222b53fadb2d11aea5e73",
          "body": "This reverts commit 2ad77b07aeb9fa965861d46392aede40f55b15e8.",
          "is_bot": false,
          "headline": "Revert \"Fix indentation after if-let*/when-let* migration\"",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:11:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ad77b07aeb9fa965861d46392aede40f55b15e8",
          "body": null,
          "is_bot": false,
          "headline": "Fix indentation after if-let*/when-let* migration",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:57:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "683f84a77f5bce19f97ee8102cd2c25fd1a66869",
          "body": null,
          "is_bot": false,
          "headline": "Fix if-let*/when-let* binding syntax for compat with Emacs 28+",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:43:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac21b9b34f9b3c732c0e6ab3850df5275b8f7ee",
          "body": null,
          "is_bot": false,
          "headline": "Replace if-let/when-let with starred variants for Emacs 31 compat",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48eb2cab291e9a0506d9cdc3d99c6cf05f56b0a7",
          "body": null,
          "is_bot": false,
          "headline": "Fix CI: use exact Emacs versions and add lexical-binding to tests",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8021ef279fc64f858041f5c3781e7051a76aba31",
          "body": null,
          "is_bot": false,
          "headline": "Bump minimum Emacs version to 28.1",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfeec69a94118991821be3d1362307afcd1845b1",
          "body": null,
          "is_bot": false,
          "headline": "Replace CircleCI with GitHub Actions",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85d040c40cad6e9e2d6b6c11e25fb9721e03652d",
          "body": null,
          "is_bot": false,
          "headline": "Replace Cask references with Eldev in contribution docs",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:10:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6687f032c883a7d8e46c123254e899441f8774e9",
          "body": null,
          "is_bot": false,
          "headline": "Fix typos and grammar mistakes in docs",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:08:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362cb46bf808dc42d2aaf022afe93048439680c4",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade refactor-nrepl to version 3.11.0",
          "author_name": "Roman Rudakov",
          "author_login": "rrudakov",
          "committed_at": "2025-05-14T19:03:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc1bbc8cdaa723bdbb6669ea7d280625c370755d",
          "body": "This allows for cleaning up whitespace even if there are no structural changes.",
          "is_bot": false,
          "headline": "Pass :always-return-ns-form true to clean-ns (#558)",
          "author_name": "Moritz Heidkamp",
          "author_login": "DerGuteMoritz",
          "committed_at": "2024-03-10T20:54:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa3efe18e7150df5153a7d05c54e96d59398a0a8",
          "body": "…g `cljr-suggest-libspecs`",
          "is_bot": false,
          "headline": "v3.11.3: Fix incorrectly serialized values for `cljr-slash` when usin…",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2024-01-16T11:19:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3b5238345e0991785e5170112f5db9c9663b7fb",
          "body": "Fixes https://github.com/clojure-emacs/clj-refactor.el/issues/556",
          "is_bot": false,
          "headline": "3.11.2",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-12-03T18:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0207665fce979fa88a35555b1902b8262aa37b85",
          "body": null,
          "is_bot": false,
          "headline": "3.11.1",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-12-02T04:45:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47a9a5c48f2dfe1437d1d5b02ce2299bb187ebce",
          "body": "* alias `edn` to clojure.edn\r\n\r\n* Add minimal documentation of `:only` keyword\r\n\r\n* limit `io` to `clj`\r\n\r\n* backport `:only` keyword support for `cljr-magic-require-namespaces`\r\n\r\nThis is handled by the suggest-libspec middleware automatically, so should not\r\nbe user visible on latest versions. How\n[…]\normat was broken with an :only keyword when parsed by\r\ncljr--magic-requires-lookup-alias. This fixes that lookup and extracts the\r\nlibspec from the first element of the list if it's not a dotted pair.",
          "is_bot": false,
          "headline": "Expand cljr magic require namespaces documentation (#555)",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-12-02T04:41:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a2a6cbc2e29177f4f55730637a357433a03fa38",
          "body": null,
          "is_bot": false,
          "headline": "3.11.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-11-24T07:24:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b390a17a2b0db2bb7d2b0d1cf014513cc1346e4c",
          "body": "…in test",
          "is_bot": false,
          "headline": "Fix missing lexical-binding issue during feature/feature compilation …",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-11-16T05:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a90ecec7ae324a7c42d815c47e82ab950460355c",
          "body": null,
          "is_bot": false,
          "headline": "Add ecukes steps to set the defcustom for each buffer",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-11-16T05:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05e90bd9a0f24027011aab1bf041c16a24797e0c",
          "body": "Also mark functions that will be deprecated once suggest-libspec is the only\npath.",
          "is_bot": false,
          "headline": "Enable `cljr-slash-uses-suggest-libspec` by default",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-11-16T05:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b476345c580ae7cbc6b356ba0157db782684c47f",
          "body": "Fixes https://github.com/clojure-emacs/clj-refactor.el/issues/552",
          "is_bot": false,
          "headline": "Support TRAMP connections",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-10-09T11:04:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d006e2e14a43705f520660de95975acc5e3fe1fa",
          "body": null,
          "is_bot": false,
          "headline": "3.9.4",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-18T10:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb8c75bb5d0c4bbffb7adab1ad3084da50b93ece",
          "body": null,
          "is_bot": false,
          "headline": "Remove Discord badge",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-16T05:55:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5555fab8e02f567d67a3c982ab178be5485310db",
          "body": null,
          "is_bot": false,
          "headline": "3.9.3",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-16T05:30:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed3a15a969eb17c6c7741a2728b45fc3d320aa66",
          "body": "Fixes #550",
          "is_bot": false,
          "headline": "Add and satisfy linting (#551)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-16T04:34:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "038ad6664482b3f9e253383efce25ab24ae876fe",
          "body": null,
          "is_bot": false,
          "headline": "3.9.2",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-15T18:51:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59d5b64e4053b58e0977bb76d262238b41b8dcc9",
          "body": null,
          "is_bot": false,
          "headline": "Modernize build (#549)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-15T18:48:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0f488206290acd83315f6d22171dcb9e671b7e7",
          "body": "Fixes #523",
          "is_bot": false,
          "headline": "Increase `js/` namespace detection accuracy for .cljc files (#546)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-08-01T10:30:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fdc95a479406a83865d06f43122354c0dd2b93f",
          "body": "…terned into the current namespace (#545)\n\ne.g. the class `Thread` or the var `+` are already interned by default in Clojure namespaces, so they are redundant to suggest or insert into the `ns` form.",
          "is_bot": false,
          "headline": "`cljr-add-missing-libspec`: don't suggest members that are already in…",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-26T13:57:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4336323e32b5522b02639ed2aa4dd65c3b3d29ef",
          "body": "Closes #430",
          "is_bot": false,
          "headline": "`cljr-add-missing-libspec`: produce more friendly prompts (#544)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-26T13:33:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a2719be5f0af0d478b37007f3a716bccd708450",
          "body": null,
          "is_bot": false,
          "headline": "Use refactor-nrepl 3.9.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-24T19:59:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "740747dc175f578b255dae6ed87bf8a438431096",
          "body": null,
          "is_bot": false,
          "headline": "Use refactor-nrepl 3.8.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-21T06:15:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af97aca1acc607dffcae9e932d926dc6482426bb",
          "body": null,
          "is_bot": false,
          "headline": "Avoid `seq-first`",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-15T11:14:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30c9ad11b53ddf1e4c88c9cf9b714f38ce604ad3",
          "body": null,
          "is_bot": false,
          "headline": "3.7.1",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-06T13:15:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c63dfa94f68f9a24bb3a1d989e1f439242de6818",
          "body": "Previously the function would report a successful renaming without\ractually having renamed anything.\n\nFixes #537\nCloses https://github.com/clojure-emacs/clj-refactor.el/pull/538",
          "is_bot": false,
          "headline": "Fail early in cljr-rename-symbol if narrowing is in effect",
          "author_name": "rechvs",
          "author_login": "rechvs",
          "committed_at": "2023-07-04T15:41:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cac47dc0217c96203457531949b4f0472e6bbaa3",
          "body": null,
          "is_bot": false,
          "headline": "Use refactor-nrepl 3.7.0 (#543)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-04T15:31:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd184e93b9ab63f003fb2cf54a396e7b932a049",
          "body": "…#542)",
          "is_bot": false,
          "headline": "Deprecate unused reader-conditional functions and transition to new (…",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-05-20T15:50:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffc6be1ef170402d25b068fb98a5a934cc5a5c36",
          "body": "Addresses problems identified in\r\nhttps://github.com/clojure-emacs/clj-refactor.el/issues/533.\r\n\r\nPreviously, `cljr--goto-reader-conditional` and\r\n`cljr--point-in-reader-conditional-branch-p` appeared to have problems with\r\ninfinite loops as they looked for specific language values in the reader\r\nco\n[…]\nbol it can identify.\r\n\r\n`cljr--language-context-at-point` has been amended to use the\r\n`cljr--reader-conditional-context` to return both the language of the file & the\r\ncurrent context to search from.",
          "is_bot": false,
          "headline": "Introduce `cljr--reader-conditional-context` (#541)",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-04-23T21:47:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5abe655e572a6ecfed02bb8164b64716ef76b8e",
          "body": "Clojure 1.11.0 provides the new clojure.math namespace.\nUsers will expect that it's magically required by \"math\", analog to\nthe other builtins.",
          "is_bot": false,
          "headline": "Add clojure.math to magic require namespaces",
          "author_name": "adrech",
          "author_login": "vroide",
          "committed_at": "2023-02-02T06:37:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8300d5cab861668f313fbbbb3e2926e3e5130e86",
          "body": null,
          "is_bot": false,
          "headline": "3.6.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2022-10-23T16:44:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db89b558710d31d4b9dfe7c4d2a07df9b498d4a6",
          "body": "`cljr-slash` using `suggest-libspecs` middleware op",
          "is_bot": false,
          "headline": "Merge pull request #532 from dgtized/cljr-slash-using-suggest-libspecs",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2022-10-11T19:08:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23c58cc98c2cd0384f0f24a5c372054c2158f5d1",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into cljr-slash-using-suggest-libspecs",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T20:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e53606b782550a41ad407992d978d38d300eda43",
          "body": null,
          "is_bot": false,
          "headline": "Add Changelog entry introducing #532",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T20:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c8d8182de7c08e4f846cca6976db5c3e1aae647",
          "body": "…nt`.\n\nSee https://github.com/clojure-emacs/clj-refactor.el/issues/533 for explanation\nof what needs to happen to re-enable.",
          "is_bot": false,
          "headline": "Disable the reader-conditional term of `cljr--language-context-at-poi…",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:55:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3c0cb4f1bcd232c4e14ed466876b47cfe8bcd18",
          "body": null,
          "is_bot": false,
          "headline": "Prefer explicit parsing instead of destructuring binding per reviewer",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c28773dfd380907375c5b39744b5f2099e7f9da5",
          "body": null,
          "is_bot": false,
          "headline": "Document feature paths inside `cljr-slash`",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:17:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16da22c355b9de0d7777155ca2f973b6505743bd",
          "body": "… `cljr--language-context-at-point`",
          "is_bot": false,
          "headline": "Improve documentation for `cljr--call-middleware-suggest-libspec` and…",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:08:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 4,
      "commits_last_year": 63,
      "latest_release_at": "2026-07-16T15:46:13Z",
      "latest_release_tag": "v4.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 9,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 776.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": true,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 111,
      "stars": 785,
      "watchers": 25,
      "fork_history": {
        "days": [
          {
            "date": "2013-01-31",
            "count": 1
          },
          {
            "date": "2013-02-01",
            "count": 1
          },
          {
            "date": "2013-10-30",
            "count": 1
          },
          {
            "date": "2013-12-15",
            "count": 1
          },
          {
            "date": "2013-12-31",
            "count": 1
          },
          {
            "date": "2014-01-23",
            "count": 1
          },
          {
            "date": "2014-02-01",
            "count": 1
          },
          {
            "date": "2014-02-07",
            "count": 1
          },
          {
            "date": "2014-03-25",
            "count": 1
          },
          {
            "date": "2014-06-09",
            "count": 1
          },
          {
            "date": "2014-08-23",
            "count": 1
          },
          {
            "date": "2014-08-25",
            "count": 1
          },
          {
            "date": "2014-09-02",
            "count": 1
          },
          {
            "date": "2014-12-13",
            "count": 1
          },
          {
            "date": "2014-12-16",
            "count": 1
          },
          {
            "date": "2015-01-31",
            "count": 1
          },
          {
            "date": "2015-02-20",
            "count": 1
          },
          {
            "date": "2015-03-31",
            "count": 1
          },
          {
            "date": "2015-04-09",
            "count": 1
          },
          {
            "date": "2015-04-24",
            "count": 1
          },
          {
            "date": "2015-05-29",
            "count": 1
          },
          {
            "date": "2015-05-30",
            "count": 1
          },
          {
            "date": "2015-06-29",
            "count": 1
          },
          {
            "date": "2015-07-08",
            "count": 1
          },
          {
            "date": "2015-07-16",
            "count": 1
          },
          {
            "date": "2015-08-10",
            "count": 1
          },
          {
            "date": "2015-08-18",
            "count": 1
          },
          {
            "date": "2015-08-24",
            "count": 1
          },
          {
            "date": "2015-09-10",
            "count": 1
          },
          {
            "date": "2015-09-24",
            "count": 1
          },
          {
            "date": "2015-09-28",
            "count": 1
          },
          {
            "date": "2015-10-26",
            "count": 1
          },
          {
            "date": "2015-12-11",
            "count": 1
          },
          {
            "date": "2015-12-27",
            "count": 1
          },
          {
            "date": "2016-01-26",
            "count": 1
          },
          {
            "date": "2016-02-03",
            "count": 1
          },
          {
            "date": "2016-03-14",
            "count": 1
          },
          {
            "date": "2016-03-20",
            "count": 1
          },
          {
            "date": "2016-03-23",
            "count": 1
          },
          {
            "date": "2016-05-21",
            "count": 1
          },
          {
            "date": "2016-06-21",
            "count": 1
          },
          {
            "date": "2016-07-11",
            "count": 1
          },
          {
            "date": "2016-10-16",
            "count": 1
          },
          {
            "date": "2016-10-18",
            "count": 1
          },
          {
            "date": "2016-10-19",
            "count": 1
          },
          {
            "date": "2016-11-25",
            "count": 1
          },
          {
            "date": "2017-01-10",
            "count": 1
          },
          {
            "date": "2017-01-13",
            "count": 1
          },
          {
            "date": "2017-01-20",
            "count": 1
          },
          {
            "date": "2017-01-21",
            "count": 1
          },
          {
            "date": "2017-03-24",
            "count": 1
          },
          {
            "date": "2017-04-01",
            "count": 1
          },
          {
            "date": "2017-04-22",
            "count": 1
          },
          {
            "date": "2017-04-25",
            "count": 1
          },
          {
            "date": "2017-11-07",
            "count": 1
          },
          {
            "date": "2017-12-20",
            "count": 1
          },
          {
            "date": "2018-01-20",
            "count": 1
          },
          {
            "date": "2018-03-05",
            "count": 1
          },
          {
            "date": "2018-03-26",
            "count": 1
          },
          {
            "date": "2018-03-30",
            "count": 1
          },
          {
            "date": "2018-05-12",
            "count": 1
          },
          {
            "date": "2018-05-26",
            "count": 1
          },
          {
            "date": "2018-06-28",
            "count": 1
          },
          {
            "date": "2018-07-08",
            "count": 1
          },
          {
            "date": "2018-11-14",
            "count": 1
          },
          {
            "date": "2018-11-23",
            "count": 1
          },
          {
            "date": "2019-03-18",
            "count": 1
          },
          {
            "date": "2019-04-18",
            "count": 1
          },
          {
            "date": "2019-04-22",
            "count": 1
          },
          {
            "date": "2019-05-16",
            "count": 1
          },
          {
            "date": "2019-07-14",
            "count": 1
          },
          {
            "date": "2019-07-16",
            "count": 1
          },
          {
            "date": "2019-07-19",
            "count": 1
          },
          {
            "date": "2019-07-31",
            "count": 1
          },
          {
            "date": "2019-08-03",
            "count": 1
          },
          {
            "date": "2019-10-17",
            "count": 1
          },
          {
            "date": "2019-10-31",
            "count": 1
          },
          {
            "date": "2019-12-08",
            "count": 1
          },
          {
            "date": "2020-02-17",
            "count": 1
          },
          {
            "date": "2020-02-20",
            "count": 1
          },
          {
            "date": "2020-04-04",
            "count": 1
          },
          {
            "date": "2020-04-15",
            "count": 1
          },
          {
            "date": "2020-05-24",
            "count": 1
          },
          {
            "date": "2020-06-18",
            "count": 1
          },
          {
            "date": "2020-07-18",
            "count": 1
          },
          {
            "date": "2020-07-28",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 1
          },
          {
            "date": "2021-01-12",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-10",
            "count": 1
          },
          {
            "date": "2021-03-18",
            "count": 1
          },
          {
            "date": "2021-03-19",
            "count": 1
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-05-09",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 1
          },
          {
            "date": "2021-07-24",
            "count": 1
          },
          {
            "date": "2021-10-25",
            "count": 1
          },
          {
            "date": "2022-06-12",
            "count": 1
          },
          {
            "date": "2022-07-05",
            "count": 1
          },
          {
            "date": "2022-09-12",
            "count": 1
          },
          {
            "date": "2023-01-17",
            "count": 1
          },
          {
            "date": "2023-02-01",
            "count": 1
          },
          {
            "date": "2023-07-10",
            "count": 1
          },
          {
            "date": "2024-01-28",
            "count": 1
          },
          {
            "date": "2024-02-29",
            "count": 1
          },
          {
            "date": "2024-07-24",
            "count": 1
          },
          {
            "date": "2024-07-26",
            "count": 1
          },
          {
            "date": "2025-01-18",
            "count": 1
          },
          {
            "date": "2025-11-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 111,
        "total_forks": 111
      },
      "star_history": null,
      "open_issues_and_prs": 29
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": null,
      "source_files_sampled": 0,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 193,
        "open_issues": 29,
        "closed_ratio": 0.923,
        "closed_issues": 347,
        "closed_unmerged_prs": 30
      },
      "bus_factor": 2,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "expez",
          "commits": 371,
          "avatar_url": "https://avatars.githubusercontent.com/u/1006557?v=4"
        },
        {
          "type": "User",
          "login": "magnars",
          "commits": 210,
          "avatar_url": "https://avatars.githubusercontent.com/u/265785?v=4"
        },
        {
          "type": "User",
          "login": "benedekfazekas",
          "commits": 140,
          "avatar_url": "https://avatars.githubusercontent.com/u/1003422?v=4"
        },
        {
          "type": "User",
          "login": "bbatsov",
          "commits": 120,
          "avatar_url": "https://avatars.githubusercontent.com/u/103882?v=4"
        },
        {
          "type": "User",
          "login": "vemv",
          "commits": 64,
          "avatar_url": "https://avatars.githubusercontent.com/u/1162994?v=4"
        },
        {
          "type": "User",
          "login": "dgtized",
          "commits": 30,
          "avatar_url": "https://avatars.githubusercontent.com/u/6784?v=4"
        },
        {
          "type": "User",
          "login": "Malabarba",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/453029?v=4"
        },
        {
          "type": "User",
          "login": "areina",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/10852?v=4"
        },
        {
          "type": "User",
          "login": "yuhan0",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/22216124?v=4"
        },
        {
          "type": "User",
          "login": "mbuczko",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/586537?v=4"
        }
      ],
      "contributors_sampled": 53,
      "top_contributor_share": 0.368
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 22 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/23 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 11 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "2805bd5f505fdb199a8c5a25fca398ec9c161e5b",
        "ran_at": "2026-07-25T20:49:39Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-16T15:47:33Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-16T15:28:38Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 182,
          "created_at": "2015-07-03T15:05:13Z",
          "last_comment_at": "2015-10-12T12:44:15Z",
          "last_comment_author": "expez"
        },
        {
          "number": 199,
          "created_at": "2015-07-24T14:37:41Z",
          "last_comment_at": "2015-07-24T16:07:00Z",
          "last_comment_author": "Malabarba"
        },
        {
          "number": 273,
          "created_at": "2015-12-16T08:21:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 296,
          "created_at": "2016-02-16T16:06:53Z",
          "last_comment_at": "2019-08-07T14:45:06Z",
          "last_comment_author": "expez"
        },
        {
          "number": 308,
          "created_at": "2016-03-15T14:17:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 383,
          "created_at": "2017-07-07T09:54:08Z",
          "last_comment_at": "2017-07-07T10:57:46Z",
          "last_comment_author": "sooheon"
        },
        {
          "number": 384,
          "created_at": "2017-07-18T04:43:45Z",
          "last_comment_at": "2017-07-18T19:33:42Z",
          "last_comment_author": "raxod502"
        },
        {
          "number": 401,
          "created_at": "2017-12-14T20:07:10Z",
          "last_comment_at": "2017-12-14T22:51:07Z",
          "last_comment_author": "developer2019"
        },
        {
          "number": 404,
          "created_at": "2018-01-18T02:19:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 407,
          "created_at": "2018-01-21T03:53:42Z",
          "last_comment_at": "2018-01-21T16:03:59Z",
          "last_comment_author": "orb"
        },
        {
          "number": 429,
          "created_at": "2018-08-18T09:54:37Z",
          "last_comment_at": "2019-04-01T01:33:53Z",
          "last_comment_author": "JAremko"
        },
        {
          "number": 433,
          "created_at": "2019-01-24T16:09:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 436,
          "created_at": "2019-04-08T08:18:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 437,
          "created_at": "2019-04-10T13:25:15Z",
          "last_comment_at": "2019-08-09T08:53:47Z",
          "last_comment_author": "vemv"
        },
        {
          "number": 451,
          "created_at": "2019-11-06T14:07:43Z",
          "last_comment_at": "2023-04-20T13:39:03Z",
          "last_comment_author": "vemv"
        },
        {
          "number": 461,
          "created_at": "2020-02-16T21:38:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 467,
          "created_at": "2020-04-04T10:48:22Z",
          "last_comment_at": "2020-04-30T11:56:00Z",
          "last_comment_author": "expez"
        },
        {
          "number": 479,
          "created_at": "2021-02-02T05:33:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 488,
          "created_at": "2021-04-30T19:46:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 492,
          "created_at": "2021-07-04T13:18:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/clojure-emacs/clj-refactor.el",
    "host": "github.com",
    "name": "clj-refactor.el",
    "owner": "clojure-emacs"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 44,
        "vitality": 65,
        "community": 78,
        "governance": 68,
        "engineering": 63
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 65,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 63,
              "human_commit_share": 1,
              "days_since_last_push": 9,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 9 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "63 commits in the last year",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 63
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 76,
            "inputs": {
              "releases_count": 4,
              "latest_release_tag": "v4.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 776.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "4 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~776.4 days",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 776.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 9,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 9 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 78,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "forks": 111,
              "stars": 785,
              "watchers": 25,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "785 stars",
                "points": 46.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 785
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "111 forks",
                "points": 17,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 111
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "25 watchers",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": true,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (GPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 7.2,
                "status": "met",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 68,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 53,
              "top_contributor_share": 0.368
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 37% of commits",
                "points": 14.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 37
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "53 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 11 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "merged_prs": 193,
              "open_issues": 29,
              "closed_issues": 347,
              "issue_closed_ratio": 0.923,
              "closed_unmerged_prs": 30
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "92% of issues closed",
                "points": 43.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "193/223 decided PRs merged",
                "points": 33.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 193,
                      "decided": 223
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "followers": 91,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "clojure-emacs",
              "public_repos": 31,
              "account_age_days": 4749
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "91 followers of clojure-emacs",
                "points": 14.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 91,
                      "login": "clojure-emacs"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "31 public repos, account ~13 yr old",
                "points": 23,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 31
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 63,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 22 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "refactorings",
                "refactoring-functions",
                "clojure",
                "emacs",
                "emacs-mode",
                "emacs-lisp",
                "cider",
                "nrepl"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 22 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 11 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 13
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 32,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.61,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "61 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 32.5,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 61,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "critical",
            "name": "Code legibility for models",
            "note": "Excluded from scoring (no data or not applicable): Manageable file sizes. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "manageable_file_sizes"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "primary_language": "Emacs Lisp",
              "largest_source_bytes": null,
              "source_files_sampled": 0,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Emacs Lisp without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Emacs Lisp"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "no source files detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_source_files",
                    "params": {}
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T20:50:04.920019Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/clojure-emacs/clj-refactor.el.svg",
  "full_name": "clojure-emacs/clj-refactor.el",
  "license_state": "standard",
  "license_spdx": "GPL-3.0"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.