Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"agentic-ai",
"claude",
"codex",
"gemini",
"agnostic-ai"
],
"is_fork": false,
"size_kb": 2791,
"has_wiki": false,
"homepage": "https://chemaclass.github.io/agnostic-ai/",
"languages": {
"Go": 2062014,
"Shell": 25802,
"Kotlin": 23685,
"Makefile": 3484,
"Dockerfile": 558,
"TypeScript": 10255
},
"pushed_at": "2026-07-23T10:28:06Z",
"created_at": "2026-05-03T18:47:55Z",
"owner_type": "User",
"updated_at": "2026-07-23T10:36:33Z",
"description": "One source of truth for AI agents, skills, rules, and hooks. Transpile to every AI CLI you use.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://chemaclass.com",
"name": "Jose M. Valera Reales",
"type": "User",
"login": "Chemaclass",
"company": "@kombohq",
"location": "E51B 5BF4 5F85 D160",
"followers": 227,
"avatar_url": "https://avatars.githubusercontent.com/u/5256287?v=4",
"created_at": "2013-08-18T17:44:23Z",
"is_verified": null,
"public_repos": 147,
"account_age_days": 4722
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.43.0",
"kind": "minor",
"published_at": "2026-07-20T05:25:52Z"
},
{
"tag": "v0.42.0",
"kind": "minor",
"published_at": "2026-07-03T07:11:38Z"
},
{
"tag": "v0.41.0",
"kind": "minor",
"published_at": "2026-06-19T06:33:21Z"
},
{
"tag": "v0.40.0",
"kind": "minor",
"published_at": "2026-06-17T09:48:39Z"
},
{
"tag": "v0.39.0",
"kind": "minor",
"published_at": "2026-06-16T19:51:47Z"
},
{
"tag": "v0.38.0",
"kind": "minor",
"published_at": "2026-06-16T18:34:40Z"
},
{
"tag": "v0.37.0",
"kind": "minor",
"published_at": "2026-06-14T18:01:07Z"
},
{
"tag": "v0.36.0",
"kind": "minor",
"published_at": "2026-06-12T07:36:03Z"
},
{
"tag": "v0.35.0",
"kind": "minor",
"published_at": "2026-06-09T19:19:45Z"
},
{
"tag": "v0.34.0",
"kind": "minor",
"published_at": "2026-06-05T23:32:09Z"
},
{
"tag": "v0.33.0",
"kind": "minor",
"published_at": "2026-06-05T08:57:39Z"
},
{
"tag": "v0.32.1",
"kind": "patch",
"published_at": "2026-06-04T05:27:52Z"
},
{
"tag": "v0.32.0",
"kind": "minor",
"published_at": "2026-06-03T11:46:17Z"
},
{
"tag": "v0.31.0",
"kind": "minor",
"published_at": "2026-06-03T06:23:59Z"
},
{
"tag": "v0.30.0",
"kind": "minor",
"published_at": "2026-06-02T13:17:29Z"
},
{
"tag": "v0.29.0",
"kind": "minor",
"published_at": "2026-06-02T13:00:54Z"
},
{
"tag": "v0.28.0",
"kind": "minor",
"published_at": "2026-06-01T09:22:16Z"
},
{
"tag": "v0.27.0",
"kind": "minor",
"published_at": "2026-05-29T19:34:26Z"
},
{
"tag": "v0.26.1",
"kind": "patch",
"published_at": "2026-05-27T19:24:55Z"
},
{
"tag": "v0.26.0",
"kind": "minor",
"published_at": "2026-05-25T06:12:38Z"
},
{
"tag": "v0.25.0",
"kind": "minor",
"published_at": "2026-05-23T19:33:27Z"
},
{
"tag": "v0.24.0",
"kind": "minor",
"published_at": "2026-05-19T09:22:17Z"
},
{
"tag": "v0.23.0",
"kind": "minor",
"published_at": "2026-05-17T00:49:31Z"
},
{
"tag": "v0.22.0",
"kind": "minor",
"published_at": "2026-05-16T22:25:21Z"
},
{
"tag": "v0.21.0",
"kind": "minor",
"published_at": "2026-05-16T20:57:04Z"
},
{
"tag": "v0.20.0",
"kind": "minor",
"published_at": "2026-05-15T23:11:36Z"
},
{
"tag": "v0.19.0",
"kind": "minor",
"published_at": "2026-05-15T22:48:02Z"
},
{
"tag": "v0.18.0",
"kind": "minor",
"published_at": "2026-05-15T22:02:54Z"
},
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2026-05-15T19:44:48Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-05-15T16:46:45Z"
},
{
"tag": "v0.15.1",
"kind": "patch",
"published_at": "2026-05-15T14:18:15Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-05-15T14:09:46Z"
},
{
"tag": "v0.14.2",
"kind": "patch",
"published_at": "2026-05-15T12:37:40Z"
},
{
"tag": "v0.14.1",
"kind": "patch",
"published_at": "2026-05-15T11:35:45Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-05-15T10:52:37Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-05-14T23:52:24Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-05-14T21:43:56Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-05-14T20:59:10Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-05-14T20:15:22Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-05-14T18:53:18Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-05-13T15:37:56Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-05-13T12:45:42Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-05-11T22:55:44Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-05-07T17:12:54Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-05-05T15:55:48Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-05-04T14:40:52Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-05-04T08:11:10Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-05-04T06:07:11Z"
}
],
"recent_commits": [
{
"oid": "3409f8b0b6acbc76c9ade8c075078aa9b26fbe8a",
"body": "* feat(cli): preview new scaffolds and surface completion in init\n\nnew --dry-run prints the destination path and rendered spec body without\nwriting, so users can check the shape before it lands on disk. init's\npost-scaffold next steps now point at `agnostic-ai completion <shell>`,\nmaking the existin\n[…]\n completion <shell>`, getting-started\ndocuments `new --dry-run`, and CHANGELOG records the new flag. Smooths the\nfirst five minutes: install, scaffold, preview, and enable completion.\n\nRelated to #495",
"is_bot": false,
"headline": "docs: onboarding polish (install, completion, new --dry-run) (#510)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T10:28:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "511f3dd82ca6a40b1fbb8d5e0952160ebbb9351f",
"body": "sync emits 18 targets but import accepted only 16: kiro and crush were\ndeferred when #474 added them, so a project configured for either could\nnot migrate its existing config into agnostic specs. Close the gap so\nevery emitted target can also be imported.\n\nkiro reverses the steering layout: `.kiro/s\n[…]\nme>/SKILL.md`, and the crush.json `mcp` map.\nBoth reuse the shared MCP, skill-folder, and entry-point helpers so the\nimporters live in internal/cli and honor no-cross-adapter-imports.\n\nRelated to #494",
"is_bot": false,
"headline": "feat(import): kiro and crush importers for round-trip parity (#509)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T10:15:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3d2d8c6a3fe9f4dd2957782bb391401c861e59a6",
"body": "Only one test file called t.Parallel(); every other test was serialized\nby shared process state. Add t.Parallel() to tests that touch neither the\nworking directory nor a package global, so -race runs them concurrently.\n\nDrop testutil.Chdir from the aider adapter tests by rooting their\nconfigured out\n[…]\nobal (logOut/verbosity, emit provenance and\ncoverage-note state, config legacy-warn cache) stay serial. Parallelizing\nthose needs a production signature change, which is out of scope.\n\nRelated to #493",
"is_bot": false,
"headline": "test: parallelize cwd-independent tests to cut race-suite time (#508)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T09:51:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9f8ff19cd65709309b71d216ec8ec7de04cfd707",
"body": "TestWatchSync_IncrementalReSyncsOnlyAffectedTarget failed on\nmacos-latest under -race: the poll/debounce/re-sync chain can take\nseconds on a loaded runner, exceeding the 4s context and 2s poll\ndeadline. Widen the ceilings; the waits break early on success, so the\ncommon path still finishes in under a second.",
"is_bot": false,
"headline": "test(cli): deflake incremental watch test on loaded CI (#507)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T09:11:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47068979f2928a6f90c6ec07301eca797b024834",
"body": "Drift detection reads every candidate's full body off disk to byte-compare\nit, even when a cheaper signal already settles the verdict. When the on-disk\nsize differs from the candidate length the file is provably stale, so that\nread is wasted I/O, and it grows with the tree.\n\nAdd CompareToDisk to the\n[…]\ns\nthe permanent decision artifact: the fast path saves 8 to 13 μs per\nsize-differing drift file and costs about 1.2 μs extra per read-anyway file,\ncrossing over near 10 percent drift.\n\nRelated to #492",
"is_bot": false,
"headline": "perf(emit): capture-compare fast-path via size pre-check (#506)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T09:07:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d02f99ebe9052ce0ce9474cfafef34f391c7b3d5",
"body": "A cold sync can run far slower than a warm one with no way to see where\nthe time goes. Add two opt-in, stdlib-only hooks so users and maintainers\ncan diagnose a slow sync in the field.\n\n- --profile <file> (or AGNOSTIC_AI_PROFILE) writes a runtime/pprof CPU\n profile of the run. Profiling starts in t\n[…]\ntarget wall time to each target line, so cost\n attributes to a specific adapter. The stopwatch wraps the existing emit\n call; the emission loop and the top-line total are unchanged.\n\nRelated to #491",
"is_bot": false,
"headline": "feat(cli): sync perf observability (--profile, per-target timing) (#505)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T08:50:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e4a746f0431b3ef1bd1c88424a447bfbf6ee3a2f",
"body": "* feat(sync): incremental --watch re-emits only affected targets\n\nsync --watch re-ran a full sync of every target on every change, so\nediting one rule re-emitted all targets and buried the real change in\nnoise. Attribute each debounced change to a spec kind and re-sync only\nthe targets that emit it,\n[…]\nat\nglobal at levelQuiet, so without pinning it the assertion could see an\nempty buffer under some test orderings. Save and restore verbosity like\nlogOut so the test is self-contained.\n\nRelated to #490",
"is_bot": false,
"headline": "feat(sync): incremental --watch (re-emit only affected targets) (#504)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T08:32:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5606f7c766cc78cd1f68e9c5f44eb0bb289e8ba1",
"body": "The #488 drift-output helpers left five fmt.Fprint calls unchecked;\ngolangci-lint errcheck failed on main. Discard the writer errors with\nthe same _, _ = idiom used elsewhere for stderr/stdout writes.\n\nRelated to #488",
"is_bot": false,
"headline": "fix(cli): guard writer errors in --check drift output (#503)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T07:36:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c1033169d787769d674584c74f8c74e58bab1a93",
"body": "…int) (#502)\n\nA red `sync --check` reported only per-target drift counts, so the user\nhad to re-run sync locally and diff by hand to see what changed, and the\nfailure never named the command that fixes it.\n\nMake a failing check self-explanatory:\n- --diff prints a unified diff per drifted file (on-di\n[…]\nlus the config-error hints point at\n `agnostic-ai doctor` for a full diagnosis.\n\nPresentation only: no change to what counts as drift, the emission, exit\ncodes, or the --json schema.\n\nRelated to #488",
"is_bot": false,
"headline": "feat(sync): actionable --check output (--diff, --format=github, fix h…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T07:30:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a1201192d379597e81c44073a91d7ff43cb10c3d",
"body": "A self-contained why/what/how landing page for the project site. The\nPages workflow now assembles the landing at the root and moves the WASM\nplayground under /playground/. Monospace-forward identity, theme-aware,\nno external assets. README points at both the landing page and the\nrelocated playground.",
"is_bot": false,
"headline": "docs: add visual landing page, deploy via Pages (#501)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T06:33:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c82dc005b19280527e902f2ba76e69d237d43f2a",
"body": "The tagline read \"and 9 more\" (14 targets) but there are 18; correct\nto \"13 more\". Note on the stateless-adapters bullet that emission is\nsafe to run in parallel via sync --jobs (#487), the one user-facing\ncapability added since the last README pass that was not surfaced here.",
"is_bot": false,
"headline": "docs: correct README target count and surface parallel emission (#500)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T06:19:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04c1ad5810d89a74240bd4ae89a3af20f4f06e3e",
"body": "Emit each target on its own emit.Session with bounded parallelism, behind\na --jobs flag (0 = one worker per CPU, 1 = serial). Adapters are\nindependent, so per-target emission fans out; the post-emission phase\n(entry points, shared-skill links, ledger, orphan sweep) stays serial and\nordered.\n\nOutput \n[…]\n00 specs, with no crossover where serial wins. The win is modest because\nthe path is I/O- and GC-bound with a serial tail, so the flag's first value\nis correctness and opt-in control.\n\nRelated to #487",
"is_bot": false,
"headline": "feat(sync): parallel target emission with --jobs (#499)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-23T05:43:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d57dd8392163e38b051aff538af5412269f60724",
"body": "…(#498)\n\n* ref(emit): thread emit session state instead of package globals\n\nThe emit layer kept capture, recording, counting, detailed-recording,\nbackup, and transaction buffers in one package-global `state` struct, so\nevery emission pass in a process shared them. That blocked running two\nsyncs conc\n[…]\ner #486\n\nThe two ledger-sweep comments still named the old package-level\n`emit.RemoveGenerated`; the sweep now runs through the per-run emit\nsession. Comment-only; no behavior change.\n\nRelated to #486",
"is_bot": false,
"headline": "refactor(emit): thread emit session state instead of package globals …",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-22T22:15:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5842b23a6ac23ecec6e95631306b7c7759e1eba5",
"body": "The bench-before-perf-refactor rule blocks refactoring any hot path\nwithout a permanent benchmark to measure against, and the repo had no\nBenchmark* functions. That self-blocked the queued perf work (capture\nfast-path, parallel emission, render memoization): the rule forbids the\nchange and there was\n[…]\naive baseline) so a future proposal slots in a\nthird subject. Wire a make bench target and document the suite under\ndocs/internal/. Test and infra only, no production behavior change.\n\nRelated to #485",
"is_bot": false,
"headline": "perf: add benchmark suite for sync hot paths (#497)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-22T21:25:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aa6f99600b6e01e7a8daa14f1adef07ce376e331",
"body": "Dedup the three per-target sync emission loops (non-dry, dry-run, JSON)\ninto one emitTarget helper, fold the near-identical non-dry and dry-run\nloops into one, and replace the hand-repeated StopRecording cleanup with\na defer per path. Behavior-neutral; internal to internal/cli/sync_run.go.\n\nCloses #489",
"is_bot": false,
"headline": "ref(cli): dedup sync emission loops and defer recording cleanup",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-22T21:01:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f8f2f6a2dfc4aa4544ef63b3b977dc0e2249635f",
"body": "The junie/kiro/crush/trae batch (#474) landed in the prose counts but\nleft several inline examples and per-target claims stale: the default\nlist showed 12, the built-in and collision lists omitted the four new\ntargets, and the amp/zed/warp rules-parity notes still said three tools\ncoexist at the roo\n[…]\nt (opencode writes its own\n.opencode/AGENTS.md, not the root), generalize the pointer-body tree\ncomments so they stop rotting, and add the claudehooks helper package\nto the internal architecture tree.",
"is_bot": false,
"headline": "docs: sync target lists and counts with the 18-adapter registry (#484)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-22T19:24:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "70fc9f3b38c3952412296630efceea0382a46e8f",
"body": "* ref(cli): document intentional swallow in readStateFile\n\nreadStateFile drops a corrupt-cache parse on purpose, but unlike its\nsibling lastSyncTimestamp the intent was undocumented. Add a comment so\nthe swallow reads as deliberate self-healing, not an oversight.\n\n* ref(adapters): remove unused faca\n[…]\nA variadic\nskip argument on CopyEmittedTree folds the claude/codex divergence into the\ncall site, preserving each adapter's exact behavior. Test bodies stay put,\nso comparison semantics are unchanged.",
"is_bot": false,
"headline": "ref: code-quality cleanup pass (dedup, dead code, shared schema) (#483)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-20T21:23:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fa06aeddc763931c2200844705be4be719abbf3d",
"body": "Several pages still described pre-v0.43.0 output: windsurf paths before\nthe Devin Desktop rename, Zed's retired .rules document, Copilot and\nOpenCode flattened agents/skills, the 12-target default set, and MCP\ncoverage counts. The scoped-rules table also showed the layout inverted\n(scope outside the\n[…]\n) and the\nx-<target> passthrough table predated the shared SKILL.md renderer.\nThe why-not-symlinks page now explains how sync.shared-skills relates\nto its own argument.\n\nRelated to #437 #439 #473 #474",
"is_bot": false,
"headline": "docs: sync README and guides with v0.43.0 behavior (#480)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-20T05:38:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b68f8dea81bd9652a83e23054c3bc39807f96ca",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.43.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-07-20T05:17:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4d5c207302f719bb90754a083a8ea15da3ef8fb",
"body": "* feat(adapters): add junie, kiro, crush, and trae targets\n\nFour widely used tools had no adapter: JetBrains Junie (.junie/rules\nconcatenated + .junie/mcp/mcp.json), AWS Kiro (.kiro/steering with\ninclusion-mode frontmatter: rules always/fileMatch, agents manual,\nskills auto + .kiro/settings/mcp.json\n[…]\no them; the\ndefault target set grows to 16 and import junie/trae capture their\nrules dirs.\n\nRelated to #474\n\n* ref(kiro): align filename-prefix consts with sibling adapters after #474\n\nRelated to #474",
"is_bot": false,
"headline": "feat(adapters): add junie, kiro, crush, and trae targets (#478)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-19T23:27:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bb94f04d0eca774dcc42d4ccde97b3d0ad3907f7",
"body": "Windsurf became Devin Desktop; its docs now prefer .devin/rules with\n.windsurf/rules kept only as a backward-compat fallback. Emitting to\nthe fallback left new projects on the deprecated tree. The target keeps\nits windsurf name so existing configs and x-windsurf meta still work,\nmanaged leftovers at the pre-rename path are swept (hand-authored files\nsurvive), and import windsurf reads whichever tree exists.\n\nRelated to #473",
"is_bot": false,
"headline": "feat(windsurf): emit rules to .devin/rules for Devin Desktop (#477)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-19T23:01:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4cfa11b7cee32abd9348c8392050a0fe316da315",
"body": "…opilot (#476)\n\n* feat(adapters): native skills and agents for gemini, zed, opencode, copilot\n\nEach tool gained a native surface the adapters still bypassed: Gemini\nscans .gemini/skills/, Zed 1.4.2 replaced its rules library with\n.agents/skills plus AGENTS.md, OpenCode reads .opencode/agents/ and\n.o\n[…]\nparity invariant now lives in one function\n(emit.SkillMarkdown / emit.WriteSkillFolder) instead of being re-proven\nper adapter. Cursor and Claude keep their wider-allowlist renderers.\n\nRelated to #439",
"is_bot": false,
"headline": "feat(adapters): native skills and agents for gemini, zed, opencode, c…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-19T17:21:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0daf259dc359a01bcbc5272c0c25498e3c1cda15",
"body": "* feat(sync): shared-skills opt-in links identical skill trees\n\nTargets sharing the Agent Skills layout each materialized a full real\ncopy of every skill folder. With sync.shared-skills enabled, sync keeps\none canonical tree (.agents/skills preferred) and swaps byte-identical\nfolders on other target\n[…]\n there is never\ndeleted, extract the repeated strictly-inside-dir prefix check into\nunderDir, and stop scanning further roots once a captured file matched\nits non-nested skill folder.\n\nRelated to #437",
"is_bot": false,
"headline": "feat(sync): shared-skills opt-in links identical skill trees (#475)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-19T15:52:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "37ea0048f2ef018c008db2c76a5ccee8d797bca1",
"body": "* feat(codex): emit skills to .agents/skills and gate deprecated prompts\n\nCodex CLI scans .agents/skills (cwd up to repo root); the .codex/skills\ndefault was a dead path the CLI never read. Sync now sweeps the stale\nmanaged tree. Project prompts move behind outputs.codex.commands-dir:\nCodex loads cu\n[…]\nhers\n(PermissionRequest, Subagent*, PreCompact, SessionStart). Dead mdc\nparameter removed. Tests cover commandWindows, asyncRewake and once;\nstale skill-flattening prose in the symlinks doc corrected.",
"is_bot": false,
"headline": "feat: sync adapters with current Claude, Codex and Cursor formats (#472)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-19T14:49:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "41ea814473991ab82661c9c36582b0dbe1708500",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.42.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-07-03T07:09:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea172f940a403eea2a5d5c881c915e97b29b1d29",
"body": null,
"is_bot": true,
"headline": "chore(deps): bump actions/checkout from 6 to 7 (#467)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-03T06:29:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe31906e29099750642a4f43266135013e863a43",
"body": "The managed .gitignore block listed generated paths but never said they\nare absent from a fresh clone or new git worktree until sync runs. Add a\nsecond header comment line pointing at a post-checkout hook, so a reader\nstaring at .gitignore learns how the outputs reappear.",
"is_bot": false,
"headline": "feat(gitignore): warn managed block outputs are not committed (#459)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-03T06:29:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e630cc0edad0a797178bfbf6eb50133c7ea449bd",
"body": "Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependenc\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump actions/cache from 5 to 6 (#468)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-03T06:28:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5278be1109faa776f84c8f813d744370d9946c5b",
"body": "* feat(gitignore): ignore Claude local artifacts in managed block\n\nClaude Code writes .claude/agent-memory/ and .claude/settings.local.json\nlocally; agnostic-ai never emits them, so they had to be added by hand\noutside the managed block and a sync could drop the hand-added lines.\n\nAdd an optional gi\n[…]\n sync folds them into the managed\nblock for every enabled claude target. Target-scoped: a codex-only\nproject never sees them.\n\nCloses #469\n\n* fix(gitignore): forward-slash Claude hint paths on Windows",
"is_bot": false,
"headline": "feat(gitignore): ignore Claude local artifacts in managed block (#471)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-03T04:38:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "361cf5731ee31a70b4c209783e1527bf6fd2ae3f",
"body": null,
"is_bot": false,
"headline": "docs: add why-not-symlinks comparison guide (#470)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-07-03T04:26:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3642494090eada502e7c4672dda4bf89236e9c80",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.41.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-19T06:31:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "870ef64cffc8e8d2c0af413d798cd1d49aa00d8a",
"body": "…#466)\n\n* fix(sync): read merge-target files in capture mode to stop key loss\n\ndoctor, sync --check, and status run adapters in capture mode to compute\nthe would-be output. The JSON, YAML, and claude-settings readers skipped\nthe existing file while capturing, so the captured content held the\nmanaged\n[…]\nml, and .claude/settings.json.\n\nRelated to #465\n\n* ref(emit): tighten capture-read comment after #465\n\nDrop a filler word and reflow the MergeJSONFile doc comment. No behavior\nchange.\n\nRelated to #465",
"is_bot": false,
"headline": "fix(sync): read merge-target files in capture mode to stop key loss (…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-19T04:08:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a5646c1bf69298516725dcb2602c1a7400b6ae75",
"body": "commandTOML read only the top-level description and excluded it from the\nx-gemini pass-through keys, so an x-gemini.description override was\nsilently dropped and the Claude-side description emitted instead.\nResolve through emit.ResolveMeta first, matching codex skillMarkdown.",
"is_bot": false,
"headline": "fix(gemini): honor x-gemini.description override in command TOML (#464)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-18T17:46:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58787c0577627b68a763d8271aed52a6ff4358f6",
"body": "…#463)\n\nA spec `name:` is used verbatim as a filename or directory segment by\nevery adapter, so a value like `../../../tmp/pwned` made sync write a\nfile outside the project tree (path traversal). Reject names that are\nnot a single safe path segment at load, with a clear error. As\ndefense-in-depth, emit.WriteFile now refuses any project-relative path\nthat climbs above the project root.\n\nAdds loader and emit-level regression tests.",
"is_bot": false,
"headline": "fix(spec): reject path-traversal spec names (write outside project) (…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-18T17:40:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b0c0fae416d8efeca12d36e667a2599ed344fc8a",
"body": "ResolveMetaOrdered appended unhinted top-level keys and keys introduced\nby an x-<target> block in Go map-iteration order, despite documenting\nalphabetical order. The randomized order reached the emitted frontmatter\nbytes, so a spec with a multi-key x-<target> block could produce a\ndifferent byte order each run and make sync --check report false drift.\n\nSort both key sets before appending. Adds a determinism regression test.",
"is_bot": false,
"headline": "fix(emit): emit x-<target> and unhinted meta keys in stable order (#462)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-18T17:33:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aef4cb1165f6de5bb98de2c77059489689e57b77",
"body": "* feat(sync): add opt-in per-target dropped summary\n\nsync.dropped-summary prints, per target, what the run could not fully\nemit: kinds with no native surface (dropped) and kinds reachable only\nbehind an opt-in key or source-dir only (downgraded). It regroups the\nexisting kind-grouped capability warn\n[…]\n441\n\n* fix(sync): satisfy staticcheck QF1001 in dropped-summary guard\n\nHoist the negated condition into a dropsChanged bool instead of\n!(a && b), per staticcheck De Morgan suggestion.\n\nRelated to #441",
"is_bot": false,
"headline": "feat(sync): add opt-in per-target dropped summary (#461)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-18T17:16:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "be5262b6255cc55093acb091d221a742b978526b",
"body": "A new git worktree or fresh clone has no generated config until sync\nruns. Point adopters who gitignore outputs at worktree bootstrap or a\npost-checkout hook so AI sessions never start without their config.",
"is_bot": false,
"headline": "docs: warn gitignored outputs miss fresh worktrees (#457)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T11:30:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9bd5c035997d2f2eadaf0c1836a9ca87fb6b34dd",
"body": "git-hooks.md only covered pre-commit drift. Add a post-checkout recipe\n(lefthook + plain git) so adopters who gitignore outputs auto-regenerate\nthem on clone, branch switch, and worktree add.",
"is_bot": false,
"headline": "docs: add post-checkout recipe to regenerate gitignored outputs (#458)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T11:30:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "99823f5795584dad1b8b2e9a80e184efb6814c6b",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.40.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:46:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c738813bf546c8fe42f162fcfe4eda085e5ef5a",
"body": "Cursor hooks are now native (#438), so flip its matrix cell and the\nhooks summary. Note the command kind's native targets and the five\nnewer kinds. Correct the docs index: ten kinds, fourteen tools.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: refresh target/kind coverage for onboarding accuracy",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:45:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2eefee681a0cf643719a9d12dd4203c619b06519",
"body": "Rewrite the [Unreleased] entries in the terse one-line style the older\nreleases use, and trim the wordier doc passages added this cycle to the\nessential facts.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: tighten unreleased changelog and cursor/doctor/validate notes",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:35:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "544602ce1cafa7a3f7f6edddcd4a9c31a9dc8d6a",
"body": "agnostic-ai.yaml can declare sources.<kind> paths whose directories\nnever get created. sync silently skipped them and validate/doctor\nreported success, so a config could advertise coverage (skills, hooks,\nmcps) it never emitted with no signal to the user.\n\nvalidate now warns per declared-but-missing\n[…]\nlooking scaffolds still validate. The check also\nruns when no specs load, the case where every source is missing.\n\nRelated to #444\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(validate): warn on declared source dirs that don't exist (#456)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:31:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1a076b01900bc21987ce8df69125d7528bf8a656",
"body": "Emitting a rule to .cursor/rules/*.mdc rewrote frontmatter cosmetically:\nempty globs on an alwaysApply:true rule became globs: \"**/*\", scalar\nglobs were double-quoted, and an empty description carried a trailing\nspace. Adopting agnostic-ai on a repo with existing Cursor rules thus\ntouched every rule\n[…]\niption: key. The alwaysApply:false broad\nauto-attach default (**/*) is kept since it is behavioral, not cosmetic.\n\nRelated to #443\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(cursor): preserve .mdc frontmatter on round-trip (#455)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:26:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "49d5d037c2502af19be468977ec9f281f7be82eb",
"body": "To reach full single-sourcing users need to see what is still\nhand-managed. doctor now scans known agentic config files (entry-points,\n.cursor/rules, per-tool agent/command/skill files) and lists any that\nexist without the agnostic-ai provenance marker, grouped with the import\ncommand that would adopt each. Advisory: does not affect exit code.\nJSON config is merge-managed and left to the drift block.\n\nRelated to #440\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(doctor): report agentic config on disk not single-sourced (#454)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:17:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "df261302ee9f7fca1ce958441f5dfbb2e27a9306",
"body": "Cursor shipped lifecycle hooks (Cursor 1.7), but the matrix marked the\nkind unsupported, so hook specs skipped cursor with a warning. Emit the\nnative config (version + per-event {command, matcher?} arrays) from the\nexisting hook specs, closing the parity gap with Claude/Codex/Gemini.\nEvent names pas\n[…]\nrough verbatim per the project convention; cursor's\ncamelCase vocabulary is registered so validate recognizes it.\n\nRelated to #438\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cursor): emit hook specs as native .cursor/hooks.json (#453)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T09:09:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "da1bf7e3d64a00ea4629b9374c06eac7390475b3",
"body": "…#452)\n\n#436 added command emission to gemini, opencode, amp, and cursor but\nleft the orphan-kind validator map listing only claude and codex, so a\nproject enabling just one of the new targets was wrongly told its\ncommand specs were dead weight.\n\nRelated to #436\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(validate): list all command-emitting targets in orphan-kind map (…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T08:59:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "951d8ac187dac447e7ed1b0e8849d0b2cea7c860",
"body": "Slash commands and saved prompts were only reachable on Claude and\nCodex; other targets required opt-in flags or had no command surface at\nall. Wire the existing command kind into every target with a native\ncommand/prompt format so one source drives them: Gemini TOML, OpenCode\nand Amp markdown, and Cursor Custom Commands (opt-in commands-dir).\n\nRelated to #436\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(command): emit command kind to gemini, opencode, amp, cursor (#451)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T08:39:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "624ff7b2849e0e3ca764a91c0f505e662520ba5b",
"body": "Single-source agent ignore patterns via a new ignore spec kind\n(.agnostic-ai/ignore/*.md, body is gitignore syntax). One list fans out\nto each tool's native ignore file: Cursor .cursorignore, Gemini\n.aiexclude, Aider .aiderignore, each written with a shell-style\nprovenance header. Multiple specs concatenate; path overridable per\ntarget via outputs.<target>.ignore-file.\n\nRelated to #435",
"is_bot": false,
"headline": "feat(spec): add ignore kind for agent ignore patterns (#450)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T07:12:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75ba34b21bfcf037a87ee51b1d70809826168d28",
"body": "Single-source dev-env bootstrap (install, services, ports, terminals)\nvia a new environment spec kind (.agnostic-ai/environments/*.yaml).\nCursor emits it as .cursor/environment.json: the spec passes through\nafter x-<target> resolution, minus agnostic routing fields, with\nmultiple specs merging by top-level key (last wins). Other targets\nreport it unsupported.\n\nRelated to #434",
"is_bot": false,
"headline": "feat(spec): add environment kind for dev-env bootstrap (#449)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T06:46:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "45bcba86d9a5faf4c811ef7407fc6a8f7746c250",
"body": "Single-source code-review-bot guidance via a new review spec kind\n(.agnostic-ai/reviews/*.md). Cursor emits it as scope-located BUGBOT.md\nfiles (repo root plus per-directory), honoring scope like rules and\nconcatenating same-scope specs. Other targets report it unsupported.\n\nA scope that escapes the repo root is skipped so a BUGBOT.md never\nlands outside the project tree.\n\nRelated to #433",
"is_bot": false,
"headline": "feat(spec): add review kind for code-review bot guidance (#448)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T06:24:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70af0518246273f6b220b3663748633a5c465cfa",
"body": "* feat(spec): add settings kind for permissions and model\n\nSingle-source agent permissions (allow/deny/ask) and the default model\nacross tools via a new settings spec kind (.agnostic-ai/settings/*.yaml).\nClaude maps them into .claude/settings.json; targets with no settings\nsurface report the kind as\n[…]\naude): seed only non-list keys in permissions merge\n\nMake the \"sibling keys carry through, lists are recomputed\" invariant\nexplicit instead of copying then overwriting allow/deny/ask.\n\nRelated to #432",
"is_bot": false,
"headline": "feat(spec): add settings kind for permissions and model (#447)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-17T06:04:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c4626e55c53ff9c72f492ed7fda936aa7872880",
"body": "…(#446)\n\nA non-SKILL.md markdown file inside a folder-based skill was loaded as\nits own skill, spawning a phantom top-level skill whose body was the\nasset content. Skip such files during the load walk; they remain copied\nverbatim by the adapters.\n\nRelated to #431",
"is_bot": false,
"headline": "fix(spec): treat extra markdown in a skill folder as a bundled asset …",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T21:15:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bc0902faa2ad51a8f52b071f95d959612d44b06",
"body": "Cursor flattens each skill to a single .mdc rule, so a skill that\nbundles sibling files (scripts, assets) lost them with no signal.\nSurface a coverage note per affected skill instead of dropping the\npayloads silently.\n\nRelated to #430",
"is_bot": false,
"headline": "fix(cursor): note bundled skill payloads Cursor cannot emit (#445)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T21:08:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d6639131b7df7b5e7378b505ac8b45ec286f9a8",
"body": null,
"is_bot": false,
"headline": "fix(import): strip provenance header and catch-all globs on seed (#442)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T20:58:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e4521f433651ff995eb3eb7359f9d4e3acc6418",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.39.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T19:49:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af7c7f1a88b68b118ac55c2e5ea8003290894fdb",
"body": "…428)\n\nA release shipped scaffolding headings (### Changed with nothing under\nit) whenever a cycle touched only some categories. prune the empty\n### subsections from [Unreleased] before promoting it to the dated\nsection; subsections with at least one entry survive untouched.\n\nUpdates the cut-release skill and release-cutter agent specs to match.",
"is_bot": false,
"headline": "feat(release): prune empty Unreleased subsections before promoting (#…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T19:46:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f1f81ef61b11fd7106e5c84c9b100b50a2a044f",
"body": "…ts (#427)\n\n* feat(sync): add resolve-imports for @-import lines in shared body\n\n@path file-import lines in AGNOSTIC_AI.md were copied verbatim to every\ntarget. Only Claude resolves them; codex and the rest carried dead\nreference lines and never received the referenced content.\n\nsync.resolve-imports\n[…]\nnes is only used inside StripGeneratedAppendices, so it\ndoes not need to be exported. Correct the re-export comment to say the\nfunction reverses sync's edits, not just removes blocks.\n\nRelated to #425",
"is_bot": false,
"headline": "feat(sync): resolve @-import lines per target with sync.resolve-impor…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T19:40:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "22da84bd99bcbf176280b78284e0b2c64945be04",
"body": "… (#426)\n\n* feat(claude): add rules-mode import to wire .claude/rules into CLAUDE.md\n\nClaude Code does not auto-load .claude/rules/, so the emitted per-rule\nfiles were inert unless the user hand-added imports or fell back to the\nlegacy concatenated layout (which drops the canonical pointer body).\n\no\n[…]\nnel framing across both rules appendices\n\nExtract wrapRulesBlock so the inline-body and @-import renderers keep the\nrules markers and heading in one place instead of duplicating them.\n\nRelated to #424",
"is_bot": false,
"headline": "feat(claude): wire .claude/rules into CLAUDE.md via rules-mode import…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T19:30:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b59f642f196899c33cffbded975e25fae2b3ceb8",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.38.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T18:32:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a132ed8a1c2c4521c23882e2d9c94ead9a7d466",
"body": "…#423)\n\nsync now emits scoped rules under .claude/rules/<scope>/ and\n.github/instructions/<scope>/, but the claude and copilot importers read\nonly the top level, dropping nested files on round-trip. Walk both rule\ntrees recursively and preserve the subdirectory as scope, matching the\ncursor importer (#411).\n\nRelated to #411",
"is_bot": false,
"headline": "fix(import): walk nested rule subdirectories for claude and copilot (…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T18:12:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc2be3290893c31290cd03ffcac3d2c44f598d45",
"body": "Source specs flipped to disable-model-invocation: false and re-synced so\nthe generated .claude copies match, resolving the source/generated drift.",
"is_bot": false,
"headline": "chore: enable model invocation for gh-issue and gh-issues skills (#422)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T18:10:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b59a39fb7457a954931823676f6b4d69b63bfdc4",
"body": "…t (#421)\n\nimport mirrors one source entry-point into AGNOSTIC_AI.md. A project with\na distinct, hand-authored AGENTS.md alongside CLAUDE.md lost the AGENTS.md\ncontent on the next sync with no notice. Scan every target entry-point and\nwarn when a hand-authored sibling diverges from the captured body, so the\nuser can merge it before syncing.\n\nRelated to #415",
"is_bot": false,
"headline": "feat(import): warn when a sibling entry-point holds uncaptured conten…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T17:26:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5470977a1a8bd227d7b52e1ed33be099d9838bcc",
"body": "The managed block folded every emitted path into the tool's top-level\ndir (/.claude/), which also ignored hand-authored siblings like\nsettings.json or a hooks/ tree. Stop the collapse at the generated\nsubdirectory (/.claude/rules/) and keep files that sit directly under\nthe tool dir precise, so only generated output is ignored.\n\nRelated to #414",
"is_bot": false,
"headline": "fix(gitignore): collapse managed entries at the generated subdir (#420)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T17:18:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1fe8e5634cab24c9c2c6d60188d69009419f6a76",
"body": "…#419)\n\n* fix(import): quote description frontmatter that needs YAML escaping\n\nA description carrying a colon-space, quotes, or surrounding whitespace\nwas written as a bare YAML scalar, so the imported spec failed the tool's\nown validate. Encode the value through yaml.v3 so it is quoted or\nblock-folded when needed.\n\nRelated to #413\n\n* ref(import): drop unreachable encode-error branch in YAML scalar helper\n\nRelated to #413",
"is_bot": false,
"headline": "fix(import): quote description frontmatter that needs YAML escaping (…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T17:09:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c78c776edf5de086ba7820d5f7f063377078c79",
"body": "scopedDir built <scope>/<dir>, so a rule at rules/backend/auth.md\nemitted to backend/.cursor/rules/auth.mdc at the repo root. Flip it to\n<dir>/<scope> so output stays under the tool dir (.cursor/rules/backend/\nauth.mdc). Claude rule emission ignored scope entirely; nest it too.\n\nRelated to #412",
"is_bot": false,
"headline": "fix(emit): nest scoped specs under the rules directory (#418)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T17:01:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a4320657327dc24cdbe7dad4325b9f554666117",
"body": "Cursor reads rules recursively, but the importer only scanned the top\nlevel and silently dropped nested .mdc files. Walk the tree and mirror\neach rule into the source dir, preserving its subdirectory path.\n\nRelated to #411",
"is_bot": false,
"headline": "fix(import): walk nested .cursor/rules subdirectories (#416)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T15:52:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17583b497510d05cdf76ddb1d0677f71eba6b7c5",
"body": "The install endpoint now returns a 301, so curl without -L piped the\nredirect HTML into bash and the Shell tests job failed at setup. Add\n-sSL so the real script is fetched.",
"is_bot": false,
"headline": "fix(ci): follow redirects when installing bashunit (#417)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T15:49:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ccf0a8351b8631c352a0b8ce248969e72134f93f",
"body": "Set rules-file, emit-skills-as-commands, and tasks-file so agents,\nskills, and hooks reach targets that gate them behind output keys.\nThis clears the coverage notes sync reported for the dogfood config.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "chore: enable opt-in outputs for aider, gemini, opencode, zed",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-16T15:27:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9dde529ed84ad1efd7d6abe79bd98b2b4da37b09",
"body": "Match the runtime hint (upgrade.go) and README; GoReleaser ships a cask.",
"is_bot": false,
"headline": "docs: add --cask to brew upgrade hint in cli-reference (#410)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T18:27:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4be1a344cea46fce9dc7525916dfe73f7c47848",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.37.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T17:59:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "66008fa01878e8197378a2645185bd39cd1042b8",
"body": "* fix(init): offer Antigravity target; correct lint exit-code help\n\ninit's canonical target list omitted Antigravity, so the interactive\nprompt and --all never enabled it. Add it.\n\nlint --help claimed exit code 2 for warnings, but lint always exits 1.\nAlign the help text with the behavior.\n\n* docs: \n[…]\nys.\n- adding-adapters: default-target list lives in init_interactive.go.\n- architecture: list external/ and header/ adapter dirs; add Entry.Layer.\n- roadmap: Antigravity also lacks project-scoped MCP.",
"is_bot": false,
"headline": "fix: offer Antigravity in init, correct lint help, fix doc drift (#409)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T17:56:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c909b068f2393d14399500a56b67419826705fff",
"body": null,
"is_bot": true,
"headline": "chore(deps): bump codecov/codecov-action from 6 to 7 (#396)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-14T16:56:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ae4629fb91baa036859b09de3db7d3b8a39a9f6",
"body": null,
"is_bot": false,
"headline": "docs(changelog): tighten unreleased entries",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T16:11:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dbf0c9b74b75b1cc8a65c98404c32e9802a0f5a7",
"body": "explain and why diff only adapter Emit output, but rule bodies inlined\ninto entry-point files (AGENTS.md, GEMINI.md, CONVENTIONS.md, ...) are\nwritten by sync's entry-point distribution, not by any adapter. So\nexplain omitted the codex/gemini/aider/amp/warp/opencode contributions\nand why reported ent\n[…]\neach inlining target as a section contribution; why\nrecognizes an entry-point file and lists the inlined rule specs as\nsection sources, attributing the file to the first consuming target.\n\nCloses #405",
"is_bot": false,
"headline": "fix(explain): credit entry-point-inlined rule contributions (#408)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T15:58:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b5eb40eb6d6605afb53812eedc02101adf7018e",
"body": "A target may declare support for a kind yet emit it only behind an\noutputs.<target>.* key (or source-dir only). Those specs were skipped\nwith no signal. Sync now buffers a note: line per gap and flushes it\nafter the capability warnings, with the same sticky cross-run\nsuppression. Covers gemini/opencode skills, warp agents+skills,\naider agents+skills, and zed hooks.\n\nCloses #404",
"is_bot": false,
"headline": "feat(sync): note opt-in coverage gaps instead of silent skips (#407)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T15:49:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ac14dc7477b01964d53eafbc8bd279cb241075b",
"body": "Always-on rules (no globs/scope) were skipped by isAlwaysOn and reached\nno Copilot file unless outputs.copilot.rules-file was set, dropping user\ncontent with no warning. Emit them as applyTo:\"**\" instruction files,\nthe same shape agents and skills already use, so they apply by default.\nThe legacy concatenated layout still suppresses per-file emission.\n\nCloses #403",
"is_bot": false,
"headline": "fix(copilot): emit always-on rules as catch-all instructions (#406)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T15:28:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6648d0e5e059248bdcf92eaed97ab5ca9896283f",
"body": "Always-on rules (no globs) are not emitted by default for Copilot; only\npath-scoped rules get a dedicated instructions file.",
"is_bot": false,
"headline": "docs(readme): flag copilot always-on rules need rules-file",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-14T14:21:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4df8831cd0fbbd7c934dabf8739a952687f3754b",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.36.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-12T07:34:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37509403974a9de761d3511c56ca2ed4b1f55971",
"body": null,
"is_bot": false,
"headline": "docs(readme): tighten prose, drop verbosity",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-12T07:32:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30fbdd0350cde036c24e8d447ed4d0b6bf3f830a",
"body": null,
"is_bot": false,
"headline": "docs(changelog): simplify unreleased notes",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-12T07:22:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3c2c688932b0a3aee15beced3a7338f4c332521",
"body": "… Unreleased",
"is_bot": false,
"headline": "docs(changelog): revert premature v0.36.0 section, keep changes under…",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-12T07:22:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3fe336476b56df52e2bc8d4fdaf7d2608b076a21",
"body": null,
"is_bot": false,
"headline": "docs(changelog): cut v0.36.0 release section",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-12T07:21:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e2802735889e71961f1818b3bfced3e69139fda6",
"body": "…ed block (#402)\n\nThe local-override config, sync-state file, and packs dir were written as\nloose lines outside the managed block by init and packs add, while sync\nwrote a separate block that also listed .sync-state. Result: a duplicated\n.sync-state, inconsistent anchoring (loose lines bare, managed\n[…]\n/packs-add. init seeds the block\neven with gitignore disabled, since these paths must never be committed;\npacks add ensures the block exists without clobbering sync's generated\nlines.\n\nRelated to #401",
"is_bot": false,
"headline": "feat(gitignore): consolidate fixed agnostic-ai entries into the manag…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-12T07:14:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "44e7a7bcbeb021d3ece55719e91a0dbd08aaf1ad",
"body": null,
"is_bot": false,
"headline": "docs: simplify unreleased changelog entry for #399",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-11T22:04:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7ac368a6d361bd5c867708bcc0557079f45f93ce",
"body": "…s dir (#400)\n\ncodex, amp, warp, gemini, aider, and opencode advertised KindRule support\nbut emitted no rule content on a default sync: their adapters only wrote\nthe legacy concatenated rules-file (opt-in), so AGENTS.md/GEMINI.md/\nCONVENTIONS.md carried just the pointer body and rule specs reached t\n[…]\n across targets sharing a path (AGENTS.md), so the\ndedup holds. render and graph reconstruct the contribution; import strips\nthe block so the AGNOSTIC_AI.md round-trip stays lossless.\n\nRelated to #399",
"is_bot": false,
"headline": "fix(sync): inline rule bodies into entry-point targets without a rule…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-11T21:24:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5f9f78ef4c022a118de22f7706737be361b4c48b",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.35.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-09T19:17:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e6487b7b4f6b484bfc6de017d27fce2f2d2a20c6",
"body": "* feat(sync): add target-overview appendix to entry-point files\n\nEach target entry-point (CLAUDE.md, AGENTS.md, ...) can now carry a\ngenerated, sentinel-marked appendix listing where that tool's generated\nartifacts live, gated behind sync.target-overview (off by default).\n\nThe canonical pointer body\n[…]\nl-cfg guard and the redundant\nseen pre-seed in renderEntryPointFiles, unexport the overview interface\n(only NativeArtifactsFor asserts it), and document that external\nadapters get no appendix section.",
"is_bot": false,
"headline": "feat(sync): add target-overview appendix to entry-point files (#398)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-09T19:05:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5e7891f01d6123239fcbc0004177db00660e5266",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.34.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T23:30:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bbb906679167e0aac6838cf2b662b1acea3feabb",
"body": "…ind> (#395)\n\n* feat(config): make sources block optional, default to .agnostic-ai/<kind>\n\nAn omitted source kind now defaults to `.agnostic-ai/<kind>` (e.g.\n`.agnostic-ai/agents`), matching the tree `init` scaffolds. The bare\ntop-level default (`agents/`) never matched that tree, so every config\nha\n[…]\nsources:` to compensate. Drop the block from the\nrepo's own config to dogfood the default.\n\n* docs: add missing commands source to example config\n\n* docs: simplify changelog entry for optional sources",
"is_bot": false,
"headline": "feat(config): make sources block optional, default to .agnostic-ai/<k…",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T23:25:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2fa027a50df772c26c5702ce04305208db0e1d7b",
"body": "sync enables 12 targets by default; amp and warp share the root AGENTS.md\nentry-point with codex and add no new one, so they need explicit selection.\nREADME and targets docs implied all 14 sync out of the box.",
"is_bot": false,
"headline": "docs: flag amp and warp as opt-in targets",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T09:55:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4894fc37bb30c23eecbf1c63ec481e2d64da8e09",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.33.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T08:55:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e230dd35181569054e18e0cb596922a2510134f",
"body": "cleanup walked the whole tree and deleted every *.bak, destroying\nunrelated user backups (vim saves, manual copies). Derive the emitted\npath set the way check and revert do, then remove only <path>.bak for\nthose paths plus the entry-point files.\n\nRelated to #390",
"is_bot": false,
"headline": "fix(cleanup): scope .bak removal to sync-written backups (#394)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T08:47:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a4d6dc97a25991a71896bd73eb4a06ad4a549dcd",
"body": "sync writes the entry-point files (CLAUDE.md, AGENTS.md, ...) outside\nadapter emission, but revert only replayed adapter emission, so a\nsync --backup then revert round-trip orphaned the user's content in .bak\nand --force left the generated files behind. Revert the entry-point\nfiles on the same terms via a shared entryPointPaths helper.\n\nRelated to #389",
"is_bot": false,
"headline": "fix(revert): restore and force-delete entry-point files (#393)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T08:41:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49ba68809234c0f8a747a296cfcc747e81a86f2b",
"body": "* feat(gitignore): add allow list for managed-block re-allow lines\n\nThe managed block emits only root-anchored ignores, so a project that\nships fixtures named like adapter outputs had no way to keep them tracked\nwithout hand-editing. Add gitignore.allow: a list of glob patterns\nemitted as !-prefixed\n[…]\nres above them.\n\nRelated to #388\n\n* ref(gitignore): reuse sortedKeys for allow normalization\n\nDrop the duplicated set-to-sorted-slice loops in favor of the existing\nsortedKeys helper.\n\nRelated to #388",
"is_bot": false,
"headline": "feat(gitignore): add allow list for managed-block re-allow lines (#392)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T08:34:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a409f9c924c5ddcd515221f6ac512d2e3fb94b26",
"body": "…(#391)\n\n* fix(skills): stop flat-file skills leaking siblings into each folder\n\nFlat-file skills share one source directory, so copying every sibling\nfile mirrored each skill's body into all the others' emitted folders.\nPropagate sibling assets only for folder-based skills, which own their\ndirector\n[…]\nre SKILL.md skip predicate, drop single-use wrappers\n\nLift the repeated SKILL.md skip into emit.SkipSKILLMd and inline the\nper-adapter propagate wrappers now that emit owns the logic.\n\nRelated to #387",
"is_bot": false,
"headline": "fix(skills): stop flat-file skills leaking siblings into each folder …",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T08:25:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "da094e3b0c13210476b43f595388372fa880825a",
"body": "Fresh scaffolds now write gitignore.enabled: true, so init keeps the\nemitted target files (.claude/, .codex/, CLAUDE.md, AGENTS.md, ...) out of\ngit and .agnostic-ai/ stays the single committed source. The TTY confirm\nprompt defaults to yes and non-interactive (CI, piped stdin) runs take the\ndefault without prompting; pass --gitignore=false to commit outputs instead.\n\nExisting configs without a gitignore key keep the absent-key default (false),\nso this only affects newly scaffolded projects.",
"is_bot": false,
"headline": "feat(init): ignore generated outputs by default (#386)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-05T08:04:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a583494fd40dfe10183ad20152aecf9fcf1f1ce1",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.32.1",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-04T05:26:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf26e3a8e9b7ea697a4b56f9d1863d244fe4106d",
"body": "Audit of all 14 adapters: every target syncs correctly, but the README,\ntargets.md, configuration.md, spec-format.md, and two code comments had\ndrifted from the working code. No behavior change.\n\n- README: replace 3-state capability glyph with a 4-level support-depth\n scale (native / bundled / opt-\n[…]\nared-subagents default, the Claude rules import note, and the\n MCP type note.\n- config.go / collision.go: codex+amp+warp share an identical AGENTS.md\n pointer body via auto-dedup and do not collide.",
"is_bot": false,
"headline": "docs: align target docs and matrices with actual adapter behavior (#385)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-04T05:15:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "026e529360770cea90941ee99d9cdacef59b1aa2",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.32.0",
"author_name": "Chemaclass",
"author_login": "Chemaclass",
"committed_at": "2026-06-03T11:44:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bfdebdf84de9ad97f0d515f1712b09c0c66e9b9",
"body": "One line per change, lead with effect, drop how-it-works detail per the\nfile's own entry-style convention. Replace verbose [#NNN](url) markdown\nlinks with bare (#NNN) / Closes #NNN across the whole file.",
"is_bot": false,
"headline": "docs(changelog): tighten Unreleased notes and use bare issue refs (#384)",
"author_name": "Jose M. Valera Reales",
"author_login": "Chemaclass",
"committed_at": "2026-06-03T11:23:10Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 48,
"commits_last_year": 556,
"latest_release_at": "2026-07-20T05:25:52Z",
"latest_release_tag": "v0.43.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 10,
"days_since_latest_release": 3,
"mean_days_between_releases": 4.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 100,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/chemaclass/agnostic-ai",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/chemaclass/agnostic-ai",
"is_deprecated": false,
"latest_version": "v0.43.0",
"repository_url": "https://github.com/chemaclass/agnostic-ai",
"versions_count": 48,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-20T05:17:10Z",
"latest_version_yanked": null,
"days_since_latest_publish": 3
}
]
},
"popularity": {
"forks": 3,
"stars": 11,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-05-04",
"count": 1
},
{
"date": "2026-05-06",
"count": 1
},
{
"date": "2026-05-26",
"count": 1
}
],
"complete": true,
"collected": 3,
"total_forks": 3
},
"star_history": null,
"open_issues_and_prs": 3
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile",
"Taskfile.yml"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"editors/vscode/tsconfig.json"
],
"toolchain_manifests": [
"editors/jetbrains/build.gradle.kts",
"go.mod"
],
"largest_source_bytes": 49046,
"source_files_sampled": 389,
"oversized_source_files": 0,
"agent_instruction_files": [
"internal/adapters/aider/testdata/kitsink/.aider.conf.yml",
"tests/integration/fixtures/golden/amp/AGENTS.md",
"tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md",
"tests/integration/fixtures/golden/claude/CLAUDE.md",
"tests/integration/fixtures/golden/cline/AGENTS.md",
"tests/integration/fixtures/golden/codex/AGENTS.md",
"tests/integration/fixtures/golden/crush/AGENTS.md",
"tests/integration/fixtures/golden/gemini/GEMINI.md",
"tests/integration/fixtures/golden/junie/AGENTS.md",
"tests/integration/fixtures/golden/kiro/AGENTS.md",
"tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md",
"tests/integration/fixtures/golden/trae/AGENTS.md",
"tests/integration/fixtures/golden/warp/AGENTS.md",
"tests/integration/fixtures/golden/zed/AGENTS.md"
],
"agent_instruction_max_bytes": 1966
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"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": [
"go"
],
"dependencies": [
{
"name": "github.com/BurntSushi/toml",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/charmbracelet/huh",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.0"
},
{
"name": "github.com/charmbracelet/x/term",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.2.2"
},
{
"name": "github.com/fsnotify/fsnotify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.1"
},
{
"name": "github.com/invopop/jsonschema",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.14.0"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "golang.org/x/sync",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.15.0"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 2,
"merged_prs": 287,
"open_issues": 1,
"closed_ratio": 0.995,
"closed_issues": 215,
"closed_unmerged_prs": 5
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "Chemaclass",
"commits": 503,
"avatar_url": "https://avatars.githubusercontent.com/u/5256287?v=4"
},
{
"type": "User",
"login": "Lacsw",
"commits": 50,
"avatar_url": "https://avatars.githubusercontent.com/u/12248879?v=4"
},
{
"type": "User",
"login": "SchoolyB",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/110133622?v=4"
},
{
"type": "User",
"login": "SauronBot",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/82400622?v=4"
}
],
"contributors_sampled": 4,
"top_contributor_share": 0.905
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"playground.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": true,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum",
"package-lock.json"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 9,
"reason": "binaries present in source code",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 9,
"reason": "26 out of 28 merged PRs checked by a CI test -- score normalized to 9",
"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/28 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 5 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": 10,
"reason": "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": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow 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": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"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": 0,
"reason": "20 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "3409f8b0b6acbc76c9ade8c075078aa9b26fbe8a",
"ran_at": "2026-07-23T20:31:12Z",
"aggregate_score": 4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T10:29:58Z",
"oldest_open_prs": [
{
"number": 481,
"created_at": "2026-07-20T08:35:05Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 482,
"created_at": "2026-07-20T08:35:09Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-23T10:28:05Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 479,
"created_at": "2026-07-19T23:26:02Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/Chemaclass/agnostic-ai",
"host": "github.com",
"name": "agnostic-ai",
"owner": "Chemaclass"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"security": 40,
"vitality": 73,
"community": 53,
"governance": 65,
"engineering": 89
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 73,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"commits_last_year": 556,
"human_commit_share": 0.97,
"days_since_last_push": 0,
"active_weeks_last_year": 10
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "10/52 weeks with commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 10
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "556 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 556
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 48,
"latest_release_tag": "v0.43.0",
"releases_from_tags": false,
"days_since_latest_release": 3,
"mean_days_between_releases": 4.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "48 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 48
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~4.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 4.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 53,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"forks": 3,
"stars": 11,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "11 stars",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 11
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "3 forks",
"points": 2.5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 3
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"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 (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"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": 13.5,
"status": "met",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"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": 65,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 26,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 4,
"top_contributor_share": 0.905
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 90% of commits",
"points": 2.1,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 90
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "4 contributors",
"points": 5.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 4
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 5 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"merged_prs": 287,
"open_issues": 1,
"closed_issues": 215,
"issue_closed_ratio": 0.995,
"closed_unmerged_prs": 5
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.5,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "287/292 decided PRs merged",
"points": 37.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 287,
"decided": 292
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 65,
"inputs": {
"followers": 227,
"owner_type": "User",
"is_verified": null,
"owner_login": "Chemaclass",
"public_repos": 147,
"account_age_days": 4722
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "227 followers of Chemaclass",
"points": 17,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 227,
"login": "Chemaclass"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "147 public repos, account ~12 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 147
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/chemaclass/agnostic-ai"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 3
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 3 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 3
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "48 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 48
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "excellent",
"name": "Engineering Quality",
"value": 89,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "excellent",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 88,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": true,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"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": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"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": 6.4,
"status": "met",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "26 out of 28 merged PRs checked by a CI test -- score normalized to 9",
"points": 18,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"agentic-ai",
"claude",
"codex",
"gemini",
"agnostic-ai"
],
"has_wiki": false,
"homepage": "https://chemaclass.github.io/agnostic-ai/",
"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": "https://chemaclass.github.io/agnostic-ai/",
"points": 15,
"status": "met",
"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": "5 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 5
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 40,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 18,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 0,
"scorecard_aggregate": 4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "binaries present in source code",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "26 out of 28 merged PRs checked by a CI test -- score normalized to 9",
"points": 2.2,
"status": "partial",
"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/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 5 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": "update tool detected",
"points": 7.5,
"status": "met",
"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": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"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 detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": "20 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"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": 6
},
"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": "excellent",
"name": "AI Readiness",
"value": 86,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"internal/adapters/aider/testdata/kitsink/.aider.conf.yml",
"tests/integration/fixtures/golden/amp/AGENTS.md",
"tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md",
"tests/integration/fixtures/golden/claude/CLAUDE.md",
"tests/integration/fixtures/golden/cline/AGENTS.md",
"tests/integration/fixtures/golden/codex/AGENTS.md",
"tests/integration/fixtures/golden/crush/AGENTS.md",
"tests/integration/fixtures/golden/gemini/GEMINI.md",
"tests/integration/fixtures/golden/junie/AGENTS.md",
"tests/integration/fixtures/golden/kiro/AGENTS.md",
"tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md",
"tests/integration/fixtures/golden/trae/AGENTS.md",
"tests/integration/fixtures/golden/warp/AGENTS.md",
"tests/integration/fixtures/golden/zed/AGENTS.md"
],
"agent_instruction_max_bytes": 1966
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "internal/adapters/aider/testdata/kitsink/.aider.conf.yml, tests/integration/fixtures/golden/amp/AGENTS.md, tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md, tests/integration/fixtures/golden/claude/CLAUDE.md, tests/integration/fixtures/golden/cline/AGENTS.md, tests/integration/fixtures/golden/codex/AGENTS.md, tests/integration/fixtures/golden/crush/AGENTS.md, tests/integration/fixtures/golden/gemini/GEMINI.md, tests/integration/fixtures/golden/junie/AGENTS.md, tests/integration/fixtures/golden/kiro/AGENTS.md, tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md, tests/integration/fixtures/golden/trae/AGENTS.md, tests/integration/fixtures/golden/warp/AGENTS.md, tests/integration/fixtures/golden/zed/AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "internal/adapters/aider/testdata/kitsink/.aider.conf.yml, tests/integration/fixtures/golden/amp/AGENTS.md, tests/integration/fixtures/golden/antigravity/.agent/AGENTS.md, tests/integration/fixtures/golden/claude/CLAUDE.md, tests/integration/fixtures/golden/cline/AGENTS.md, tests/integration/fixtures/golden/codex/AGENTS.md, tests/integration/fixtures/golden/crush/AGENTS.md, tests/integration/fixtures/golden/gemini/GEMINI.md, tests/integration/fixtures/golden/junie/AGENTS.md, tests/integration/fixtures/golden/kiro/AGENTS.md, tests/integration/fixtures/golden/opencode/.opencode/AGENTS.md, tests/integration/fixtures/golden/trae/AGENTS.md, tests/integration/fixtures/golden/warp/AGENTS.md, tests/integration/fixtures/golden/zed/AGENTS.md"
}
}
],
"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": "97 of 97 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 97,
"sampled": 97
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum",
"package-lock.json"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile",
"Taskfile.yml"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"editors/vscode/tsconfig.json"
],
"agent_commit_share": 0.09,
"toolchain_manifests": [
"editors/jetbrains/build.gradle.kts",
"go.mod"
],
"dependency_bot_commit_share": 0.03
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile, Taskfile.yml",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile, Taskfile.yml"
}
}
],
"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": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "editors/vscode/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "editors/vscode/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "9 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 9,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "3 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 3,
"sampled": 100
}
}
],
"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": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 49046,
"source_files_sampled": 389,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/389 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 389,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "moderate",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": true,
"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": 20,
"status": "met",
"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",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-23T20:31:30.814224Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/Chemaclass/agnostic-ai.svg",
"full_name": "Chemaclass/agnostic-ai",
"license_state": "standard",
"license_spdx": "MIT"
}