Informe JSON sin procesar legible por máquina
{
"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"
}