公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-26 06:42 UTC

abdul-hamid-achik / vecgrep

Local-first semantic code search using Ollama embeddings and sqlite-vec

GoMIT★ 1 星标⑂ 0 复刻始于 2026年1月在 GitHub 上查看 ↗

abdul-hamid-achik/vecgrep 的健康指数为 100 分中的 58 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(84/100),最低的是Community & Adoption(33/100)。 最近一次更新在 6 天前。 近期的大部分工作由 1 位贡献者完成。

58
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

58
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Abdul Hamid个人账户
49 关注者113 个公开仓库始于 2014年4月@graphite-systems

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/abdul-hamid-achik/vecgrepv0.0.0-20260719211945-97144781e696-276 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

79良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 6 天前
6.9/36提交节奏 — 52 周中有 10 周有提交
18/18提交量 — 最近一年 119 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year119
human_commit_share0.97
days_since_last_push6
active_weeks_last_year10

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 53 个发布版本
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 2.1 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count53
latest_release_tagv2.21.0
releases_from_tags
days_since_latest_release6
mean_days_between_releases2.1

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

33存在风险 · 占总体的 18%
评分方式
0/60星标 — 1 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

51中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.4/22.5提交分布 — 头号贡献者编写了 98% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.983
评分方式
0/46.8议题解决 — 没有议题或无数据
25.5/38.3PR 接受 — 已裁定的 PR 中 2/3 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs2
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
12.2/25所有者影响力 — abdul-hamid-achik 有 49 位关注者
25/25既往记录 — 113 个公开仓库,账户约 12 年
所用输入
followers49
owner_typeUser
is_verified
owner_loginabdul-hamid-achik
public_repos113
account_age_days4,477
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 6 天前
20/20版本历史 — 27 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/abdul-hamid-achik/vecgrep
ecosystemsgo
any_deprecated
min_days_since_publish6

工程质量

基础的工程与文档实践是否到位?

84良好 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://vecgrep.dev
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepagehttps://vecgrep.dev
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

38存在风险 · 占总体的 16%

安全态势

38存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3.8
已排除计分(无数据或不适用):ci_tests。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

76良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 97 次人类提交中有 97 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7,048
评分方式
18/18一条命令的引导启动 — Taskfile.yml
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 55 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesTaskfile.yml
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.55
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.3/55可控的文件大小 — 采样的 158 个源文件中有 2 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes85,202
source_files_sampled158
oversized_source_files2
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
0/40可运行示例
所用输入
example_dirs
has_mcp_signal
api_schema_files

关键数据

1GitHub 星标
2贡献者
119最近 12 个月提交数
6距最近推送天数
53发布版本数
1巴士系数(bus factor)
0开放议题
Go, npm软件包生态系统数

数据采集警告

  • 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

更多细节

OpenSSF Scorecard 3.8 / 10
3.8综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-26 06:42 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
直接依赖 13
注册表软件包版本约束清单文件
Gocharm.land/bubbles/v2v2.1.0go.mod
Gocharm.land/bubbletea/v2v2.0.7go.mod
Gocharm.land/lipgloss/v2v2.0.4go.mod
Gogithub.com/abdul-hamid-achik/veclitev0.24.0go.mod
Gogithub.com/fsnotify/fsnotifyv1.9.0go.mod
Gogithub.com/modelcontextprotocol/go-sdkv1.6.1go.mod
Gogithub.com/sabhiram/go-gitignorev0.0.0-20210923224102-525f6e181f06go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/spf13/viperv1.21.0go.mod
Gogo.etcd.io/bboltv1.5.0go.mod
Gogolang.org/x/syncv0.20.0go.mod
Gogolang.org/x/timev0.15.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1396,
      "has_wiki": true,
      "homepage": "https://vecgrep.dev",
      "languages": {
        "Go": 1617184,
        "Shell": 50,
        "Dockerfile": 1539
      },
      "pushed_at": "2026-07-19T21:19:51Z",
      "created_at": "2026-01-20T05:35:24Z",
      "owner_type": "User",
      "updated_at": "2026-07-19T21:19:54Z",
      "description": "Local-first semantic code search using Ollama embeddings and sqlite-vec",
      "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://abdulachik.dev",
      "name": "Abdul Hamid",
      "type": "User",
      "login": "abdul-hamid-achik",
      "company": "@graphite-systems ",
      "location": "México",
      "followers": 49,
      "avatar_url": "https://avatars.githubusercontent.com/u/7379966?v=4",
      "created_at": "2014-04-23T03:26:08Z",
      "is_verified": null,
      "public_repos": 113,
      "account_age_days": 4477
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.21.0",
          "kind": "minor",
          "published_at": "2026-07-19T21:22:55Z"
        },
        {
          "tag": "v2.20.0",
          "kind": "minor",
          "published_at": "2026-07-18T21:24:42Z"
        },
        {
          "tag": "v2.19.1",
          "kind": "patch",
          "published_at": "2026-07-16T19:11:43Z"
        },
        {
          "tag": "v2.19.0",
          "kind": "minor",
          "published_at": "2026-07-16T18:05:52Z"
        },
        {
          "tag": "v2.18.0",
          "kind": "minor",
          "published_at": "2026-07-16T05:55:23Z"
        },
        {
          "tag": "v2.17.0",
          "kind": "minor",
          "published_at": "2026-07-13T18:47:35Z"
        },
        {
          "tag": "v2.16.0",
          "kind": "minor",
          "published_at": "2026-07-09T18:37:22Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-07-09T18:37:21Z"
        },
        {
          "tag": "v2.15.0",
          "kind": "minor",
          "published_at": "2026-07-07T01:18:03Z"
        },
        {
          "tag": "v2.14.1",
          "kind": "patch",
          "published_at": "2026-07-01T03:07:06Z"
        },
        {
          "tag": "v2.14.0",
          "kind": "minor",
          "published_at": "2026-06-29T15:56:28Z"
        },
        {
          "tag": "v2.13.0",
          "kind": "minor",
          "published_at": "2026-06-28T19:13:45Z"
        },
        {
          "tag": "v2.12.0",
          "kind": "minor",
          "published_at": "2026-06-27T20:31:23Z"
        },
        {
          "tag": "v2.11.0",
          "kind": "minor",
          "published_at": "2026-06-27T18:36:48Z"
        },
        {
          "tag": "v2.10.2",
          "kind": "patch",
          "published_at": "2026-06-27T18:28:58Z"
        },
        {
          "tag": "v2.10.1",
          "kind": "patch",
          "published_at": "2026-06-27T07:55:10Z"
        },
        {
          "tag": "v2.10.0",
          "kind": "minor",
          "published_at": "2026-06-26T21:40:28Z"
        },
        {
          "tag": "v2.7.1",
          "kind": "patch",
          "published_at": "2026-06-25T05:07:51Z"
        },
        {
          "tag": "v2.7.0",
          "kind": "minor",
          "published_at": "2026-06-25T04:23:23Z"
        },
        {
          "tag": "v2.6.0",
          "kind": "minor",
          "published_at": "2026-06-24T20:36:21Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2026-06-24T16:00:11Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2026-06-23T23:34:45Z"
        },
        {
          "tag": "v2.3.1",
          "kind": "patch",
          "published_at": "2026-06-23T23:02:13Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2026-06-23T22:18:11Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2026-06-21T21:07:13Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2026-06-20T01:24:55Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2026-06-15T17:43:50Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-06-15T17:38:15Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-03-02T20:10:07Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-02-07T15:23:24Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-01-31T01:34:41Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-01-30T19:34:45Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-01-30T19:35:29Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-01-29T04:54:52Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-01-26T00:23:41Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-01-23T07:39:07Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-01-21T21:38:45Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-01-21T19:30:31Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-01-21T04:26:46Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-01-20T23:22:51Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-01-20T22:42:20Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-01-20T21:55:00Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-01-20T21:11:27Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-01-20T21:01:47Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-01-20T20:50:13Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-01-20T19:57:00Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-01-20T19:51:18Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-01-20T19:40:34Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-01-20T19:30:30Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-01-20T19:03:36Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-01-20T18:56:29Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-01-20T18:39:26Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-01-20T18:32:54Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "97144781e69632b8a18d55b301f741cb76ea2136",
          "body": "Ship a production-ready Studio: list results with fuzzy filter, spinner and\ngradient progress for honest indexing, status tables, readiness chips, and\nmouse wheel/click. Gate large/full indexes with dry-run confirm on CLI and\nStudio (small empty projects auto-start). Expand unit coverage and ten\npassing Glyph Studio flows.",
          "is_bot": false,
          "headline": "feat: polish Studio TUI with Charm v2 components and index plan-first UX",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-19T21:19:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cb8c14fd1a09e12b6517e5af21f729bb7847d1b",
          "body": "Document the agent readiness envelope, vecgrep_ensure modes, and phase-aware\nindex progress shipped on main.",
          "is_bot": false,
          "headline": "Prepare v2.20.0 changelog for readiness, ensure, and progress UX.",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-18T21:22:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4df0fa5018b75d874584fe13c3c6b5d6a3a87f5b",
          "body": "Add a shared readiness envelope so MCP search no longer confuses empty or profile-mismatched indexes with zero hits, gate readiness before daemon search, and expose vecgrep_ensure for explicit check/index paths. Emit walk-complete progress so CLI and Studio stop showing a shrinking percentage during discovery, with empty-index first-run CTAs in Studio.",
          "is_bot": false,
          "headline": "Improve index readiness UX for agents and honest progress for humans.",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-18T21:10:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e9aaf864188ed1ed2cd788afea76f3172a192ae",
          "body": "…ions\n\nIsRunning dialed the daemon socket with no deadline, so a wedged daemon\nor a foreign process squatting on the path blocked interactive callers\n(studio startup, test runs) indefinitely — observed hanging go test for\n10 minutes against a live socket. The whole probe (dial + ping +\nresponse) is \n[…]\nne tag carries the\ndirective), so @latest falls back to the current default branch;\nHomebrew remains the supported channel for versioned builds.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bound the daemon liveness probe and retract stale 0.x/1.x module vers…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-16T19:08:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5531667dcc2fae1eb17ac2676774f28413786cd1",
          "body": "…id weights\n\nAfter hybrid search degrades to keyword-only, raw unbounded BM25 landed\non Score and the 0-1 --min-score filter silently no-op'd. Keyword-mode\nscores are now BM25/maxBM25 within the result set (top hit = 1.0,\nDistance keeps the raw value) so min-score works in every mode; the\ndegradatio\n[…]\nnstead of\ndefaults. CHANGELOG backfilled for the 20 releases between v2.2.0 and\nv2.18.0, with two bullets moved to their true release (v2.14.1).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Normalize keyword BM25 scores for min-score and honor configured hybr…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-16T18:01:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f71d6e6a0f704a738a5fe8aa4fce1c2078c96e6",
          "body": "Covers per-mode score scales (calibrated 0-1 hybrid, raw cosine in\nsemantic, raw BM25 in keyword and degraded-hybrid), substance damping,\nthe degradation warning surfaces, and the min-score no-op after\ndegradation. Fixes the landing-page demo scores that were impossible\nunder the new calibration and the stale claim that veclite owns fusion.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Document v2.18.0 score semantics across docs, help, and MCP descriptions",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-16T06:18:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "386987061b000bcfd833cb85c50ca7dd4dc66c1b",
          "body": "Hybrid-mode scores were raw Reciprocal Rank Fusion values (k=60), capping\nthe reportable score at ~0.0164 — every result showed 0.01–0.02, tiny\nimport-only chunks outranked substantive code via BM25 length bias, and\nmin_score above 0.02 wiped all results. Hybrid search now runs vector and\nBM25 retri\n[…]\nPC, and the CLI\ndaemon fast-path, which previously dropped warnings entirely. Strict\nSearch still errors; semantic mode never silently degrades.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix hybrid scoring: replace raw RRF values with calibrated score fusion",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-16T05:51:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ff6f16776553f3f78b005b20bb0878eecd02074",
          "body": null,
          "is_bot": false,
          "headline": "feat: add trusted structural ingestion and freshness",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-13T18:42:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a492903ccea5a9ab86f8661ff8dea37104ffc002",
          "body": "brew install abdul-hamid-achik/tap/vecgrep is the recommended install\nmethod. From-source build remains as an alternative. Updated the final\nCTA on the landing page, the quick-start guide, and the README\ninstallation section.",
          "is_bot": false,
          "headline": "add Homebrew install method to landing page, quick-start, and README",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-13T05:53:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0dcacfea04006a2aab5e13169c5412b8a261b787",
          "body": "Landing page:\n- Rewrite index.md with 8 feature cards, how-it-works 3-step flow,\n  terminal demo, vecgrep vs grep comparison table, why-vecgrep section,\n  MCP integration CTA, provider matrix, FAQ accordion, and final CTA\n- Add stats banner with flex layout (4 providers, 11 MCP tools, 3 modes)\n- Fix\n[…]\nostname: vecgrep.dev)\n- Add robots.txt with sitemap reference\n- Generate 1200x630 OG image (PNG via headless Chromium screenshot)\n- Add SVG favicon and apple-touch-icon\n- Add Providers link to top nav",
          "is_bot": false,
          "headline": "overhaul docs landing page and add SEO infrastructure",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-13T05:39:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb4f0b6210068682c296cccd174086dd1cb89f01",
          "body": "The global registry (~/.vecgrep/config.yaml) accumulates entries for\ndeleted checkouts and temp directories from old runs, each dragging an\norphaned index data dir under ~/.vecgrep/projects/. Add\n`vecgrep projects prune`:\n\n- removes entries whose project path no longer exists (a path that merely\n  c\n[…]\nwhen\n  the data_dir resolves strictly inside ~/.vecgrep/projects; a hand-edited\n  data_dir pointing elsewhere is never touched (covered by test)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: vecgrep projects prune — clean stale registry entries",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-12T04:08:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e81a11a77f0ec96bf8e552ba38652a1aabe5a6fc",
          "body": "Bump veclite to v0.24.0 (pulls go-sdk v1.6.1 transitively; all tests pass).\nEvery writable open now sets WithWAL(true):\n\n- index backend (InitWithOptions): chunks accepted mid-index or by the\n  long-running daemon survive a crash between snapshot saves. Bulk indexing\n  pays one fsync per InsertBatch\n[…]\n\n\nVerified end-to-end: indexing a sample project creates vectors.veclite.wal\nand leaves it folded (16-byte header, 0 pending) after a clean run.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: adopt veclite v0.24.0 and enable the write-ahead log for writers",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-12T03:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f29ad997e2a3ffd31d68090c9454e56c81ee4a8",
          "body": "Grow the embedded benchmark dataset from 30/30 to production-representative\nscale: 14 languages (adds java, sql, json, toml, c, dockerfile, hcl),\n18 distractors, 12 multi-relevant queries, and hard-negative pairs (JWT\nvalidate vs decode, jitter vs plain backoff, token-bucket vs fixed-window,\npool-te\n[…]\n required list.\n\nBaseline on this corpus (ollama): fast-local MRR 0.831, quality-code\nMRR 0.886 / R@10 0.992 — profiles now measurably separate.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: expand embedding relevance corpus to 78 docs / 66 queries",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-12T00:53:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a04a272c15f6df707883dbb603444cb548c17a6",
          "body": null,
          "is_bot": false,
          "headline": "fix: make Ollama truncation warnings truthful",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-11T20:38:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "799d9a105dfb207985a9a6ab062782734436fe58",
          "body": null,
          "is_bot": false,
          "headline": "feat: optimize indexing and embedding workflows",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-11T20:21:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee25d4a004d19be6800ecbbdf80a593c16cf1972",
          "body": "- bump veclite to v0.23.0 (per-call MCP locking, structured errors,\n  model registry)\n- memory recall now ranks with exponential temporal decay (30d half-life\n  default) and importance boost (0.25 default) — recent + important\n  memories surface first; both are ranking-only, nothing is excluded.\n  R\n[…]\nord-mode fallback on low scores, empty-result guidance)\n- drop CODEMAP-INTEGRATION.md + BRANCH-INDEX-AND-DAEMON.md (shipped\n  working docs); live contract now documented at docs/codemap-integration.md",
          "is_bot": false,
          "headline": "feat: memory ranking intelligence + search affordances (veclite 0.23)",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-09T18:33:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c832e15183e8af4d72bbab5f628221334fd8a816",
          "body": "Wire vecgrep's CLI for adapter consumers (Cortex) that need\nmachine-distinguishable signals:\n\n- Add --min-score to search and similar, wiring the existing\n  SearchOptions.MinScore filter to a cobra flag (default 0 preserves\n  behavior). Drops sub-threshold hits before emitting the array.\n- Route sco\n[…]\nn\n  authoritative empty result.\n\nAdd MemoryStore.Ping and Service.IndexMeta helpers, plus unit tests for\nmin-score filtering, index metadata, the envelope shape, and the\nprovider-unavailable envelope.",
          "is_bot": false,
          "headline": "feat: machine-consumer contracts for search and memory recall",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-07T01:15:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "432d16f2e935942ee13402d19fce8a92d3804805",
          "body": "vecgrep serve built s.codemap from the zero-value SDKServerConfig.Codemap\n(always nil), so vecgrep_status/vecgrep_index reported \"codemap binary not\nfound\" even when codemap was installed — silently disabling structural\nre-ranking and impact-based search scoping. Re-resolve s.codemap from the\nprojec\n[…]\nolute\npath so subsequent exec.Command calls don't re-fail a PATH lookup.\n\nRegression tests: ResolveBinary fallback/preferred/not-found/explicit-path;\nNewSDKServer resolves codemap from project config.",
          "is_bot": false,
          "headline": "fix(mcp): resolve codemap from project config in NewSDKServer",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-07-01T03:05:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f0d51ab1b471afd5dfc77237e23df5484aad8cee",
          "body": null,
          "is_bot": false,
          "headline": "style: go fmt client/studio files (GoReleaser dirty-tree fix)",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-29T15:54:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2837245540debbba9571e86ad0345213bbed3f7",
          "body": "When the daemon hub owns the write lock, the studio used to fail to open\nwith 'the database is locked' and was unusable. Now it falls back to a\nread-only session (lock-free since veclite v0.22.0) so browsing/search\nwork alongside a running daemon:\n\n- On open, if the write lock is held by a running d\n[…]\nndexSync)\n  with a 'reindexing via daemon' status; reset (!) and delete (x) are\n  blocked with guidance to stop the daemon first.\n- Tests: isLockHeldByDaemon logic, readOnly status + header indicator.",
          "is_bot": false,
          "headline": "feat(studio): read-only fallback + daemon-delegated reindex",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-29T15:50:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1dad3f04911b1d946cd0b415304ef24417792c7a",
          "body": "When the daemon hub is running, it owns the exclusive write lock for every\nopen project. A plain `vecgrep index` opened a second write session and\ncollided with the daemon's lock ('the database is locked. The daemon may be\nrunning.'). Now `vecgrep index` detects a running daemon and delegates the\nre\n[…]\nefresh veclite version to v0.22.1.\n- go.mod: veclite v0.22.0 -> v0.22.1 (also fixes the HNSW panic on insert\n  after the entry point is soft-deleted, which crashed the daemon's\n  incremental reindex).",
          "is_bot": false,
          "headline": "feat(index): delegate vecgrep index to a running daemon hub",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-29T15:23:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df1f24b2b04d6052c1842b4567a7a0e9a414ba77",
          "body": "veclite v0.22.0 makes WithSharedRead opens lock-free (no flock), so a\nlong-lived reader (MCP server, search) never blocks a writer and is never\nblocked by one. Backward-compatible API; no code changes needed.\n\n- go.mod: veclite v0.21.0 -> v0.22.0.\n- internal/mcp/session_test.go: drop the 'lock file \n[…]\nion (lock-free reads leave no .lock file); keep the\n  idle-eviction + write-after-eviction checks.\n- cmd/vecgrep/main.go: update the serve lock comment (read-only opens are\n  lock-free since v0.22.0).",
          "is_bot": false,
          "headline": "chore: bump veclite to v0.22.0 (lock-free read-only opens)",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-29T14:32:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d447b99c034fdc6052aceedd40a75c1866adb7af",
          "body": "Replace the one-daemon-per-project model with a single hub process that\nlistens on one global socket (~/.vecgrep/daemon.sock) and routes JSON-RPC\nby project root to per-project workers, opening each lazily on first\nrequest (and pre-opening any roots passed to `daemon start`).\n\n- internal/daemon/work\n[…]\nottle for now (shared cross-project rate limiting is a\nfollow-up). Branch switching still rejected while a worker holds a project.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(daemon): multi-project hub — one socket, lazy per-project workers",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-28T18:23:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ecfc44ed37133476b50985a1bc75dd0f0ee760b8",
          "body": "FindProjectRootFrom walked up the directory tree treating any .vecgrep\ndirectory as a project root, but the global store at ~/.vecgrep shares that\nname with the project-local marker. Running `vecgrep index` from a directory\nwith no closer marker resolved the project root to $HOME and indexed the\nent\n[…]\n config dir when matching the .vecgrep marker, and add\nregression tests covering the home/global dir and a genuine nested project.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: don't treat global ~/.vecgrep as a project-root marker",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-27T20:29:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "121f10ddc417f1e7aec9c9f8ae2f9e4358af2e61",
          "body": "…ive progress bar\n\nReworks indexing into a concurrent chunk -> embed -> insert pipeline: chunk\nworkers feed per-chunk items that are coalesced into provider batches across\nfiles, and each file is inserted and reported the moment its last chunk is\nembedded. Chunks from many files share a batch, so th\n[…]\npipeline (race-clean), the all-or-nothing retry semantics, the\ncount-mismatch guard, and the progress-bar log suppression/restore.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: pipelined indexing with all-or-nothing per-file inserts and a l…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-27T18:34:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "02b9ad0a5efc8ff13471c21f7f3d8126e090d18d",
          "body": "…nstalled\n\nvecgrep_investigate's blast-radius scoping never engaged, for two reasons:\n\n1. Parser drift. The `codemap impact --json` parser was written for an older\n   codemap output shape. codemap v0.17.0 emits `found` (not `indexed`), no flat\n   `files` array, and `blast_radius` as a transitive-cal\n[…]\nmap hotspots` call; set structural_weight=0 to keep investigate scoping\nwithout the per-search rerank.\n\ngo test -race ./... clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: parse codemap v0.17.0 impact output + auto-enable codemap when i…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-27T18:26:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67bdb2d887a4f00bb7a3e95f3b943a4bc346475f",
          "body": "`vecgrep serve --mcp` opened a writable session at startup and held an\nexclusive VecLite lock for its entire lifetime, blocking `vecgrep daemon\nstart` and every other reader (\"database file is locked by another\nprocess\"). Fix that and a cluster of related concurrency bugs found while\nauditing the lo\n[…]\nlusive open fails;\n  surface previously-swallowed reloadIfStale errors.\n\nNew tests cover each fix; `go test -race ./...` is clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve MCP/daemon index lock contention and concurrency races",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-27T07:52:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "141f72d53265b5ff4c3852ebb87f0f4db4201363",
          "body": "mcpSession tests:\n- Lazy open (no lock until first call)\n- RO opens with shared lock, cached\n- RW closes RO first, returns uncached handle\n- Lock error on contention wraps ErrFileLocked\n- hasDatabase, reloadIfStale (threshold + daemon.json mtime signal)\n- Close releases RO lock allowing another proc\n[…]\nts:\n- available() true/false for live/missing socket\n- search, reindex, stats socket calls\n- call timeout via context deadline\n- formatDaemonSearchResult, formatStatsResult, formatLockError formatting",
          "is_bot": false,
          "headline": "test: add dedicated tests for mcpSession and daemonClient",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-26T21:40:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "640e9ed608edc792867f7ee23e38eaaff2a09957",
          "body": "The MCP server no longer opens the database in read-write mode at\nstartup. Instead it uses a lazy dual-handle session (mcpSession) that\nopens read-only (shared flock) on first search and read-write (exclusive\nflock) per-call for write operations, releasing the lock when done.\n\nThis resolves the mult\n[…]\naemon.go: extended search params + daemon.stats handler\n- internal/db/db.go + veclite_backend.go: Reload() passthrough for RO auto-reload\n- Bumped veclite dep to v0.21.0 (adds veclite/session package)",
          "is_bot": false,
          "headline": "feat: lock-free MCP initialization with lazy dual-handle session",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-26T21:24:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cce6c7d56d401a01632645f9a057ccd4cd8cc4f4",
          "body": "Add the missing investigation flow from FEATURE.md: codemap impact\ncomputes a changed symbol's blast radius, and vecgrep scopes its\nsemantic search to the affected file set.\n\nLayers (bottom-up):\n- DB: FilePaths allow-list filter on FilterOptions using veclite.In\n- Search: propagate FilePaths through\n[…]\n unavailable or unindexed, matching\nthe established pattern of rerankWithCodemap and annotateSearchHits.\n\nTests: FilePaths filter test in db_test.go, Impact unavailable test\nin codemap_client_test.go.",
          "is_bot": false,
          "headline": "feat: add codemap blast-radius investigation flow for scoped search",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T14:09:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b1a817a347bdc57b7722d87ffc79266c1adc177",
          "body": "The test handler appended to requestPaths from concurrent goroutines\n(the fallback sends 2 concurrent single-embed requests). Add a mutex\nto protect the slice.",
          "is_bot": false,
          "headline": "fix: resolve data race in EmbedBatchFallsBackOn404 test",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T12:50:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fcef26465ff84d8ef6cd536e4d35fd2ba32909d",
          "body": "Indexing Speed:\n- Add keep_alive parameter to Ollama embed requests to keep model loaded\n- Add model warmup before indexing to eliminate first-batch latency\n- Make maxBatchSize configurable (was hardcoded 64)\n- Eliminate double file read by caching content alongside hash in fileInfo\n- Wrap CLI path \n[…]\nleted branches\n\nDaemon:\n- Add daemon.switchBranch RPC for lock-free branch switching\n- Track in-flight reindex/switch operations with WaitGroup\n- Add periodic sweep timer (default 24h) using TTL rules",
          "is_bot": false,
          "headline": "feat: improve indexing speed, UX, DX, and add fcheap integration",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T12:46:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "38d5dea44ac50d4826ba712409d39e31c298a9a8",
          "body": "The --verbose progress callback redrew with \\r but never erased to end of\nline, so a shorter line (shorter filename or smaller counts) left the tail\nof the previous, longer line on screen — producing garbled output like\n\"...479 chunks)9/4621 files, 478 chunks)s)ks)nks)8 chunks)\".\n\nAppend \\033[K (erase to end of line) after each redraw.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: clear line on verbose index progress to stop leftover characters",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T05:05:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d7bc5ad206677f6887f7c204bb689f09840c49c",
          "body": "…exing\n\nAdd OllamaProvider.EmbedDocuments using /api/embed batch endpoint that\naccepts input: []string and returns multiple embeddings in a single HTTP\nrequest. EmbedBatch delegates to this and falls back to the legacy\nconcurrent single-request path when /api/embed is unavailable (old Ollama).\n\nThro\n[…]\n), and indexer BatchSize (32->64) to match the batch endpoint.\n\nOn a 10k-chunk codebase: 10k HTTP requests -> ~157 batch requests.\nOn a 100k-chunk codebase: 100k HTTP requests -> ~1.6k batch requests.",
          "is_bot": false,
          "headline": "feat: use Ollama native batch embedding endpoint for 8-16x faster ind…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T04:21:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1fd0ef730b1eec1cf4fc9768a2b0b4599e753e5c",
          "body": "… rename)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: F3 rebind rule resolved (annotations survive reindex, orphan on…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T03:15:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cca5ced729049d68a55e78b3f211d9fb152dd5ba",
          "body": "…+ exact tag-AND)\n\nG2 needs codemap to surface this project's memories beside a symbol, but\nmemory was MCP-only — and codemap can't call vecgrep's MCP server (CLI-only,\none hop). Add a `vecgrep memory` CLI exposing the existing recall/remember\nlogic so codemap can shell it.\n\nNew commands (cmd/vecgre\n[…]\ng.\n\nGuardrails: no codemap Go import; degrades gracefully (Ollama down → clear\nerror, json mode still emits []). task check green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "memory: add `vecgrep memory recall/remember` CLI for G2 (C5 contract …",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T02:56:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1fbe74e9b3c0711d2e84d1fd40374a23720605aa",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: integration plan — G1 shipped (codemap), G2 memory-governance spec",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T02:39:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "58e0249c80d49a1836785dc8d698bcf6241eee0e",
          "body": "…tatus cross-read\n\nF3 — annotate targeting via codemap symbol-at (C2). codemap now ships\n`codemap symbol-at <file>:<line> --json`, so add SymbolAt(ctx,file,line)\n+ SymbolAtResult{...,resolution} with a nil-safe Resolved() (exact|enclosing\nwith a non-empty symbol). annotateSearchHits now resolves eac\n[…]\nng the cross-tool safety net\nto the two new contracts.\n\nGuardrails held: CLI-only one hop, no codemap Go import. task check green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codemap: finish F3 annotate targeting, F2 blast-radius decision, G4 s…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T02:17:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae8ac3351442ed6f5e713dfbb1b99c1a8d13c97b",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: codemap integration plan v2 (validated, bidirectional)",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T02:11:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "650efd9952581271f1d3fcbbcf481659b3960504",
          "body": "The vecgrep→codemap integration shipped dead: three paths parsed\nfields/flags codemap never emits, each failing quietly and falling\nback to heuristics with no trace.\n\nF1 — RelatedFiles: replace the per-symbol fan-out (symbols→impact per\nsymbol, N cold subprocess spawns parsing a non-existent\n{caller\n[…]\nering,\nthe inflated-hub down-weighting, and the annotate gate — the cross-tool\nsafety net the original five-shape coupling lacked.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codemap: wire F1/F2/F3 against the real CLI contract",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-25T02:02:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1aeca266c7f2fb5700c6d36d9a38c424976f996b",
          "body": "…-safe\n\n- Make mockProvider.embedCalls/batchCalls atomic.Int32 to fix concurrent\n  access by throttle worker goroutines\n- Replace separate joinInFlight+registerInFlight with atomic\n  joinOrRegisterInFlight to eliminate the check-then-act race where two\n  goroutines both see no entry and both proceed to embed\n- Use named return values in Embed so defer leaveInFlight captures the\n  actual result for dedup waiters",
          "is_bot": false,
          "headline": "fix: resolve data race in throttle dedup and make mockProvider thread…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-24T20:35:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a4c240051c6656ff6679c6bbba8292839892fc",
          "body": "…ound daemon\n\nCODEMAP-INTEGRATION:\n- Add CodemapConfig with Enabled, Bin, MCPEndpoint, StructuralWeight\n- Create codemap_client.go MCP client (impact/find/symbols/annotate/hotspots)\n- Delegate vecgrep_related_files to codemap's real call graph with fallback\n- Pin search/similar hits as persistent co\n[…]\nAdd config tests for codemap/daemon env var resolution\n- Add Glyphrun flows: daemon_status, branch_status, config_codemap_enabled\n- Fix config_cloud_provider flow terminal rows for new config sections",
          "is_bot": false,
          "headline": "feat: add codemap integration, per-branch index switching, and backgr…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-24T20:31:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f786222b1295c7141e7dd27a45c8afde898c8158",
          "body": "Replace the ASCII [====----] index bar with codemap's blended purple→pink\nBubble Tea progress bar showing percentage, file count, and current path.\n\n- Add cmd/vecgrep/index_progress.go: an inline Bubble Tea progress model\n  (progress.WithDefaultBlend) plus runIndexWithBar, which runs service.Index\n \n[…]\nve now-dead internal/render/progress.go and its test.\n- go mod tidy pulls in github.com/charmbracelet/harmonica (progress spring).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: gradient progress bar for vecgrep index CLI",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-24T15:57:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ad938d2709e7dd626b8e5ea77e9c16e12df4f81b",
          "body": "Add a real-time ASCII progress bar to the index command, shown by\ndefault in interactive terminals. The bar shows percentage, file count,\nchunk count, and elapsed time, updating in place via carriage return.\n\n- New internal/render/progress.go with reusable ProgressBar and\n  IndexProgressLine helpers\n[…]\nle the bar for scripts/CI\n- Auto-suppress bar in non-TTY contexts (piped/redirected output)\n- Keep --verbose as its own format with current file path\n- Unit tests for ProgressBar and IndexProgressLine",
          "is_bot": false,
          "headline": "feat: add live progress bar to vecgrep index CLI",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-23T23:32:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f7f8753ef8d8d3af1be80522ae3e84eb3a16712",
          "body": "When another process holds the veclite lock, 'vecgrep reset' now:\n- Detects ErrFileLocked and suggests 'vecgrep reset --force'\n- ResetIndexFiles also removes the stale .lock file\n- ResetIndexFiles no longer fails if it can't re-open the DB after\n  deletion (files are already deleted; user runs 'vecgrep index')",
          "is_bot": false,
          "headline": "fix: vecgrep reset --force handles locked DB gracefully",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-23T23:00:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1a9fa532f04b28c8126575a6cc5d84f65da0197",
          "body": "Bump veclite dependency from v0.17.0 to v0.20.0, remove local replace\ndirective. Read-only CLI commands (search, status, similar) now use\nOpenReadOnlySession() which opens with WithSharedRead(true), so they\nsucceed while the studio TUI holds the exclusive lock.",
          "is_bot": false,
          "headline": "feat: use veclite WithSharedRead for CLI-while-studio",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-23T22:14:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ed9d9e952012b313564c1f98d9ce2474a38ae52",
          "body": "…ecar\n\n- Wire vector.veclite.m/ef_construction/ef_search from config through\n  OpenOptions into VecLite collection creation and per-query search options.\n  Resolve VECGREP_VECTOR_VECLITE_* env vars in resolution.go so they reach\n  the backend instead of being silently dropped.\n- Bump veclite v0.14.0\n[…]\n via go/parser.\n- Surface provider health, veclite version, and HNSW config in status/Studio.\n- Add CLAUDE.md and document docs/ (VitePress site) vs ~/notes (Obsidian\n  vault) discipline in AGENTS.md.",
          "is_bot": false,
          "headline": "feat: wire HNSW config, bump veclite to v0.17.0, collapse profile sid…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-21T21:04:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f068152f7bbc131e3d58111cc6849c27ad63fe69",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add vercel config for docs site deploy",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-20T02:52:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9fd762941cde3232d3df5a8fc105a76105cf1e2e",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add v2.1.0 changelog entry",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-20T02:25:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6131cefa265f3aa0a9e6508d592444084868cb5f",
          "body": null,
          "is_bot": false,
          "headline": "feat: add docs site and provider polish",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-20T01:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6c3f8b2546334dc86b82c9ea238563374938b11",
          "body": null,
          "is_bot": false,
          "headline": "ci: update workflow action runtimes",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-15T17:52:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ccd87c3fa45cf5c8042d04472d99615d28b6e9",
          "body": null,
          "is_bot": false,
          "headline": "chore: prepare v2.0.1 release",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-15T17:42:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcec5f7cdc6efb7e63c05eb89402e3bb3f305ed8",
          "body": null,
          "is_bot": false,
          "headline": "ci: pin release workflow runtime",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-15T17:39:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "034108207bdad74e3f76be31d51c342addc1143e",
          "body": null,
          "is_bot": false,
          "headline": "fix: enable cgo for race tests",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-15T17:39:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "428e6113ec0ee8b9d067c2d3bc7f2991d5512475",
          "body": null,
          "is_bot": false,
          "headline": "feat: ship Studio-only vecgrep",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-06-15T17:35:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ddf6cf52e6e5df64b661e0fc08641cbd94661ae1",
          "body": "…ault\n\nMake global mode the default for both CLI and MCP init. Project data is\nnow stored in ~/.vecgrep/projects/{name}/ instead of a local .vecgrep/\ndirectory, eliminating per-project .gitignore management. The --local\nflag preserves the old behavior. Existing local .vecgrep/ projects\ncontinue to work via auto-detection.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: centralize vecgrep index storage to ~/.vecgrep/projects/ by def…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-03-02T20:05:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cc826dfe0888b3832ef91a4de0e723ae2f849f9d",
          "body": "…lanning-KzjZ4\n\nfeat: populate language/type filters dynamically from vector DB",
          "is_bot": false,
          "headline": "Merge pull request #1 from abdul-hamid-achik/claude/improve-web-app-p…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-02-07T15:09:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d2c39bfa345ef43f6398c939af92e9a1d271c13",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #2 from abdul-hamid-achik/copilot/sub-pr-1",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-02-07T14:07:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f16f7b196c5fb23d99b0369ab0bd0e63400b815b",
          "body": "Co-authored-by: abdul-hamid-achik <7379966+abdul-hamid-achik@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: fix trailing whitespace",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-02-07T13:48:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f8535bee383a0320502b927db46d5ef7d6380d8",
          "body": "…ard, score clamping\n\nCo-authored-by: abdul-hamid-achik <7379966+abdul-hamid-achik@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix: address code review feedback - HTMX URLs, projects key, Prism gu…",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-02-07T13:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d325e5e039046658f67a0a2acce7587d5ce36b97",
          "body": null,
          "is_bot": true,
          "headline": "Initial plan",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-02-07T13:42:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f70c95888441d36002913af6aa90f5ea83dab760",
          "body": "Backend fixes:\n- Fix hybrid search re-ranking: results are now sorted AFTER text boost\n  is applied, with improved token-level matching and symbol name boosting\n- Fix SearchSimilarByID same-file exclusion: was calling GetChunkByLocation\n  with empty params, now uses new GetChunkByID method\n- Add Get\n[…]\nth overview cards and bar charts for\n  language/chunk type distribution\n- Result cards now use .result-card class for keyboard navigation focus\n\nhttps://claude.ai/code/session_01A4sXGzy4soRkXj4MUh3JB4",
          "is_bot": false,
          "headline": "feat: improve web app with syntax highlighting, keyboard nav, bug fixes",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-07T13:17:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08dd5a24eea4ef8ac9dc927f20a6a8d736e6a418",
          "body": "Replace hardcoded language and chunk type dropdowns in the web UI with\ndata sourced from the actual vector database index. The filters now show\nonly languages and types that exist in the indexed codebase, sorted by\nchunk count descending, with counts displayed in labels (e.g., \"Go (42)\").\n\n- Add get\n[…]\ns DB-sourced filters\n- Add /api/languages JSON endpoint for programmatic access\n- Support all 20 language display names with fallback titleCase\n\nhttps://claude.ai/code/session_01A4sXGzy4soRkXj4MUh3JB4",
          "is_bot": false,
          "headline": "feat: populate language/type filters dynamically from vector DB",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-02-07T13:01:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "714f4459d6d31a23ccbf0185abc6f6733b798792",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: upgrade veclite to v0.11.0",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-31T01:49:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67d2b1375c8cb04ae42e5263da3b35130e214ee5",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add .vecai to gitignore and clean up README",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-31T01:35:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "054a08f836279dd98e6a7ca3b33812e9a323c676",
          "body": "- Upgrade veclite from v0.4.2 to v0.10.0\n- Fix score calculation: use Distance directly instead of (1 - Distance)\n- veclite's cosine similarity returns scores where 1.0 = identical, 0.0 = orthogonal\n- Previous formula inverted scores, causing all results to show 0% match\n- Add score_test.go with regression tests for score calculation\n- Update README with v2.1 upgrade notes and veclite version\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct match score calculation for cosine similarity",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-31T01:32:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "070e1954ac974a176bb8e3dbe91fce1af2817ecf",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: handle remaining unchecked error returns in tests",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-30T19:28:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d46a93a603bc5b085c33e08e8b58acebf14cef6",
          "body": "- Fix unchecked error returns in cached_test.go\n- Fix comment format for CacheSize method\n- Simplify bool comparisons in overview_tools.go\n- Use pointer for optional Deduplicate field\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve lint issues in new features",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-30T19:26:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2e4e4a5126d8881c4af7461f2a1af756892c487",
          "body": "- Add embedding cache with LRU eviction and TTL support for faster repeated queries\n- Add multi-profile search to search across code, notes, and other content sources\n- Add source adapter interface for pluggable content sources (files, noted CLI)\n- Add new MCP tools: vecgrep_overview, vecgrep_batch_\n[…]\n common query embeddings\n- Add profile management CLI commands (list, add, remove, show)\n- Fix MCP server panic caused by jsonschema tag format\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add embedding cache, multi-profile search, and MCP tools",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-30T19:23:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "817a36d1bb762020c734a44e7c0d1065cae672ae",
          "body": null,
          "is_bot": false,
          "headline": "fix: handle unchecked error returns in memory package",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-30T18:50:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "792e9e814c4100da26f65aea74bf89b8fc576e71",
          "body": "Add global memory store with semantic search for AI agents:\n\n- memory_remember: Store memories with importance, tags, and TTL\n- memory_recall: Search memories semantically with filtering\n- memory_forget: Delete by ID, tags, or age\n- memory_stats: Get memory store statistics\n\nMemory is stored globally at ~/.vecai/memory/memory.veclite using\nveclite with nomic-embed-text embeddings via Ollama.\n\nIncludes 21 unit tests covering happy paths, edge cases, and\nboundary conditions.",
          "is_bot": false,
          "headline": "feat: add memory MCP tools for agent note-taking",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-30T18:47:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd9d95ef07c4c05401027a4b00ac994b33e8a8c7",
          "body": null,
          "is_bot": false,
          "headline": "style: use fmt.Fprintf instead of WriteString(fmt.Sprintf)",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-29T04:52:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4443397650640b6403032971542a538e4b2d634b",
          "body": null,
          "is_bot": false,
          "headline": "chore: update veclite dependency to v0.4.2",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-29T04:49:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69fa57778b3eb9dd91c2073e0a86c68e84060574",
          "body": "…ering\n\nBREAKING CHANGE: Switch to cosine distance requires re-indexing\n\n- Add three search modes: semantic, keyword, and hybrid (default)\n- Implement native veclite filtering with Glob, In, Prefix, Between\n- Add batch insert operations for faster indexing\n- Add UpsertByKey support for incremental u\n[…]\nctor_weight, text_weight\n- Update CLI with --mode, --explain, --languages, --types, --dir, --lines\n- Update MCP server with mode and explain parameters\n- Update README with comprehensive documentation",
          "is_bot": false,
          "headline": "feat!: upgrade veclite integration with hybrid search and native filt…",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-29T04:47:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0441d0e95d4f37343e037775a2591dfb465ceed4",
          "body": "BREAKING CHANGE: Database format has changed. Existing users must re-index:\n  vecgrep reset --force && vecgrep index\n\nChanges:\n- Remove SQLite entirely - all data now stored in veclite vector payloads\n- Remove CGO requirement - pure Go builds with CGO_ENABLED=0\n- Enable true cross-compilation for al\n[…]\ne cross-compilation\n- Single data store = simpler architecture, no sync issues\n- Metadata in payload = faster search (no N+1 hydration queries)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat!: migrate to pure veclite storage, remove SQLite entirely",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-26T00:21:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ef853e2fe1bac8da98496a8e9d5b472ec9e86c3b",
          "body": "Add JSON output support to the status command for consistency with\nsearch and similar commands. This enables scripting and integration\nwith tools like the vecai agent.\n\n- Add -f/--format flag accepting 'default' or 'json'\n- Add StatusOutput and PendingChanges types for JSON marshalling\n- Update README documentation with new options\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add --format flag to status command",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-23T07:37:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "415103a8935dcf2c097191a483c659e8e068d395",
          "body": "Make the vector backend truly pluggable so users can switch between\nsqlite-vec (default) and veclite via configuration.\n\nChanges:\n- Add vectorBackend field to DB struct\n- Add OpenOptions and OpenWithBackend() for backend-aware opening\n- Create backend factory function (createVectorBackend)\n- Delegat\n[…]\n backends by setting vector.backend in config:\n- \"sqlite-vec\" (default): Uses sqlite-vec extension\n- \"veclite\": Uses VecLite with HNSW indexing\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wire up pluggable vector backend architecture",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-21T20:50:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "055b53e5888c40f7f1bb261cd8f5f069d1816eeb",
          "body": "- Add pluggable vector backend interface with sqlite-vec and veclite (HNSW) implementations\n- Add database migration support for schema upgrades\n- Create CHANGELOG.md with retrospective version history\n- Create CONTRIBUTING.md with contribution guidelines\n- Expand DEVELOPMENT.md with architecture, d\n[…]\nides\n- Update README.md with vector backend configuration and config sources\n- Update AGENTS.md with corrected file references and new features\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add pluggable vector backends and comprehensive documentation",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-21T19:27:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3aab5d3c74f9bb7fd46a6f25944f48a4c2a96f34",
          "body": "Add multi-level config resolution supporting project, global, and XDG-style\nconfiguration files. Projects can now be registered globally in ~/.vecgrep/\ninstead of requiring a local .vecgrep/ directory in each project.\n\nNew commands:\n- vecgrep config show [--global]: Display resolved configuration\n- \n[…]\n/.vecgrep/config.yaml\n7. Built-in defaults\n\nAlso updates go-chi/chi v5.2.1 -> v5.2.2 to fix host header injection\nvulnerability (GO-2025-3770).\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add hierarchical configuration system with global project registry",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-21T04:26:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "901b2e187131a5dd12a57ad83b9a69c3d33ae80a",
          "body": "- Handle fmt.Scanln error in reset command\n- Use blank identifier for ignored errors in db operations\n- Check json.Decode error in test\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address linting issues",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T23:26:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e286c85b86868b11e4622a3abd6ab6f1a3cd4f63",
          "body": "OpenAI Embedding Provider:\n- Add internal/embed/openai.go with full OpenAI API support\n- Support text-embedding-3-small and text-embedding-3-large models\n- Batch embedding with rate limit retry and exponential backoff\n- Configurable base URL for Azure OpenAI or custom endpoints\n- Add VECGREP_OPENAI_\n[…]\ntion:\n- Update README with OpenAI setup instructions\n- Document delete/clean/reset commands\n- Update environment variables and MCP tools tables\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add OpenAI provider, web similar feature, delete/reset commands",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T23:22:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98df2d9cf7dd7797ebb9ab9433ecb2549b0dc488",
          "body": "- Add PendingChanges struct and GetPendingChanges() method to indexer\n  to detect new, modified, and deleted files since last index\n- CLI: vecgrep init now shows .gitignore reminder\n- CLI: vecgrep status now shows reindex status (new/modified/deleted)\n- MCP: Server instructions updated to mention .g\n[…]\nnding changes\n- MCP: vecgrep_status shows reindex status with pending changes\n- README: Added .gitignore notes in Quick Start and Configuration\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add .gitignore reminder and reindex detection",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T22:40:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd893cdc496ec117317798bbe2d4953919301bb4",
          "body": "- Add vecgrep similar CLI command\n- Add vecgrep_similar MCP tool\n- Support search by chunk ID, file:line, or text snippet\n- Add --exclude-same-file filter option\n- Add GetEmbedding() and GetChunkByLocation() to database layer\n- Add SearchSimilarByID/Location/Text() to search layer\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add similar code finder feature",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T21:52:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "add42f0f8d4d3dd9a124923d3f598870290af16d",
          "body": "Search, index, and status commands now auto-detect projects from the\ncurrent working directory when a .vecgrep folder exists. This removes\nthe need to call vecgrep_init at the start of every Claude Code session.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add auto-detection for vecgrep projects without manual init",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T21:11:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b6c3cc05d4db69be1ed8402ac582ec9f83ac9f2",
          "body": "The custom MCP protocol implementation has been replaced by the\nofficial Go SDK (modelcontextprotocol/go-sdk). These files are\nno longer used:\n- protocol.go - custom protocol types\n- server.go - custom server implementation\n- tools.go - custom tools handler\n- server_test.go - tests for old implementation\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove old custom MCP implementation",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T21:05:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fbb801a3773a1ec34db037c4e9e5a56e8476f67e",
          "body": "Replace custom MCP protocol implementation with the official\nmodelcontextprotocol/go-sdk for reliable stdio transport handling.\nThis fixes the connection drop issue where Claude Code was unable\nto fetch tools after the initialize handshake.\n\nThe SDK handles:\n- Proper newline-delimited JSON framing\n- Correct initialize/initialized handshake\n- Automatic schema generation from Go structs\n- Tools list changed notifications\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Switch MCP server to official Go SDK",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T20:59:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c65ec1aa87ae09c82a89ba755cf28a8078514d20",
          "body": "Claude Code interprets any stderr output as errors which may cause\nconnection issues with MCP servers. Removed the startup message\nto ensure clean stdio operation.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove stderr output in MCP mode",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T20:48:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cbea78a0d97d01e8afe1cb50285d3fca3a1bbae3",
          "body": "- Update server instructions to explain vecgrep_init must run first\n- Make tool description clearer: \"REQUIRED FIRST STEP\"\n- Explain that init activates existing .vecgrep or creates new one\n- Helps Claude understand it needs to run init even for existing projects\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Improve MCP instructions to clarify vecgrep_init requirement",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T19:55:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "adf4d91edd1c821b51c4d57e7d79a38e22208de2",
          "body": "- Make 'path' parameter required for vecgrep_init\n- Add activateProject() to properly configure handler state after init\n- Handler now stores db, provider, projectRoot after successful init\n- Supports ~ expansion and absolute path resolution\n- Clear error message when path is missing\n\nThis fixes the\n[…]\ns didn't work after init because\nthe handler state wasn't updated. Now vecgrep_init properly\nactivates the project, making all tools available.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix MCP tools to work with global user scope",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T19:48:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e36cd0d182f2c108113124e8437d12cf121526aa",
          "body": "- Add VERSION, COMMIT, BUILD_DATE build args to Dockerfile\n- Pass version ldflags to go build in Docker\n- Configure docker-compose.yml to pass build args\n- Remove unused Resources and Prompts capabilities (we don't provide any)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix version ldflags in Docker and clean up MCP capabilities",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T19:38:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2528c5c520b41be4638a09c1db0d37b3ad76fa27",
          "body": "The current MCP specification is version 2025-06-18.\nPrevious versions may not be recognized by newer Claude Code clients.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update MCP protocol version to 2025-06-18",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T19:28:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7a870f8809debb6c65af81f39ce1ec4af8cb8cf6",
          "body": "- Remove omitempty from ToolsCapability.ListChanged\n- Set ListChanged: true (tools list changes after init)\n- This ensures clients properly recognize tools support\n\nThe previous \"tools\":{} was ambiguous - now outputs\n\"tools\":{\"listChanged\":true} which clearly indicates\ntools are supported.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix MCP tools capability declaration",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T19:01:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "61ca9398aa80f1ce71da02300cf35c159c97c7d7",
          "body": "Features:\n- Add vecgrep_init tool to initialize projects via MCP\n- MCP server now starts without .vecgrep (shows only init tool)\n- After init, all tools (search, index, status) become available\n- Add Ollama health check with helpful error messages\n- Show instructions for installing/starting Ollama when unavailable\n\nThis enables --scope user for Claude Code MCP integration,\nallowing vecgrep to work across all projects.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add vecgrep_init MCP tool and graceful uninitialized mode",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:54:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4e341473b9fa0056b55591853037f5bf0ebb5482",
          "body": "The vecgrep MCP server requires a .vecgrep directory in the working\ndirectory. Using --scope user fails because it runs from arbitrary\ndirectories. --scope local ensures it runs from the project directory.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix MCP CLI docs: use --scope local for project-specific config",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:50:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a4764b69223bf1933771503a8e0dc67fe46c671",
          "body": "- Add `claude mcp add` command examples\n- Show both local and user scope options\n- Add MCP management commands (list, get, remove)\n- Add Claude Desktop config file path for macOS\n- Reorganize MCP section with CLI first\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Claude Code CLI installation instructions for MCP",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:45:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aa866b04642f8eba77b561599f38e5e2153dd7f7",
          "body": "macos-13 runners are retired. Use macos-14 (ARM) and cross-compile\nto amd64 for Intel Mac support.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix macos-13 retirement, use macos-14 with GOARCH=amd64",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:38:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "54bbf3b75f2049d55ebda571e3b238c9f34d106e",
          "body": "- Build on ubuntu-latest for linux-amd64\n- Build on macos-latest for darwin-arm64 (Apple Silicon)\n- Build on macos-13 for darwin-amd64 (Intel Mac)\n- Custom Homebrew formula with on_macos/on_linux blocks\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add macOS support with native runners",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:35:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0488f61daea573dd3e7e7d4d7bce45c01ccb17b1",
          "body": "- Remove build step from CI (release handles it)\n- Use simple GoReleaser workflow for release\n- Build linux-amd64 only (CGO cross-compilation requires Pro)\n\nFor macOS support, consider:\n- GoReleaser Pro for split/merge\n- Native macOS runners in matrix build\n- goreleaser-cross Docker image\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Simplify CI and release workflows",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:31:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33556ab1ea3aa3690db863d6a6e855073354d145",
          "body": "- Build natively on each platform (ubuntu, macos-13, macos-latest)\n- Supports linux-amd64, darwin-amd64, darwin-arm64\n- Manual Homebrew formula update with proper checksums\n- Removed GoReleaser in favor of direct builds for CGO compatibility\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add matrix build for macOS support",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:28:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0abb7a766b8f68b0cd1ba3eb7b1f737ecfde9c50",
          "body": "CGO cross-compilation to macOS requires macOS SDK which isn't\navailable on Linux runners. Starting with linux-amd64 builds,\ncan add matrix builds for other platforms later.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Simplify release to linux-amd64 only for now",
          "author_name": "Abdul Hamid",
          "author_login": "abdul-hamid-achik",
          "committed_at": "2026-01-20T18:23:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 53,
      "commits_last_year": 119,
      "latest_release_at": "2026-07-19T21:22:55Z",
      "latest_release_tag": "v2.21.0",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 2.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/abdul-hamid-achik/vecgrep",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/abdul-hamid-achik/vecgrep",
          "is_deprecated": false,
          "latest_version": "v0.0.0-20260719211945-97144781e696",
          "repository_url": "https://github.com/abdul-hamid-achik/vecgrep",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T21:19:45Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Taskfile.yml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 85202,
      "source_files_sampled": 158,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7048
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "package.json"
      ],
      "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",
        "npm"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.0"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.7"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.4"
        },
        {
          "name": "github.com/abdul-hamid-achik/veclite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.24.0"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.0"
        },
        {
          "name": "github.com/modelcontextprotocol/go-sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.1"
        },
        {
          "name": "github.com/sabhiram/go-gitignore",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20210923224102-525f6e181f06"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.21.0"
        },
        {
          "name": "go.etcd.io/bbolt",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.20.0"
        },
        {
          "name": "golang.org/x/time",
          "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": 0,
        "merged_prs": 2,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "abdul-hamid-achik",
          "commits": 114,
          "avatar_url": "https://avatars.githubusercontent.com/u/7379966?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.983
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": null,
            "reason": "no pull request found",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 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": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "97144781e69632b8a18d55b301f741cb76ea2136",
        "ran_at": "2026-07-26T06:42:17Z",
        "aggregate_score": 3.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-19T21:23:06Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-02-07T15:09:14Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/abdul-hamid-achik/vecgrep",
    "host": "github.com",
    "name": "vecgrep",
    "owner": "abdul-hamid-achik"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 38,
        "vitality": 79,
        "community": 33,
        "governance": 51,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 119,
              "human_commit_share": 0.97,
              "days_since_last_push": 6,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "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": "119 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 119
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 53,
              "latest_release_tag": "v2.21.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 2.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "53 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.1
                    }
                  }
                ],
                "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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 6,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 6 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 33,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "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": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "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": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.983
            },
            "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 98% of commits",
                "points": 0.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "merged_prs": 2,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2/3 decided PRs merged",
                "points": 25.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 3
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 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": 59,
            "inputs": {
              "followers": 49,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "abdul-hamid-achik",
              "public_repos": 113,
              "account_age_days": 4477
            },
            "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": "49 followers of abdul-hamid-achik",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 49,
                      "login": "abdul-hamid-achik"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "113 public repos, account ~12 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 113
                    }
                  },
                  {
                    "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/abdul-hamid-achik/vecgrep"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "27 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://vecgrep.dev",
              "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://vecgrep.dev",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "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": 2
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 76,
        "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": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7048
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.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": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Taskfile.yml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.55,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Taskfile.yml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "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": "55 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 55,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 85202,
              "source_files_sampled": 158,
              "oversized_source_files": 2
            },
            "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": "2/158 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 158,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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-26T06:42:22.780701Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/abdul-hamid-achik/vecgrep.svg",
  "full_name": "abdul-hamid-achik/vecgrep",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Go.