JSON-Rohbericht maschinenlesbar
{
"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"
}