公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 08:41 UTC

sugihAF / Contexo

Per-project, git-backed knowledge base for AI agents. Share research, decisions, and reasoning across your team's Claude / Cursor / Codex sessions via MCP.

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

sugihAF/Contexo 的健康指数为 100 分中的 53 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(75/100),最低的是Community & Adoption(24/100)。 最近一次更新在 15 天前。 近期的大部分工作由 1 位贡献者完成。

53
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Sugih Ahmad Fauzan个人账户
1 关注者20 个公开仓库始于 2018年10月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/sugihAF/contexov0.5.1-323 天前

按类别列示的指标

活力

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

73良好 · 占总体的 22%
评分方式
28.8/36推送新近度 — 最近一次推送于 15 天前
5.5/36提交节奏 — 52 周中有 8 周有提交
16.5/18提交量 — 最近一年 68 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year68
human_commit_share1
days_since_last_push15
active_weeks_last_year8

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 3 个发布版本
36/36发布时效 — 最近一次发布版本于 15 天前
27/27发布节奏 — 约每 17 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count3
latest_release_tagv0.5.1
releases_from_tags
days_since_latest_release15
mean_days_between_releases17

社区与采用

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

24危急 · 占总体的 18%
评分方式
0/60星标 — 1 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/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

可持续性与治理

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

50中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
0/46.8议题解决 — 没有议题或无数据
38.2/38.3PR 接受 — 已裁定的 PR 中 1/1 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/27 approved changesets -- score normalized to 0
所用输入
merged_prs1
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
2.2/25所有者影响力 — sugihAF 有 1 位关注者
21.6/25既往记录 — 20 个公开仓库,账户约 7 年
所用输入
followers1
owner_typeUser
is_verified
owner_loginsugihAF
public_repos20
account_age_days2,824
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 23 天前
12/20版本历史 — 3 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/sugihAF/contexo
ecosystemsgo
any_deprecated
min_days_since_publish23

工程质量

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

75良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

85优秀
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 7 个主题标签
10/10Wiki
所用输入
topicsai, claude, context-engineering, developer-tools, go, golang, mcp
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

36存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/27 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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
2.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 33 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.6

AI 就绪度

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

68中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 68 次人类提交中有 67 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.985
agent_instruction_files
agent_instruction_max_bytes
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 68 次提交中有 64 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
5/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.941
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 151 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes33,610
source_files_sampled151
oversized_source_files0

关键数据

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

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

OpenSSF Scorecard 3.6 / 10
3.6综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/27 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
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
5Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 5
0SASTSAST tool is not run on all commits -- score normalized to 0
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
0Vulnerabilities33 existing vulnerabilities detected
直接依赖 11
注册表软件包版本约束清单文件
Goaead.dev/minisignv0.2.0go.mod
Gogithub.com/AlecAivazis/survey/v2v2.3.7go.mod
Gogithub.com/gin-gonic/ginv1.10.0go.mod
Gogithub.com/golang-jwt/jwt/v5v5.3.1go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/minio/selfupdatev0.6.0go.mod
Gogithub.com/pkg/browserv0.0.0-20240102092130-5ac0b6a4141cgo.mod
Gogithub.com/spf13/cobrav1.8.1go.mod
Gogolang.org/x/termv0.27.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.50.1go.mod
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai",
        "claude",
        "context-engineering",
        "developer-tools",
        "go",
        "golang",
        "mcp"
      ],
      "is_fork": false,
      "size_kb": 820,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 674734,
        "Shell": 6340,
        "Makefile": 363,
        "Dockerfile": 947,
        "PowerShell": 5224
      },
      "pushed_at": "2026-07-06T10:04:02Z",
      "created_at": "2026-02-28T11:53:14Z",
      "owner_type": "User",
      "updated_at": "2026-06-29T06:12:42Z",
      "description": "Per-project, git-backed knowledge base for AI agents. Share research, decisions, and reasoning across your team's Claude / Cursor / Codex sessions via MCP.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Sugih Ahmad Fauzan",
      "type": "User",
      "login": "sugihAF",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/44539943?v=4",
      "created_at": "2018-10-28T05:18:04Z",
      "is_verified": null,
      "public_repos": 20,
      "account_age_days": 2824
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-06T10:05:20Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-24T16:00:00Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-02T08:45:06Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e183d024dbd54b077e0adc04feca8486d244df94",
          "body": "The AWS migration moved the dashboard off contexo-web.pages.dev to app.contexo.live. Update DefaultDashboardURL plus the --dashboard help text, the onboarding hint, and the browser-login test so ctx login opens the live app.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): point default dashboard URL at app.contexo.live",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-29T03:13:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06ed7d67dae3e76b489dcf849b2beed5fdef3be2",
          "body": "Extend Contexo's agent integration beyond Claude Code to Cursor and Codex.\n\nMCP wiring (all three agents):\n- new internal/cli/agentwire package: per-tool MCP config writers + detection\n- ctx mcp install/uninstall/status --tool=claude|cursor|codex|all, ctx mcp guide\n- ctx init auto-wires Cursor (.cur\n[…]\nocs/usage updated. Full unit coverage; MCP path E2E-validated against\na real Codex on Linux; Codex+Cursor capture validated end-to-end locally.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agents): cross-tool MCP + capture for Cursor and Codex",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-24T15:58:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d88bbf4cc672e7eac85ba347cc6bbe532b1b30a",
          "body": "…setup\n\n- rm docs/migration.md, docs/mvp-build-sequence.md (+ README links)\n- usage.md: Docker compose quick-start (Part 1.2), OAuth/PAT/invite auth,\n  SQLite userstore, prebuilt install + ctx update, 8 MCP tools,\n  members/activity/diff, merge/drift flow, CORS env var\n- vision.md: config/credentials split, SQLite store, identity-based\n  authorship, hosted dashboard, auth boundary\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: retire MVP docs; sync usage+vision to current impl; add Docker …",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-23T10:55:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f24aa36f41f004f14babf6b9da168c811cc4a62d",
          "body": "License (MIT), latest GitHub release, contexo.live, and the X account\n@Contexo_live, in the flat badge-row style. Swapped out the non-applicable\npypi/crates.io/arXiv badges since Contexo is a Go project.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): add badge row under hero (license, release, site, X)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-23T08:07:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f839a1ef5964f1717cb6eb84f62e7ddf0475231c",
          "body": "The page-content sanitizer was stripping U+200C/U+200D (zero-width\nnon-joiner/joiner) and the LTR/RTL marks, which are legitimate in emoji\nZWJ sequences and Persian/Arabic/Indic text — corrupting valid content.\nNarrow the strip set to the genuinely dangerous invisibles: zero-width\nspace, bidi overrides/isolates (Trojan Source), and BOM. ANSI/control\ncodes are still removed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "sanitize: keep ZWJ/ZWNJ joiners (only strip dangerous invisibles)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-13T14:10:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7dd3d7c24fa3dda208188d33677575fbf038a589",
          "body": "…dos-controls\n\nHarden page-path handling + add DoS controls (security)",
          "is_bot": false,
          "headline": "Merge pull request #1 from sugihAF/security/page-path-validation-and-…",
          "author_name": "Sugih Ahmad Fauzan",
          "author_login": "sugihAF",
          "committed_at": "2026-06-13T13:18:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a84c27c94b001f1845adfdc0d036f48ae48775e8",
          "body": "- strip prompt-injection obfuscation (ANSI/control codes, Unicode bidi\n  overrides, zero-width characters) from page content on every agent-facing\n  path (serve, search, pull-to-disk).\n- prepend a provenance/containment banner to each served page surfacing the\n  author and framing the content as reference data, not instructions.\n- note in the ctx_pull description that pulled pages are untrusted.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "harden shared-page handling against context poisoning",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-13T13:16:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dbb9ce279b2dec91e35463760e34fea704d5855e",
          "body": "- updater: verify a minisign signature over checksums.txt against a pinned\n  public key when one is configured (refuse unsigned releases); falls back to\n  checksum-only verification until a key is pinned, so existing releases keep\n  working.\n- install.sh: fail closed (die, with an openssl fallback) \n[…]\nal minisign check.\n- goreleaser: minisign-sign checksums.txt (skipped cleanly when no key is set).\n- CI: pin all GitHub Actions to commit SHAs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "sign release checksums + harden install/CI supply chain",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-13T13:16:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b27340c79bd648b731052b55cfca827d35284dc2",
          "body": "Server-side hardening for the multi-tenant sync path.\n\n- gitstore: validate page paths (reject traversal, absolute, \".git\" and\n  control-byte segments) and revisions (hex object ids only); add \"--\"\n  separators on git invocations. Reachable via push/pull/diff over the\n  CLI, MCP, and HTTP API.\n- sch\n[…]\nthe server bind loopback behind Caddy.\n\nAdds regression tests for the path/ref validators, slug validation, the\nrate limiter, and the body cap.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "harden page-path handling and add DoS controls",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-13T12:07:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c94844078fabcb043a910b76aded1eb6bf30b34",
          "body": "Open-core seam for hosted usage limits, enforced across every repo-creation\npath so the cap can't be bypassed by switching clients.\n\n- public `quota` package (Policy/LimitError/Unlimited); OSS/self-host injects no\n  policy and stays uncapped — caps live only in the private overlay\n- enforce free-tie\n[…]\n WithRootRegistrar (root seam for an\n  unauthenticated Stripe webhook), WithQuota\n- ctx push / ctx join surface a 402 as a clean upgrade prompt\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): pricing quota seam + caps + CLI/MCP gating (Phase 17)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-07T17:35:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1766f1db931d559e130d251e89f61ff2b899c95c",
          "body": "Go module paths are case-sensitive and must match go.mod, which declares\nthe module as lowercase `github.com/sugihAF/contexo`. The README \"With Go\"\ninstruction and the `ctx update` dev-build hint both printed the repo-cased\n`github.com/sugihAF/Contexo/cmd/ctx@latest`, which fails to resolve:\n\n    mo\n[…]\nihAF/contexo\n            but was required as: github.com/sugihAF/Contexo\n\nLowercase both so `go install` resolves against the published module.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): use lowercase module path in `go install` hints",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-03T08:16:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "370790301c85492cb08d030eab261f4d66221463",
          "body": "Self-contained animated SVG hero (.github/assets/contexo-hero.svg) embedded at the top of the README, plus the new ctx update/version commands listed in the CLI quick-reference.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): animated hero banner + ctx update/version in CLI reference",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-02T14:20:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1535705f4b120519dfaf472e65f5095c42c9660",
          "body": "Prebuilt-binary distribution so users no longer need a Go toolchain, plus in-place self-update and an update-available nudge.\n\n- internal/version: build-stamped version; ctx version + ctx --version\n- internal/updater: GitHub latest-release lookup, asset selection, SHA-256 verification, tar.gz/zip ex\n[…]\nm-verified binary instead of go install\n- .goreleaser.yaml + release workflow: tag v* -> cross-compiled binaries + checksums on GitHub Releases\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): Go-free install + ctx update self-updater (Phase 16)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-02T08:43:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1bc20aa937c9602831ed9ffb1e9eaa2aaba9d5f5",
          "body": "Extract the server bootstrap into a public app package (app.Run(extras ...Registrar)) and make NewRouter accept variadic route registrars, so a private overlay (contexo-backend) can mount cloud-only routes without importing Contexo internals. cmd/contexo-server calls app.Run() with no extras and behaves identically.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(server): open-core app.Run seam (Phase 15)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-01T14:38:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a877df5c302b6768764955dfe6787f61886aece",
          "body": "ctx members (list/remove) and ctx activity, backed by a new repo_activity table. Push/pull are recorded on the sync handlers; pulls only when pages change. Push detail carries the committed paths; pull detail records the calling agent (the CLI sends ctx-cli; the MCP server forwards the initialize clientInfo.name). The activity endpoint paginates (limit/offset + total). Adds a shared repoClient() preflight for repo-scoped subcommands.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): repo members CLI + activity feed (Phase 14)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-06-01T11:29:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb905dba013ce5bbcb0af6185236633cfed12afd",
          "body": "Bug: a teammate's push showed up in the dashboard as author \"unknown\"\neven though they were signed in. Root cause: the Push handler defaults\nmissing AuthorName/AuthorEmail to the literal string \"unknown\" and\nthe older CLI paths (manual PAT paste, legacy CONTEXO_API_KEY, any\nbinary predating the brow\n[…]\nields are immutable). A\nre-push of the same page from an authenticated session will produce\na new commit with correct attribution.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(server): fall back to authenticated user identity on push (Phase 13)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T15:36:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22536a181d89691772851717ae80c9e60cfc16da",
          "body": "ctx_push 409 stops dumping conflict JSON and aborting; instead returns\na <MERGE_REQUIRED> directive that gives the agent the three versions\n(ancestor, yours, server's current) plus per-side section diffs and a\nlist of conflicting sections — everything needed to reconcile.\n\nAgent-visible (excerpt):\n\n\n[…]\nse.\n\nThat closes Bucket A items 1 and 2. Item 3 (M5 dashboard view) is\nfrontend work that lives in the contexo-web repo, not here.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): AI-assisted merge directive on push 409 (Phase 12, Layer 4)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T14:16:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e572cc1ad787a49ba6dfb009598d3c016ce3003",
          "body": "…r 3)\n\nWhen the agent reads ctx://wiki/<slug> via MCP and the page has changed\non the server since the local last_pulled sha for that path, the\nresponse is prefixed with a <DRIFT_NOTICE> block that summarizes what's\nnew. The agent learns about drift BEFORE it edits — no more reading a\nstale snapshot\n[…]\nMCP check entirely.\n\nLayer 4 (AI-assisted merge on 409 push) is the next phase — uses the\nsame diff primitives, different trigger.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): pre-edit drift awareness on MCP page reads (Phase 11, Laye…",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T14:11:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "85e39f0cf9b0b39a0b57561e69af30591596d545",
          "body": "Bucket B's biggest item: each section in a diff response can now be\nannotated with the commit that originally introduced its heading.\nCloses the \"who wrote this section?\" question without requiring the\ncaller to cross-reference ctx_history + ctx_diff by hand.\n\nOutput (text):\n  ~ ## Decision (3 lines\n[…]\ns Bucket B + C from the inventory. Bucket A (Layer 3\npre-edit awareness, Layer 4 AI-merge, dashboard view) is the next\ndiscussion.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(diff): per-section author blame (Phase 10)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T13:03:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84bbf4e41ead1f2b5b487caddef8e735aca6dc9b",
          "body": "…Phase 9)\n\nThree polish items from the Bucket C list, bundled into one phase\nbecause they're all small differ/handler quality improvements with no\nnew surface.\n\n1. Deleted-on-server case\n   handler_diff.go used to 404 if EITHER side's sha didn't contain the\n   path. New behavior: tolerate path-absen\n[…]\nedBetweenShas with a deleteFileInRepo helper\n    (shells out to git directly since gitstore doesn't expose a\n    delete primitive)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(diff): handle page deletion + typed scalars + multiline values (…",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dfc30221ff7c4973eb0042b7a2e2a6f0c834a3ab",
          "body": "Bucket B #2: heading changes no longer show as remove+add.\n\nBefore:\n  Sections\n    - ## Decision (5 lines removed)\n    + ## Final Decision (5 lines added)\n\nAfter:\n  Sections\n    ~> ## Final Decision  (renamed from \"## Decision\")\n\nHow it works:\n  - Main pass identifies adds and removes by heading ide\n[…]\nal/cli/push_preview.go\n  - summarizeDiff includes \"~> <heading>\" in the per-page push preview\n    so the rename shows up there too\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(diff): section rename detection (Phase 8)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:53:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c6037527d982aa97ed28f5c4d4da6a581e6b1e06",
          "body": "Bucket B #1: `ctx evolution <slug>` returns every commit touching the\npage paired with that commit's section-aware diff against its prior\nversion. Replaces (1 history call + N diff calls) with a single round\ntrip when the caller wants the whole trajectory.\n\nNew HTTP endpoint:\n  GET /v1/repos/:id/evo\n[…]\ns → 3 entries, each with diff\n  - missing path → 404\n\nREADME.md\n  - CLI table grows by one row; MCP tools list gains ctx_evolution\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(evolution): combined history+diff in one round-trip (Phase 7)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:51:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2876435c905e593a6425b0d6d2ba5e05df3581d9",
          "body": "Two small ergonomic gaps from the Phase 5 review:\n\n1. `ctx diff <slug> --local` — diff your local .contexo/ copy against\n   the server's HEAD for the same page. Same computation the push\n   preview does, surfaced as a standalone command so you can ask\n   \"what would my push change?\" without actually\n[…]\nchanges sent)\" footer\n  - --dry-run --no-preview restores the old path/parent-only listing\n    for users who want zero round-trips\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ctx diff --local + push --dry-run preview (Phase 6)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:41:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7dae99971df9066ca597f2dbd2859162a20a7574",
          "body": "Heads-up at push time: if a file in the batch already exists on the\nserver, show what your push will change before sending. Lightweight —\nnot a merge gate, just awareness so you don't ship a rewrite of\nsomeone else's work without realizing.\n\nSample output:\n\n  About to push 3 page(s) to chompchat:\n  \n[…]\nbefore editing,\nand an MCP confirmation handshake would just slow them down. The\npreview is a human-in-the-loop guard for the CLI.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): pre-push diff preview + confirmation (Phase 5)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:31:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4179f009837cf8c9f21d66afffb9ca70a9340d16",
          "body": "Lands the killer use case for the diff/history feature: agents can now\nsee a page's evolution before editing it, not just the snapshot. When\nthe user says \"edit the stripe-subscription page to add discount\nhandling,\" the agent can call ctx_diff first to see how tax and\nplatform-fee handling were add\n[…]\nto-injection\nof diffs when local is stale) and Layer 4 (AI-assisted merge on 409\npush) are explicitly deferred to follow-on specs.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): ctx_history + ctx_diff tools (Phase 4)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:03:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "936f276a9a554aa6a8f5460cf39b9e78bb637981",
          "body": "Surfaces the diff/history server from Phase 2 in the terminal. A dev\ncan now ask `ctx diff stripe-subscription` and see how the page\nevolved without ssh'ing to the server or piecing together `git log`\noutput.\n\ninternal/cli/slug.go (+ test)\n  - Shared resolver: <slug> -> .contexo/-relative path. Scan\n[…]\ns self-documenting.\n\nPhase 4 will expose the same two queries over MCP so the agent can\nread a page's evolution before editing it.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ctx history + ctx diff (Phase 3)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T12:00:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0624d69e44b2c73cad81d01f11a377136f693e77",
          "body": "GET /v1/repos/:id/diff/*path?from=&to= returns the SectionDiff JSON.\nDefaults to \"most recent change for this path\" when neither sha is\ngiven: to=HEAD-for-this-path, from=parent of that commit. This makes\nthe common case (`how did this page just change?`) a single URL with\nno SHA bookkeeping.\n\ninter\n[…]\nry\n    endpoint (previously untested via HTTP)\n\nPhase 3 will add ctx history + ctx diff CLI commands that consume\nthese endpoints.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): /diff endpoint with parent/head defaults (Phase 2)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T11:56:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "680661b2504cee06703583db5b1b35792b4b77b0",
          "body": "The first piece of the page diff & history feature. Adds a prose-aware\ndiffer that splits a page into {frontmatter, preamble, ## sections} and\nreports changes per-field and per-section so a markdown evolution is\nlegible in a way `git diff` is not.\n\ninternal/diff/section.go\n  - PageSections(from, to,\n[…]\n,\nPhase 3 (ctx diff / ctx history CLI), Phase 4 (MCP tools).\n\nSpec: docs/specs/2026-05-24-page-diff-and-history-design.md (local).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(diff): section-aware page differ + gitstore history (Phase 1)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T11:54:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab661810575763e4beedb32049ffbda5fd067b8c",
          "body": "Wrap the existing /v1/repos/:id/invite-keys endpoints in a ctx invite command tree (mint/list/revoke). Sync client gains MintInviteKey, ListInviteKeys, DeleteInviteKey with tests.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ctx invite mint/list/revoke commands",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-24T09:39:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4cb48d3a9b23d0c6d8c49eed45c02b436e5559c2",
          "body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: git-ignore docs/ for local working notes",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-21T13:42:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "77da14b49b3ef8fe8be7861989ea5cd1ec3fb29d",
          "body": "Add owner-gated member removal (the last owner is protected) and a\nmembers listing endpoint. Invite keys now carry a 7-day TTL; a\nmigration adds the expires_at column to existing databases, where\npre-existing keys default to expired.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sharing): member removal + 7-day invite-key expiry (M3)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-21T13:42:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6ab0be9885392aa51c67a7717258b9a16bc02ff7",
          "body": "Agents were defaulting to 'concept' for every page and never writing\n'entity' pages, because nothing in the agent-facing surface told them\nwhen to pick each type. Observed in the chompchat repo: 3 concept pages,\n2 source pages, 0 entity pages.\n\nTwo changes:\n- ctx_write_page tool description now expl\n[…]\nhe batch references, so\n  the entity pages land in the same commit as the concepts. The old\n  STEP 2 (the distill_done re-push) becomes STEP 3.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): nudge agents to author entity pages",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-20T06:07:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ac870774604f2593f20aeec21f65021dde74f26",
          "body": "The CLI list was stale: it still showed the deprecated --api-key login\nexample and didn't mention detach, login, join, hooks, or capture.\nGroup commands by purpose (Setup / Sync / Agent integration) and document\nthe browser-based login as the default.\n\nAdd an Uninstall section pointing at ctx detach for per-project removal\nand `rm $(go env GOPATH)/bin/ctx` for binary removal.",
          "is_bot": false,
          "headline": "docs(readme): refresh CLI command list and add Uninstall section",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-19T14:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e31adcdcd71ec4300067b93b244f9c13502b409",
          "body": "Removes the wiring `ctx init` puts in place (the `contexo` entry in\n.mcp.json, the .contexo/ line in .gitignore, the Stop hook in\n.claude/settings.json) and, by default, deletes the .contexo/ directory\nitself. Pass --keep-knowledge to preserve .contexo/, and -y to skip the\nconfirmation prompt.\n\nSurf\n[…]\n/ has pages that haven't been pushed yet\nso the user can ctx push first instead of losing unpublished work.\n\nAlso adds the project's own .contexo/ to .gitignore now that we dogfood\nthe tool on itself.",
          "is_bot": false,
          "headline": "feat(cli): add `ctx detach` to reverse `ctx init`",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-19T14:24:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "925bc5081acdb538fa26deb01b285af147009150",
          "body": "Closes the gap where ctx login via browser flow saved credentials with\nempty UserName/UserEmail, causing every subsequent push to land on the\nserver attributed to \"\" / \"unknown\" instead of the user.\n\n- runBrowserLogin now returns a BrowserLoginResult{Token, Name, Email}\n  populated from the dashboar\n[…]\ne session\n  identity fills them in. Explicit flags still win.\n\nCompanion dashboard change forwards name+email in the redirect URL.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): browser login round-trips identity (name + email) too",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-19T13:25:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c76f9ae9587fa2149681eceefea2baa42fedf993",
          "body": "`ctx login` with no --token on an interactive terminal now opens the\ndashboard in the user's browser, signs them in (if not already), and\ncollects a freshly-minted PAT back via a loopback redirect. No more\npasting tokens by hand.\n\n- internal/cli/browserlogin.go: opens 127.0.0.1:<random-port>, genera\n[…]\nin page in the contexo-web\nrepo. Asset: contexo-logo.png checked in for reference; the dashboard\nships a copy in its public/ tree.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): browser-based login via loopback redirect",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-18T14:48:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ef9de8b3e2f1bbfa940ae522392106ff015df79e",
          "body": "Removes the separate `ctx remote set <url>` step for the common case.\nSelf-hosted users still override via --server; the dashboard already\nhardcoded the same default so the two sides stay in sync.\n\n- New config.DefaultServerURL constant (shared between CLI surfaces).\n- ctx login: if neither --server nor an existing config.json entry\n  specifies a server, fall back to the default.\n- Help text updated to advertise it.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): default --server to https://api.contexo.live for ctx login",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-18T14:42:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1ea888b026ea85127c6efe63c290a6cc01ee3247",
          "body": "When the user runs `ctx remote set-repo` (no arg) or `ctx login` (no\n--repo) from a TTY, the CLI now fetches their repo memberships from the\nserver and presents an arrow-key picker -- no need to type the repo_id.\nScripts and non-TTY callers keep the old arg-required behavior so\nautomation never hang\n[…]\nture, single dep, Git\n  Bash on Windows OK). huh would be prettier but pulls bubbletea+\n  lipgloss for one picker -- not worth it.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): interactive repo picker for set-repo + login (Phase 2)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-18T14:30:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "742fb2edb9ec3ed39f2d5a2d3f17fa7f112e966b",
          "body": "First-onboarding friction killer: a fresh `go install` leaves the binary\nin $GOPATH/bin which often isn't on the user's PATH yet, so `ctx --help`\nfails with \"command not found\". Now they run one curl/iwr command and\nit Just Works.\n\n- scripts/install.sh — POSIX (macOS, Linux). Detects zsh/bash/fish,\n\n[…]\nten to lead with the scripts; the manual\n  `go install` path is kept as a fallback for users who want to manage\n  PATH themselves.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): one-line install scripts that auto-fix PATH (Phase 1)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-18T14:26:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c58bac7b7ed5d96c170e317d3c15a3e6eb6a376",
          "body": "…tive set-repo)\n\nCaptures the design for two friction-killers based on first-onboarding\nfeedback: a cross-platform install script that handles PATH automatically,\nand an arrow-key picker for ctx remote set-repo / ctx login when no repo\nid is passed.\n\nBrowser-based login (the third feedback item) is intentionally split into\nits own spec — it spans CLI + dashboard + backend and warrants a dedicated\ndesign pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(spec): onboarding UX quick wins design (PATH installer + interac…",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-18T14:22:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6abdb2b70b0377968bcaf58ef2a6898032c1016a",
          "body": "…s to skip)\n\nMatches the existing default-on pattern for .mcp.json and .gitignore: new\nprojects get capture working out-of-the-box, opt-out is a single flag.\nEliminates the easy-to-miss \"ran ctx init but capture isn't actually\non\" footgun.\n\n- New --no-hooks flag mirrors --no-mcp and --no-gitignore.\n\n[…]\nndsurf users know to wire their own.\n- Tests: default-on install, --no-hooks suppression, idempotency across\n  repeated init runs.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ctx init now registers the Stop hook by default (--no-hook…",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-18T05:45:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9d24ce536cc414a2672717d654f2ab467bf3227",
          "body": "Lays the wiring for a future server-side distillation path so callers can\nopt into it without re-plumbing later, but returns \"not implemented\" for\nv1. The agent-as-distiller flow from Phase 1 remains the only path that\nactually distills today.\n\n- POST /v1/repos/:id/sync/distill -> 501 Not Implemente\n[…]\n--fallback-server: placeholder flag that errors with the same\n  message. The contract exists; Phase 4 fills in the implementation.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server,cli): server-side distill fallback stub (Phase 2)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-17T09:29:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3dd9bd04425b8fc2337ef5cbfcec231f679bd657",
          "body": "…Phase 1)\n\nWires the agent-as-distiller flow. When ctx_push runs with a pending\nbuffer and a concept/analysis page in the batch, the tool returns a\nPUSH_PAUSED directive instructing the agent to:\n\n  1. ctx_write_page(type=source, ...) using a structured template\n     (Decision / Why / Rejected alter\n[…]\nound context cost.\n- Loop-protection: distill_done=true with no fresh source page errors\n  with a clear \"write one first\" message.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): ctx_push reasoning-trail handshake + ctx_capture_session (…",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-17T09:28:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "adb92f7654a499d742592f79abff86d3a12fa469",
          "body": "Lays the groundwork for the agent-reasoning-capture feature: a per-session\nJSONL buffer that the Claude Code Stop hook appends to after every\nassistant turn, with no LLM call on the hot path.\n\n- internal/capture: bounded append-only buffer (4KB assistant / 2KB user\n  per-turn truncation, 500-turn ca\n[…]\n marker.\n- docs/specs: design doc capturing the four-phase rollout.\n\nNothing consumes the buffer yet (handshake lands in Phase 1).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(capture): spec + buffer + Stop-hook foundation (Phase 0)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-17T09:28:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8df5c39403478b46312b797922218cef6c3c9349",
          "body": "Rewires the CLI to use the per-user PATs minted from the dashboard, while\nkeeping the legacy shared API key working for back-compat.\n\nCLI changes:\n- ctx login --token <token> (and the alias 'ctx auth login --token'):\n  saves a PAT to .contexo/credentials.json. The interactive prompt now\n  asks for \"\n[…]\nog/MCP push/MCP pull/MCP status) now read\ncreds.Bearer() — they don't care which kind it is, the server already\ndemuxes by prefix.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): personal access tokens + ctx login/join (Phase 2)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-16T06:50:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4801aeaa35a0e51f445720b486290ed399d41a79",
          "body": "Declaring googleVerifier as *auth.GoogleVerifier and leaving it nil meant the\ninterface field on Handler ended up holding (type=*GoogleVerifier, value=nil)\n— non-nil to == nil checks, but any method call would nil-deref. Declare\nthe variable at the interface type so the nil case stays a true untyped nil.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(server): preserve untyped-nil for optional GoogleVerifier",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-16T06:23:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "094fe34869c941b4e8a27133d18ec07dcc77e4c7",
          "body": "…Phase 1)\n\nAdds a SQLite-backed access layer alongside the existing git-backed repo\nstorage, turning Contexo from one-shared-key into a multi-tenant model where\neach user owns or joins specific repos.\n\nServer changes:\n- internal/userstore: new SQLite store for users, personal access tokens,\n  repo_m\n[…]\nver dispatch,\nHTTP-level E2E for Google sign-in + invite-key join + PAT auth + legacy\nback-compat). All existing tests still pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): user accounts, per-repo membership, PATs, invite keys (…",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-16T06:21:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a69ede54a220045f0bb8c09788f6ffc448ff5248",
          "body": "To support the upcoming contexo-web dashboard (separate private repo)\nthe server needs to expose:\n\n  GET /v1/repos                   { repos: [{id, page_count, last_commit}] }\n  GET /v1/repos/:id/pages         { pages: [{path, sha, author, email, time, message}] }\n\nListPages walks `git log --name-on\n[…]\nrs\n- CORS preflight from localhost:5173 returns Allow-Origin\n- CORS from forbidden origin returns no Allow-Origin (browser blocks)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): ListRepos + ListPages endpoints, CORS middleware",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-16T05:17:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6fd7f0ae84fd2755539b875260cd50c3f6a0999d",
          "body": "Code is already pure Go with filepath.Join everywhere, but two gaps\nfor non-Linux developers:\n\n1. README install commands had hardcoded `.exe` extensions, which\n   produces a misnamed binary on macOS/Linux.\n2. CI only verified on ubuntu-latest, so a regression that breaks\n   macOS or Windows could s\n[…]\nocker job stays Ubuntu-only (Docker image is Linux-only by design).\n\nAlso fixed README title duplicate '# Contexo (Contexo)' typo.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci+docs: macOS + Windows in CI matrix; cross-platform install steps",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-15T09:25:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d024eb9677667745744e9e078523ccb5d575b742",
          "body": "Two manual onboarding steps every user was hitting:\n  1. Creating .mcp.json in the project root so AI agents pick up the\n     local Contexo MCP server.\n  2. Adding .contexo/ to .gitignore so per-machine knowledge state\n     isn't accidentally committed to the project repo.\n\nBoth are now done automat\n[…]\nboth (mcp untouched + warning, gitignore appended)\n  - re-run (idempotent, no duplicate entries)\n  - --no-mcp --no-gitignore flags\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(init): auto-create .mcp.json + add .contexo/ to .gitignore",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-15T09:22:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5db9ff4ad4ce55c8a9a7eed4375ee72d9d0d2f4",
          "body": "LICENSE: standard MIT, copyright 2026 sugihAF.\n\n.github/workflows/ci.yml: go vet + go build + go test -race on push to\nmain and on PRs, plus a docker build job to keep the server image\nbuilding.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: MIT LICENSE + GitHub Actions CI",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T10:12:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53cc7d2441c0541d2d40f57917ec4bfc88db94db",
          "body": "The user-facing product name was 'CtxHub' but the repo / Go module was\n'contexo'. Unified on Contexo everywhere now that the project is going\npublic.\n\nRenames:\n- Directory          .ctxhub/                  →  .contexo/\n- Server binary dir  cmd/ctxhub/               →  cmd/contexo-server/\n- Server b\n[…]\n serverInfo.name = \"contexo\"\n- Local layout uses .contexo/ (verified ls)\n- ctx status reports correctly against the contexo-server\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "rename: CtxHub → Contexo (product name harmonized across codebase)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T10:11:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1c1dfd42c012f404963e96ba685a2be0225ac89",
          "body": "Old Dockerfiles assumed CGO + Postgres + MinIO from the pre-pivot MVP-1.\nNone of that is needed anymore.\n\ndocker/Dockerfile.ctxhub:\n- Multi-stage: golang:1.23-alpine builder → alpine:3.20 runtime\n- CGO_ENABLED=0 static binary, -ldflags=\"-s -w\" to strip\n- Runtime image installs git + ca-certificates \n[…]\nockerfile.ctx: clients run ctx locally, not in a\ncontainer.\n\nVerified: docker build + run + push + read-back + timeline all green.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docker: refresh for the new architecture (single binary + git)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T09:42:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "76b23dfe249774412598875c00524655148ae9b3",
          "body": "docs/usage.md covers:\n- Part 1: server setup (build, run, what state lives where, nginx, key)\n- Part 2: per-dev onboarding (init, remote/auth, .mcp.json wiring,\n  pull existing)\n- Part 3: daily flow — Dev A researches → agent calls ctx_write_page +\n  ctx_push → Dev B pulls → Dev B's agent reads ctx:\n[…]\nd merge)\n- Part 5: troubleshooting matrix\n- Part 6: what CtxHub deliberately is NOT\n\nREADME points at usage.md as the entry point.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: end-to-end usage walkthrough (admin + developer + daily flow)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T09:06:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f69a25c9678f066792a51ad0c736c8c3a980160a",
          "body": "Deleted:\n- internal/recorder/ — raw transcript daemon (agent writes pages now)\n- internal/redaction/ — pattern-based redactor (distilled pages don't\n  capture secrets in the first place)\n- internal/adapter/{claudecode,codex,vscode} — source-specific event\n  normalizers (markdown is source-agnostic)\n\n[…]\nence pointing at\ndocs/{vision,migration,mvp-build-sequence}.md.\n\nAll tests still pass (schema, pagestore, indexer, mcp, gitstore).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove superseded MVP-1 code; tighten the surface",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:58:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b6f1312bb7c9f188bde9975cd523d51a0b0ffda",
          "body": "Adds 4 MCP tools so the agent can drive sync from natural language:\n  ctx_push         filter by feature/tag/type, send to server\n  ctx_pull         pull changes, write to disk, regen index\n  ctx_status       show local vs server state\n  ctx_write_page   create a page with frontmatter + body in one \n[…]\n  Dev B: ctx_pull → ctx_status → resources/read on the page\n  Both sides see correct author, frontmatter, Agent Reasoning section.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): agent-invokable tools — push/pull/status/write_page",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:56:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d619f985562d70e93c3925f5a1361207fb00a73a",
          "body": "status: shows init state, server URL, repo, auth, user, local page count,\nlast pull sha, and pages-never-pushed count. Hits the local pagestore and\nsync state sidecar — no server call required.\n\nlog: hits /v1/repos/:id/timeline via sync.Client.Timeline and prints\n'short_sha  date  author  message' per commit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ctx status + ctx log over the new .ctxhub layout",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:54:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6946fa75bba5d17c995173871ef89cc939047a60",
          "body": "- sync/payloads.go: wire types shared by client and server handler\n- sync/state.go: .ctxhub/.sync/state.json sidecar tracks per-page\n  parent_sha and last_pull_sha for the client; frontmatter parent_sha\n  remains documentation-only so push/pull doesn't cause file churn\n- sync/client.go: CreateRepo, \n[…]\n serves\nthe page (with Agent Reasoning section intact) to Dev B's agent.\nServer timeline shows correct author + email + timestamp.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ctx push/pull, auth, remote against the new server",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:52:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f747a96b3dd75a2caa67029af981329d21910ae8",
          "body": "New endpoints under /v1 (bearer-key middleware):\n- POST   /repos/:id                       create repo (git init)\n- GET    /repos/:id/pages/*path           read page + X-Page-SHA header\n- POST   /repos/:id/sync/push             bulk push with per-file parent_sha\n- GET    /repos/:id/sync/pull?since=<\n[…]\nstable wire format.\n\nVerified end-to-end via curl: push, read-back, timeline, pull, conflict\non stale parent_sha, 401 on bad auth.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): git-backed HTTP endpoints + ctxhub binary wiring",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:47:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e99e58436f8880c3f60ea172883468e00efd16d",
          "body": "Wraps the system git binary via os/exec. Per repo_id directory holds a\ngit working repo. Write commits the file with --author override and\nreturns the new sha; if parent_sha is provided and doesn't match the\nlast commit that touched the file, returns ErrConflict with the\ncurrent sha and content for \n[…]\nction, log + log-path, changed-since with empty and non-empty\nsince, not-found, uninitialized repo rejection, repoID sanitization.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(gitstore): server-side git-backed page store",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:46:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b4bdf45618c73e499ef2f19d220be66074bddd6",
          "body": "New resource templates: ctx://index, ctx://tags, ctx://wiki/{slug},\nctx://raw/{session-id}, ctx://search?q&type&tag. HubServer reads the\nlocal pagestore and returns serialized markdown (frontmatter + body)\nto MCP clients.\n\nCLI mcp.go now constructs HubServer from .ctxhub/ pagestore. Old\nmcp.Server i\n[…]\nerified end-to-end via stdio JSON-RPC: initialize, resources/list,\nresources/read all return correct payloads.\n\nTests: 10 passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): HubServer serves .ctxhub/ pages over stdio",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:43:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0140e601df21f73c13bd940f2ea43cd6a12c0446",
          "body": "Walks the pagestore, groups entries by type (Concepts/Entities/Analyses/\nSources), uses reasoning_summary or first body sentence for the\ndescription, and emits a tag index keyed by tag.\n\nEmpty sections render as '(none yet)' so the index is always usable as\nthe always-loaded resource even on a fresh repo.\n\nTests: 3 passing — full generate, empty store handling, title slug\ntransform.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(indexer): regenerate .ctxhub/index.md and tags.md from pages",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:42:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f76422d1862819aa163eac8a37cb358472e9cc9d",
          "body": "ctx init now creates wiki/{concepts,entities,analyses}/, raw/sessions/,\nconfig.json, plus seed index.md and tags.md. Idempotent.\n\nConfig: adds CtxhubDir, CtxhubDirPath, LoadHub, SaveHub, DefaultHubConfig\nalongside legacy .ctx helpers (legacy kept until old CLI is removed).\nNew Config.LastPullSHA field for tracking pull state.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(init): create .ctxhub layout instead of .ctx/sqlite/boltdb",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:39:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e75146ed31ffb8c1f92d743ec4753ceb3a377ab",
          "body": "Store wraps a .ctxhub/ root. Write computes the file path from the\npage's type+slug. Read takes a forward-slash relative path. FindBySlug\nscans known type dirs. List+Walk filter by type and tags. Skips top-\nlevel index.md and tags.md during walks; tolerates malformed pages by\nskipping rather than aborting.\n\nTests: 4 passing — roundtrip, slug-across-types, list filters, walk\nexclusions.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pagestore): local read/write/list over .ctxhub/ tree",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:36:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b6c15f91638052b5378d22138b55f3a84925f355",
          "body": "Defines Page struct with PageFrontmatter (schema, slug, type, author,\nagent, created, updated, parent_sha, sources, related, tags,\nreasoning_summary). Parser accepts LF or CRLF input; serializer always\nemits LF. Validate enforces required fields and known PageType.\n\nTests: 4 passing — roundtrip, CRLF parse, validation cases, RelPath\nmapping per type.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(schema): ctx.page.v1 with frontmatter parser/serializer",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:35:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51f80437994f509060932ec4fb84c396db1b78d2",
          "body": "Locks in the current state before the architecture pivot described in\ndocs/vision.md. This snapshot includes:\n\n- CLI (18 commands): init, capture, session, commit, log, show, link,\n  context, blame, push, pull, mcp, remote, auth, status, config,\n  open-session, codex\n- Server: Gin router with orgs/r\n[…]\nsis.md.\n\nMost of this will be deleted or heavily refactored in the upcoming work;\nsee docs/migration.md for the file-by-file plan.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "checkpoint: MVP-1 baseline (JSONL recorder + SQLite commit store)",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:33:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1156aa0555ad064edbe04e5ba172f44be6455df6",
          "body": "Pivots CtxHub from JSONL-recorder + structured-commit-JSON to per-project\nmarkdown wiki + git-backed server. Captures the agent-reasoning layer and\nthe explicit AI-triggered sync model.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: vision, migration plan, MVP build sequence",
          "author_name": "sugihAF",
          "author_login": "sugihAF",
          "committed_at": "2026-05-14T08:33:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70509fa5ec6f4300b8fcce34ceb20d58d530f223",
          "body": null,
          "is_bot": false,
          "headline": "Initial commit",
          "author_name": "Sugih Ahmad Fauzan",
          "author_login": "sugihAF",
          "committed_at": "2026-02-28T11:53:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 68,
      "latest_release_at": "2026-07-06T10:05:20Z",
      "latest_release_tag": "v0.5.1",
      "releases_from_tags": false,
      "days_since_last_push": 15,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 15,
      "mean_days_between_releases": 17
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/sugihAF/contexo",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/sugihAF/contexo",
          "is_deprecated": false,
          "latest_version": "v0.5.1",
          "repository_url": "https://github.com/sugihAF/contexo",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-06-29T03:13:11Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 23
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-05-20",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 33610,
      "source_files_sampled": 151,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "aead.dev/minisign",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.0"
        },
        {
          "name": "github.com/AlecAivazis/survey/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.7"
        },
        {
          "name": "github.com/gin-gonic/gin",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.0"
        },
        {
          "name": "github.com/golang-jwt/jwt/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.3.1"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/minio/selfupdate",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.6.0"
        },
        {
          "name": "github.com/pkg/browser",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20240102092130-5ac0b6a4141c"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.1"
        },
        {
          "name": "golang.org/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.27.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.50.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": 1,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "sugihAF",
          "commits": 68,
          "avatar_url": "https://avatars.githubusercontent.com/u/44539943?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": 10,
            "reason": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
            "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/27 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 5,
            "reason": "dependency not pinned by hash detected -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "33 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e183d024dbd54b077e0adc04feca8486d244df94",
        "ran_at": "2026-07-22T08:41:00Z",
        "aggregate_score": 3.6,
        "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-06T10:05:23Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-06-13T13:18:48Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/sugihAF/Contexo",
    "host": "github.com",
    "name": "Contexo",
    "owner": "sugihAF"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 53,
      "inputs": {
        "security": 36,
        "vitality": 73,
        "community": 24,
        "governance": 50,
        "engineering": 75
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "commits_last_year": 68,
              "human_commit_share": 1,
              "days_since_last_push": 15,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 15 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "68 commits in the last year",
                "points": 16.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 68
                    }
                  }
                ],
                "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": 3,
              "latest_release_tag": "v0.5.1",
              "releases_from_tags": false,
              "days_since_latest_release": 15,
              "mean_days_between_releases": 17
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 15 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~17 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "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": "below_threshold"
            },
            "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "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": 0,
                "status": "missed",
                "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": 50,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "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": 72,
            "inputs": {
              "merged_prs": 1,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "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": "1/1 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/27 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 42,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "sugihAF",
              "public_repos": 20,
              "account_age_days": 2824
            },
            "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": "1 followers of sugihAF",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "sugihAF"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "20 public repos, account ~7 yr old",
                "points": 21.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 20
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/sugihAF/contexo"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 23
            },
            "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 23 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 23
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": 75,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "ai",
                "claude",
                "context-engineering",
                "developer-tools",
                "go",
                "golang",
                "mcp"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.6
            },
            "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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/27 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 5",
                "points": 2.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "33 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 68,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.985,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "67 of 68 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 68
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.941,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "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": "64 of the last 68 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 64,
                      "sampled": 68
                    }
                  }
                ],
                "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 5",
                "points": 5,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 33610,
              "source_files_sampled": 151,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/151 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 151,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T08:41:08.032584Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sugihAF/Contexo.svg",
  "full_name": "sugihAF/Contexo",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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