Public record
Software health reportschema 0.27.0 · metrics 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 stars⑂ 111 forkssince Jan 2013View on GitHub ↗

clojure-emacs/clj-refactor.el holds a health index of 64 out of 100, placing it in the Moderate band. It scores highest on Community & Adoption (78/100) and lowest on AI Readiness (32/100). It was last updated 9 days ago. 2 contributors account for most of its recent work.

64
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

64
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

clojure-emacsOrganization
91 followers31 public repossince Jul 2013

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

65Moderate · 22% of overall
How it's scored
28.8/36Push recency — last push 9 days ago
2.8/36Commit cadence — 4/52 weeks with commits
16.2/18Commit volume — 63 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year63
human_commit_share1
days_since_last_push9
active_weeks_last_year4
How it's scored
27/27Ships releases — 4 releases published
36/36Release recency — latest release 9 days ago
5.4/27Release cadence — a release every ~776.4 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count4
latest_release_tagv4.0.0
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases776.4
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

78Good · 18% of overall
How it's scored
46.9/60Stars — 785 stars
17/25Forks — 111 forks
7.7/15Watchers — 25 watchers
Inputs used
forks111
stars785
watchers25
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

85Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (GPL-3.0)
18/18CONTRIBUTING guide
0/13.5Code of conduct
7.2/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateyes
has_code_of_conductno
has_pull_request_templateyes

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

68Moderate · 24% of overall
How it's scored
25.2/54Bus factor — 2 contributor(s) cover half of all commits
14.2/22.5Commit distribution — top contributor authored 37% of commits
13.5/13.5Contributor breadth — 53 contributors
10/10OpenSSF Scorecard: Contributors — project has 11 contributing companies or organizations
Inputs used
bus_factor2
contributors_sampled53
top_contributor_share0.368
How it's scored
43.2/46.8Issue resolution — 92% of issues closed
33.1/38.3PR acceptance — 193/223 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/23 approved changesets -- score normalized to 0
Inputs used
merged_prs193
open_issues29
closed_issues347
issue_closed_ratio0.923
closed_unmerged_prs30
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
14.1/25Owner reach — 91 followers of clojure-emacs
23/25Track record — 31 public repos, account ~13 yr old
Inputs used
followers91
owner_typeOrganization
is_verified
owner_loginclojure-emacs
public_repos31
account_age_days4,749

Engineering Quality

Are baseline engineering and documentation practices in place?

63Moderate · 20% of overall
How it's scored
24/24CI workflows — 1 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 22 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

85Excellent
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 8 topics
10/10Wiki
Inputs used
topicsrefactorings, refactoring-functions, clojure, emacs, emacs-mode, emacs-lisp, cider, nrepl
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

44At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
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.5License — 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 — no data
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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4.4
Excluded from scoring (no data or not applicable): branch_protection, packaging, signed_releases. Remaining weights renormalized.

AI Readiness

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.

32At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
32.5/40Legible commit history — 61 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.61
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
0/11Lint / format config
0/11Static type checking
0/10Reproducible environment
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
0/45Type-checkable code — Emacs Lisp without a type-check config
0/55Manageable file sizes — no source files detected
Inputs used
primary_languageEmacs Lisp
largest_source_bytes
source_files_sampled0
oversized_source_files0
Excluded from scoring (no data or not applicable): Manageable file sizes. Remaining weights renormalized.
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

785GitHub stars
53contributors
63commits, last 12 months
9days since last push
4releases
2bus factor
29open issues
package ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 111 ⇿
0Stars
111Forks
3Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

02040608010012011142013-012019-062025-10
Major 1Minor 1Patch 1

Each point covers 12 days.

OpenSSF Scorecard 4.4 / 10
4.4aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-25 20:49 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-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
n/aPackagingpackaging 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
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
All dependencies 0

Full resolved dependency set from the GitHub dependency graph: 0 direct and 0 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies to assess

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statistics.