JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 2150,
"has_wiki": true,
"homepage": "https://educentr.github.io/go-project-starter/",
"languages": {
"Go": 625687,
"Shell": 8730,
"Makefile": 6850,
"Dockerfile": 1485,
"Go Template": 341586
},
"pushed_at": "2026-07-17T11:29:24Z",
"created_at": "2025-10-01T04:33:13Z",
"owner_type": "Organization",
"updated_at": "2026-07-17T11:22:39Z",
"description": "Fast and easy start you go project",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": null,
"primary_language": "Go",
"significant_languages": [
"Go",
"Go Template"
]
},
"owner": {
"blog": null,
"name": "Educentr",
"type": "Organization",
"login": "Educentr",
"company": null,
"location": null,
"followers": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/170362089?v=4",
"created_at": "2024-05-20T18:43:49Z",
"is_verified": null,
"public_repos": 18,
"account_age_days": 792
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "v0.26.1",
"kind": "patch",
"published_at": "2026-07-17T11:29:37Z"
},
{
"tag": "v0.26.0",
"kind": "minor",
"published_at": "2026-05-29T16:16:39Z"
},
{
"tag": "v0.25.1",
"kind": "patch",
"published_at": "2026-05-25T17:05:57Z"
},
{
"tag": "v0.25.0",
"kind": "minor",
"published_at": "2026-05-25T14:57:26Z"
},
{
"tag": "v0.24.1",
"kind": "patch",
"published_at": "2026-05-14T16:58:53Z"
},
{
"tag": "v0.24.0",
"kind": "minor",
"published_at": "2026-05-03T08:52:31Z"
},
{
"tag": "v0.23.1",
"kind": "patch",
"published_at": "2026-05-02T15:53:40Z"
},
{
"tag": "v0.23.0",
"kind": "minor",
"published_at": "2026-04-14T11:35:07Z"
},
{
"tag": "v0.22.1",
"kind": "patch",
"published_at": "2026-04-13T18:16:35Z"
},
{
"tag": "v0.22.0",
"kind": "minor",
"published_at": "2026-03-23T17:34:33Z"
},
{
"tag": "v0.21.0",
"kind": "minor",
"published_at": "2026-03-15T20:10:44Z"
},
{
"tag": "v0.20.3",
"kind": "patch",
"published_at": "2026-03-15T18:26:13Z"
},
{
"tag": "v0.20.2",
"kind": "patch",
"published_at": "2026-03-13T20:58:03Z"
},
{
"tag": "v0.20.1",
"kind": "patch",
"published_at": "2026-03-10T23:49:03Z"
},
{
"tag": "v0.20.0",
"kind": "minor",
"published_at": "2026-03-03T11:47:38Z"
},
{
"tag": "v0.19.0",
"kind": "minor",
"published_at": "2026-03-03T11:18:51Z"
},
{
"tag": "v0.18.0",
"kind": "minor",
"published_at": "2026-03-01T15:43:22Z"
},
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2026-02-28T20:16:48Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-02-25T06:57:33Z"
},
{
"tag": "v0.15.1",
"kind": "patch",
"published_at": "2026-02-20T23:33:25Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-02-20T22:38:09Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-02-19T01:30:29Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-02-18T17:37:40Z"
},
{
"tag": "v0.12.3",
"kind": "patch",
"published_at": "2026-02-18T00:39:35Z"
},
{
"tag": "v0.12.2",
"kind": "patch",
"published_at": "2026-02-10T17:21:08Z"
},
{
"tag": "v0.12.1",
"kind": "patch",
"published_at": "2026-02-05T23:05:39Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-02-04T22:06:25Z"
},
{
"tag": "v0.11.7",
"kind": "patch",
"published_at": "2026-02-03T11:20:04Z"
},
{
"tag": "v0.11.6",
"kind": "patch",
"published_at": "2026-02-03T10:45:40Z"
},
{
"tag": "v0.11.5",
"kind": "patch",
"published_at": "2026-02-03T09:18:49Z"
},
{
"tag": "v0.11.4",
"kind": "patch",
"published_at": "2026-01-28T19:05:18Z"
},
{
"tag": "v0.11.3",
"kind": "patch",
"published_at": "2026-01-28T13:21:13Z"
},
{
"tag": "v0.11.2",
"kind": "patch",
"published_at": "2026-01-27T12:47:44Z"
},
{
"tag": "v0.11.1",
"kind": "patch",
"published_at": "2026-01-23T01:21:29Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-01-21T00:02:45Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-01-20T11:25:21Z"
},
{
"tag": "v0.9.3",
"kind": "patch",
"published_at": "2026-01-20T01:41:22Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-01-20T00:24:20Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-01-15T12:57:41Z"
},
{
"tag": "v0.6.2",
"kind": "patch",
"published_at": "2026-01-14T17:14:24Z"
},
{
"tag": "v0.6.1",
"kind": "patch",
"published_at": "2026-01-13T12:47:58Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-01-13T07:05:23Z"
},
{
"tag": "v0.5.17",
"kind": "patch",
"published_at": "2025-12-25T13:34:21Z"
},
{
"tag": "v0.5.16",
"kind": "patch",
"published_at": "2025-12-24T18:39:17Z"
},
{
"tag": "v0.5.14",
"kind": "patch",
"published_at": "2025-12-22T18:41:42Z"
},
{
"tag": "v0.5.13",
"kind": "patch",
"published_at": "2025-12-22T15:17:26Z"
},
{
"tag": "v0.5.11",
"kind": "patch",
"published_at": "2025-12-19T12:22:07Z"
},
{
"tag": "v0.5.7",
"kind": "patch",
"published_at": "2025-12-15T19:37:11Z"
},
{
"tag": "v0.5.2",
"kind": "patch",
"published_at": "2025-12-12T14:23:39Z"
},
{
"tag": "v0.5.1",
"kind": "patch",
"published_at": "2025-12-10T20:56:59Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2025-12-10T08:38:07Z"
},
{
"tag": "v0.4.2",
"kind": "patch",
"published_at": "2025-12-08T18:30:31Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2025-12-08T17:28:40Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2025-12-05T10:41:40Z"
},
{
"tag": "v0.3.3",
"kind": "patch",
"published_at": "2025-12-04T15:32:27Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2025-12-04T10:27:37Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2025-12-03T15:28:15Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2025-12-02T02:10:03Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2025-11-30T01:31:44Z"
},
{
"tag": "v0.1.20",
"kind": "patch",
"published_at": "2025-11-21T14:00:44Z"
},
{
"tag": "v0.1.19",
"kind": "patch",
"published_at": "2025-11-21T11:18:04Z"
},
{
"tag": "v0.1.18",
"kind": "patch",
"published_at": "2025-11-14T16:27:43Z"
},
{
"tag": "v0.1.15",
"kind": "patch",
"published_at": "2025-11-12T07:59:18Z"
},
{
"tag": "v0.1.12",
"kind": "patch",
"published_at": "2025-11-11T19:49:20Z"
},
{
"tag": "v0.1.9",
"kind": "patch",
"published_at": "2025-11-06T09:46:32Z"
},
{
"tag": "v0.1.7",
"kind": "patch",
"published_at": "2025-11-03T16:33:48Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2025-10-15T09:30:16Z"
}
],
"recent_commits": [
{
"oid": "a4788e22c2710830649ab5571c43a3295821ee85",
"body": "fix(makefile): repair covdata guard, use compose v2, run argen via go run",
"is_bot": false,
"headline": "Merge pull request #31 from Educentr/fix/makefile-covdata-compose-argen",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-07-17T11:22:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5e31d04399c37324b0890e63647d903aec7bf77",
"body": "… run\n\nFixes three independent defects in the generated Makefile (#30):\n\n1. The covdata preflight check used `go tool covdata help`, but covdata has\n no `help` selector — it exits 2 with \"missing command selector\" even on a\n full toolchain. The negated probe was therefore always true, so the\n \n[…]\nhich prescribed the broken\n`go tool <X> help` probe as the recommended preflight check — the template\nwas just its first consumer.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(makefile): repair covdata guard, use compose v2, run argen via go…",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-07-17T09:17:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "09e1835fed12e748366b77f46a0724b48fcb6586",
"body": "Feat/static file transport",
"is_bot": false,
"headline": "Merge pull request #26 from Educentr/feat/static-file-transport",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-29T16:13:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "198f521740bd1a2630175fe5ae1de127390e3f64",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: ignore .codegraph/ and .cursor/",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-29T16:05:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "645301dc5ce699c25f20f7868307845470eeae0c",
"body": "Add a new REST template transport (generator_type: template,\ngenerator_template: static) that serves files from a project folder over\nHTTP without any authorization, at /static/<path>.\n\n- Own no-auth HTTP server (mw.EmptyMiddlewares), like sys, on its own port\n- Files served from filesystem via http\n[…]\nore paths\n- Docs, example, and tests (Rest.IsValid, HasStaticTransport/StaticDirs,\n TestGenerateStaticTransport + configs/static)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(transport): add static file server template transport",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-29T16:04:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4714ca3112f57f57ad56683a9d974bf4d9481966",
"body": "Two unrelated post-v0.25.0 failures surfaced in the same CI run:\n\n1. golang.org/x/tools@v0.43.0+ requires Go 1.25.0, so the\n `goimports@latest` install in `test/docker-integration/Dockerfile`\n and the generated `Makefile.tmpl` started failing on the Go 1.24\n baseline. Pin both to v0.42.0 (the \n[…]\nred-spec test sets {svc_a_v1:8081, svc_b_v1:8082, sys_v1:8085}.\n Env vars are emitted in sorted key order for reproducible logs.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: pin goimports and support per-test REST port envs",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-25T16:57:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bc0d3e6736688e1c1dc693ab9879349b01aa9424",
"body": "protoc-gen-go-grpc@v1.6.2 (released 2026-05-07) bumped the required Go\nversion to 1.25.0. Two install sites used `@latest` and started failing\nafter that release:\n\n * test/docker-integration/Dockerfile — base image `golang:1.24-bookworm`,\n breaking the Integration Tests workflow on every push si\n[…]\n to v1.6.1, the last release compatible with Go 1.24. This\nmatches what `@latest` resolved to during the most recent green CI run.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: pin protoc-gen-go-grpc to v1.6.1 for Go 1.24 compatibility",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-25T16:41:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dcce178ceb88d974550517f6d56be7903906d6a8",
"body": null,
"is_bot": false,
"headline": "fix copy ref",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-25T16:09:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "557ced3d15262f714e3f505a3651739eedd99cf8",
"body": "Cross-directory $ref values (e.g. `../common/foo.yml#/X`) in OpenAPI /\nJSON Schema specs break after CopySpecs / CopySchemas because the\ngenerator flattens every input into one target directory. Until now\nconsumers worked around this with hand-rolled post-processing scripts.\n\nAdd `rewrite_refs: true\n[…]\nve\n$ref between them) and asserts both that the rewritten value appears and\nthat the original ../common/ path is gone after regen.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(refrewrite): opt-in $ref rewriter for cross-directory specs",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-25T14:49:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c75fb3545bceb56c8241fa7934cd6f9711274c65",
"body": "Multiple defenses against the auto-toolchain regression class that\ncaused the 1.26.1 bump to silently break integration coverage:\n\n1. Makefile.tmpl: gate `go tool covdata textfmt` in goat-tests behind\n a preflight `go tool covdata help` check. When covdata is missing\n (auto-downloaded toolchain \n[…]\ny itself.\n\ngenerator.go: extend `executable_scripts` post-generate step to chmod\nthe new check script alongside goversioncheck.sh.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: harden Go version policy with covdata fallback and CI check",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-05-14T16:57:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "695271b21f7a05f286323b0672fdbbed08f0e8e6",
"body": "Revert cosmetic Go version bump from e79f163 (go.mod 1.24.4 → 1.26.1,\ndefault golang_version 1.24 → 1.26, plus mirror updates in Dockerfile,\nCI workflow, docs and all test configs). The bump introduced no\nGo-1.26-specific features; max required by direct deps is still 1.24.0\n(github.com/testcontaine\n[…]\nner image to be built via make integration-test, so including\nthem in the default test target made make test fail unconditionally.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: revert Go 1.26.1 bump and exclude docker-integration from make test",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-05-14T16:56:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fe0c8b63104b2f37706cf701f6ebf58a8e908d6a",
"body": "Update default golangci_version from 1.x to 2.1.6 in config defaults,\ninit, example, all test configs, and LLMS template. The Makefile template\nalready used v2 import path but with v1 tag, causing install-lint to fail.\nAdd TestGolangciLintV2Consistency to prevent regression.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: use golangci-lint v2 version with v2 import path (fixes #16)",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-05-14T15:43:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4abd06003475ceeab8cb22efaa7d0183010ea15f",
"body": "feat(specsource): support remote spec sources in path: (git, https)",
"is_bot": false,
"headline": "Merge pull request #22 from Educentr/feat/remote-specs",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-03T08:50:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f57d866342f4f7e874b505c3f396f567a44b0dd",
"body": "Previously CLI commands.yaml (cli.path) and queue worker contracts\n(worker.path for generator_template: queue) only accepted local file\npaths — they're parsed inline during config load, before the main\nresolveAllSources pre-pass that handles REST/gRPC/JSONSchema sources.\n\nAdds a resolveInlineSpec he\n[…]\necs.md, troubleshooting.md, and CLAUDE.md; expanded the\n\"supported sources\" matrix to call out the inline-vs-pre-pass\ndistinction.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(specsource): support remote URIs for CLI and queue worker specs",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-02T18:25:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "684944af13492317abcd920b68a1541c1f5ad253",
"body": "Adds two GOAT-based docker-integration scenarios that exercise the full\ngenerate → make generate → go mod tidy → go build → docker run pipeline\nwith remote spec sources. The fixtures point at example/example.swagger.yml\nin this same public repository (Educentr/go-project-starter @ main), so\nthe test\n[…]\niner,\nwait for /ready) — they exercise the same realistic pipeline as the\nexisting rest-only test, just with a remote spec source.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(specsource): docker-integration tests for remote spec sources",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-02T17:53:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "09e258ec5b60107646da7dbcf8b7536511381367",
"body": "Run the real `go-project-starter` binary against synthetic project.yaml\nconfigs and assert observable behaviour. Uses httptest.NewServer for\ndeterministic HTTP scenarios — no external network dependencies, no\nbuild tags, runs as part of `go test ./test/`.\n\nCoverage:\n - HTTP download lands at api/re\n[…]\nlocal ./relative.yaml regression: copied byte-for-byte as before\n - staging directory under TMPDIR is cleaned up after Generate()\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(specsource): add 10 end-to-end integration tests for remote specs",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-02T17:49:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a933b989ac06cd761b9012d7331af73d86c69c4f",
"body": "Adds a new `internal/pkg/specsource/` package that parses `path:` entries\nin project.yaml as URIs and materializes them under a per-run staging dir\nduring a pre-pass before CopySpecs/CopySchemas. Backward-compatible:\nanything without `://` continues to be treated as a local path.\n\nURI grammar:\n - .\n[…]\n\n\nDocs: docs/configuration/remote-specs.md (new), short pointers in\ntransports.md, regeneration.md, troubleshooting.md, CLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(specsource): support remote spec sources in path: (git, https)",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-02T17:34:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "41b5d7bab23ffdfc109233184e7076a3286b3839",
"body": "Заменили `Capitalize` (cases.Title, сохраняет дефис) на `CapitalizeFirst`\n(делит по `-`/`_` и склеивает PascalCase) для `.ProjectName` в\nшаблонах tests/files/. Без этого проекты с дефисом в main.name\n(например, virtualit-runtime) генерировали невалидный Go-код вида\n`Virtualit-RuntimeConfig`, ломая б\n[…]\ntest\n- CLAUDE.md — раздел Regeneration Behavior с правилом про disclaimer\n marker в env-файлах (ручные блоки только ниже маркера)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: hyphen-safe identifiers in goat-tests templates",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-05-02T15:52:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6bcf4f823e8e338301451f3dc33e307ccaec4ef5",
"body": "ErrorTimeout and NewCycleTimeout in the generated daemon worker are now\noverridable via WORKER_{NAME}_ERROR_TIMEOUT and WORKER_{NAME}_NEW_CYCLE_TIMEOUT\nenv vars. Defaults stay at 10s. Lets goat tests speed up the supervisor loop\nwithout having to wait for the hard-coded 10s NewCycleTimeout between GetTasks\nchecks.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: allow overriding daemon worker loop timers via env vars",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-04-14T11:32:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f4f55609192022c8caf82cb94f7b92a22cfa152e",
"body": "Env-based apps don't rely on OnlineConf for test env vars, so the\ngenerated Makefile no longer emits onlineconf-update-tests or\ngenerate-test-env-<app> for them. Also fix traefik entryPoints\ncasing in compose templates.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: skip onlineconf bootstrap for goat tests when use_envs=true",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-04-13T18:14:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "38a90ba756ef30529471202e864cb557bdd9c664",
"body": "When generating a telegram bot, automatically create a /start command\nwith a welcome handler, so every bot has a working entry point out of\nthe box.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: generate /start command and handler for telegram bot",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-23T17:33:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e79f163ca9da3bd7635c73141b7fb8003211b6ef",
"body": null,
"is_bot": false,
"headline": "go to golang 1.26.1",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-15T20:10:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9a46309ecebb9fac169d2aafc2a548b55d0c935",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add main.ci field documentation",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-15T18:28:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "db3a0de343ea7f092e40fae5394d58dd4d43be7d",
"body": "When ci field is explicitly set to empty array in project.yaml,\nno CI files (.github/workflows/ci_cd.yml, .gitlab-ci.yml) are generated.\nOmitting ci field still generates both (backward compatible).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: support ci: [] to disable all CI file generation",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-15T18:08:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cc9eb32e7537806ad841d290da1c9a9c660903af",
"body": null,
"is_bot": false,
"headline": "update defaultOgenVersion",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-13T20:51:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "abdd5a84058b34306082f47786a8da24f1c5fc50",
"body": null,
"is_bot": false,
"headline": "add goat tests for more then on application",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-10T23:47:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91a9fb8cc0719927f06bf9a12637969c2427d07f",
"body": null,
"is_bot": false,
"headline": "fix goat tests",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-05T13:44:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b0eada9bf58c12ec7522324dc3a6302c337f19c2",
"body": "fix: generate telegram files only when telegram worker is configured",
"is_bot": false,
"headline": "Merge pull request #18 from Educentr/shared_telegram",
"author_name": "Nikolai",
"author_login": "Nikolo",
"committed_at": "2026-03-03T11:41:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e89d36e33b9bec1a800dad992bc9ac3a36ccf9cb",
"body": "…r-marker workaround\n\nDocument required ErrorDefault schema for ogen-based REST generation,\nadd troubleshooting section for ogen compilation errors, and describe\nafter-marker code as a workaround pattern for open issues.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add ErrorDefault schema requirements, troubleshooting, and afte…",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-03-03T11:18:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "67721707ce89539ac0b0df123027bcad5e3ea01f",
"body": "Move COMMIT_MSG to env block in ci_cd.yml template to prevent bash\nfrom interpreting newlines in multiline commit messages (fixes #19).\nUpdate TestGenerateRESTLogrus and TestGenerateRESTTimeouts to reflect\nREST server/mw files moved to runtime.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: CI multiline commit message and update tests for runtime migration",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-03-03T11:18:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "09845098840c6715b949a8883a522c2c0646c522",
"body": null,
"is_bot": false,
"headline": "add ErrNotImplemented",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-02T15:01:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cccb723b51e2e0c841d77ea49ea1fbf091031fde",
"body": null,
"is_bot": false,
"headline": "update docs menu",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-01T16:24:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c803e2583827b0d83b5577033368d038da5acc0e",
"body": null,
"is_bot": false,
"headline": "update Makefile template",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-01T15:40:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce03f41d9ab66da0b77c81c4e9902cef44ed34ab",
"body": "When generate_llms_md is enabled, the generator now checks the target\ndirectory: if no CLAUDE.md exists, it generates CLAUDE.md (auto-read by\nClaude Code); if the user already has their own CLAUDE.md, it falls back\nto LLMS.md. On regeneration, the previously chosen filename is preserved.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: prefer CLAUDE.md over LLMS.md for AI agent documentation",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-03-01T15:34:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7bd65be5a6edcedc8f216ca8e921911d8c2217bf",
"body": "Add two new sections to help AI coding agents working on generated projects:\n- Generator Configuration Reference: full annotated YAML example with all\n config sections and key validation rules\n- Structural Changes Workflow: 10 step-by-step recipes for common operations\n (adding transports, workers, Kafka, drivers, applications, etc.)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: expand LLMS.md template with config reference and workflow guide",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-28T20:15:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "092425a646619b0e272f92ae9855f1f36aba0c57",
"body": "Move telegram and daemon shared templates from worker/files/ (loaded\nunconditionally for all workers) to worker/template/<type>/shared/\n(loaded only when the corresponding worker template is configured).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: generate telegram files only when telegram worker is configured",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-28T17:41:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2f877e6ba888645a6a2f89f60c98262f3f8b1349",
"body": "The rest-logrus config directory was missing from the hardcoded\nconfigDirs list in setupContainer, causing TestIntegrationRESTLogrus\nto fail with \"cannot stat '/workspace/test-configs/rest-logrus/.'\".\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: add rest-logrus to integration test config dirs",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-25T07:24:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8c278866b0fb35a801489b40b9d2e6eeb4834499",
"body": "Add `generate_llms_md` config option that generates a project-specific\nLLMS.md file with architecture rules, code placement guide, build\ncommands, and OnlineConf paths. The file is generated once and never\noverwritten on regeneration (like README.md). Includes dynamic sections\nfor ActiveRecord, REST, gRPC, Workers, Kafka, DevStand, and GOAT tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add LLMS.md generation for AI coding agents",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-25T06:51:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e36cf5ec5e4e55fe64b88ebc11bfa90c910bb99e",
"body": "Stale psg_*_gen.go files (e.g. from pkg/app/rest/mw/) remained on disk\nafter templates were moved to runtime, causing build errors like\n\"undefined: reqctx.CreateContext\". The generator now detects files with\ndisclaimer markers that are no longer in the template set and removes\nthem automatically. Files with user code below the disclaimer block\ndeletion with an error.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: auto-delete obsolete generated files on regeneration",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-20T23:33:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e39eb623cd0a7f996347e0eed761d008e638115d",
"body": "…rker templates\n\nMove REST server, middleware, and event logger templates to go-project-starter-runtime.\nGenerated projects now import these packages directly instead of containing copies.\n\nChanges:\n- Delete 16 REST template files (server, handler, closer, middleware, tests)\n- Add restconfig/config_\n[…]\nt logger methods for zerolog and logrus\n- Add worker graceful shutdown support (OnGracefulStop, OnShutdown)\n- Bump MinRuntimeVersion to v0.15.0\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: move REST infrastructure to runtime, refactor restconfig and wo…",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-20T22:37:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "997e4536e90ac19925c0cbefe7635dfb55b8eeae",
"body": "Queue processing system added in runtime v0.14.0.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump MinRuntimeVersion to v0.14.0",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-19T21:05:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e65fc91f064a703f3732468e72b0c2268b22ecf9",
"body": "Add queue processing support to the code generator:\n- YAML queue contract parser with validation (unique IDs/names, field types)\n- DS types: QueueField, QueueDef, QueueConfig integrated into Worker struct\n- Generator loads queue contracts and converts to typed config\n- 5 templates: typed task struct\n[…]\nlization code generation\n- Fix TestGenerateRESTTimeouts assertions to match current template output\n- Integration test: TestGenerateQueueWorker\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add queue worker code generation from YAML contracts",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-19T20:40:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "83267b7235611f9f5254f3657222f154308f72c5",
"body": "- Add import alias (cliName) for CLI handler package in generated main (fixes #10)\n- Use ds.IService instead of *service.Service in CLI handler template (fixes #11)\n- Import ds from runtime package, not project-local path (fixes #11 follow-up)\n- Use -H flag for mc alias set/mirror behind nginx basic auth proxy\n- Add regression tests for all three issues\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: CLI handler import alias and ds.IService type mismatch",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-19T15:54:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cce6d2699e5f1fca39053b5e47d8fad89c569ca5",
"body": "Add CLI command specification support analogous to ogen's OpenAPI generation.\nUsers define commands, subcommands, and typed flags in commands.yaml, and\nthe generator produces Params structs, UnimplementedCLI stubs, flag parsing,\nand subcommand dispatch — allowing projects to compile immediately and\noverride specific command handlers in separate files.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: generate CLI handlers from YAML spec (commands.yaml)",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-19T01:29:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c292770149ef7d257819b2cc8e955909172b43c8",
"body": "…ucture\n\n- Add atomic timeout fields + graceful server restart when OnlineConf\n timeouts change (instead of writing to http.Server fields unsafely)\n- Fix OC key paths: timeout/* → server/timeout/* to correctly represent\n http.Server config namespace within transport\n- Remove defaultHandlerTimeout fallback (return 0 = no timeout if unconfigured)\n- Add server_test.go.tmpl with race, enforcement, and graceful restart tests\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: REST server graceful restart on timeout changes, fix OC key str…",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T23:52:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d4623968330061f98e84f8d86756948ae3d76d4c",
"body": "mc alias set does not support --api-header. Move custom headers to\nmc mirror --header flag instead. Add ToGitHubSecret template function\nto convert ${VAR} references to ${{ secrets.VAR }} in GitHub Actions.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: split mc alias/mirror and add ToGitHubSecret for header vars",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T19:35:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "61f0060a35d297be8e3a12b1918f600d7214fc0a",
"body": "Add new `minio` documentation type that uses native MinIO Client (mc)\ninstead of aws s3 sync, with support for custom HTTP headers via\n--api-header flag for reverse proxy scenarios.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add minio documentation deployment type with mc client",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T19:19:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "21ad9f6c7fa00c0a1327b3f48da2934996deec67",
"body": "…MinIO compat\n\nThe aws-actions/configure-aws-credentials@v4 action validates tokens\nvia AWS STS, which fails with MinIO. Set AWS_ACCESS_KEY_ID,\nAWS_SECRET_ACCESS_KEY, and AWS_DEFAULT_REGION as env vars directly\non the deploy step instead.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: replace aws-actions/configure-aws-credentials with env vars for …",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T18:04:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ad9aa177ff2ee2803f9f21b51e620a7c4869bf89",
"body": "…n CI\n\nGitHub Actions: add github.ref == 'refs/heads/main' condition to\ndeploy-docs job, replace pip/python with squidfunk/mkdocs-material\nDocker image. GitLab CI: replace python:3-slim image with\nsquidfunk/mkdocs-material. Fix S3 docs prefix to use project name\nwithout extra docs/ nesting.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: restrict docs deployment to main branch, use Docker for mkdocs i…",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T16:23:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4213a29bce3e5b37f88dfb45ebbcd97783138586",
"body": "Remove EmptyConfigAvailable field from Rest and Grpc config structs,\nbackward-compat conversion in generator, deprecation checks in migrate,\nand related test cases. Update DEPRECATION.md.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove deprecated empty_config_available (removal version 0.13.0)",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T11:49:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b8059b1aca6a8cbd95a7c4a5ac0aab40e952fce1",
"body": "Add `ci` field to main config (github/gitlab/both). When specified,\nonly selected CI templates are generated. Empty = both (backward compat).\n\nSwitch generated docs targets to Docker (squidfunk/mkdocs-material)\ninstead of requiring local Python/pip. Simplify S3 docs prefix to\njust SERVICE_NAME since the bucket is docs-only.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add configurable CI provider selection and use Docker for docs",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T11:38:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "237ccd5b15cb8e82906e5e0adfbd658f1d53d4ea",
"body": "Replace hardcoded AppInfo with version/commit/buildDate variables\ninjected via ldflags. Define LD_FLAGS in Makefile, rename BIN_NAME\nto go-project-starter, add ldflags to buildfortest target.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add CLI version command with ldflags-based build info",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T01:26:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b02829cb33b061470a7caeb0e278cb7a2062dfda",
"body": "Update runtime dependency to v0.13.0 which adds CreateContextWithTimeout\nfor explicit timeout control in request context creation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump MinRuntimeVersion to v0.13.0",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T00:38:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ad601d6b8314ee93eed72a10d0aff42083041be1",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add daemon worker to worker-daemon integration test config",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T00:38:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "51aa417a5c85e8058882f6c1a319b4f24c200b70",
"body": "Generate MkDocs Material setup with CI/CD deployment for S3 or GitHub Pages\nwhen `documentation` section is present in project config. Includes mkdocs.yml,\ndocs/index.md, Makefile targets (docs-build/serve/deploy), and deploy-docs\njobs for both GitHub Actions and GitLab CI.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add documentation deployment generation (MkDocs + S3/GitHub Pages)",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T00:38:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "587cf5c2f5bb56dd94591a060e70fba1b408f884",
"body": "Replace single timeout with split read/write/handler timeouts for REST servers.\nAdd dynamic timeout updates via OnlineConf subscriptions, handler timeout\n3-level fallback with write timeout clamping, and timeout exceeded logging\nin metrics middleware. Include generator and runtime tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: implement split REST server timeouts with handler timeout logging",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-18T00:38:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8cdb2456cb47ca4549f2d6cc53730e1905e88c07",
"body": "Combine r.Method and r.URL.Path into a pathKey (e.g., GET_payment__token)\nfor OnlineConf path resolution, allowing separate config per method+path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: include HTTP method in OnlineConf request context key",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-16T12:59:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "aceab850c6a0b30572fca0a72ac3eafbe215d49b",
"body": "Without --schema_path, make generate-argen only regenerated Go code\nin cmpl/ but not the DDL schema.sql. Adding --schema_path etc/database\nensures both Go code and database schema are generated together.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: add --schema_path to argen generate command in Makefile template",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-10T17:15:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5aa97c3ef19fabda9a79e05f62be7ac3254fb2f1",
"body": "- Add unit tests for internal packages: loggers (100%), config (44%),\n ds (60%), migrate (76%), templater (30%), generator (3%)\n- Add unit test templates for generated projects:\n - REST middleware tests (auth, common, csrf)\n - REST client tests (RoundTripper, Chain)\n - Telegram worker tests (par\n[…]\n\n - Constant package tests\n- Update default argen version to v3.1.22\n- Add deprecation comment for empty_config_available (removal in v0.13.0)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add unit tests for generator and generated projects",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-05T23:05:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5ab9c810fe08140d8c3a6b41b5839127e8a72fcb",
"body": "BREAKING: Transport entries in applications must now use object format:\n transport:\n - name: api\nInstead of the deprecated string format:\n transport:\n - api\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove deprecated transport string array format (v0.12.0)",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-04T21:10:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8c4db2ecc7d33f35b75ccdfdb68f2bc5da4a35e7",
"body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update documentation for logrus logger support",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-04T21:01:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "72dccaab085104ce61fe21290baf985852205e78",
"body": "Add TestGenerateRESTLogrus unit test that verifies logrus project\ngeneration produces correct files with rlog imports and InitLogrus.\nAdd rest-logrus docker-integration test config and TestIntegrationRESTLogrus.\nExtract shared constants (paramParts, errParam, nilErr, destDir) into\nloggers.go to satisfy goconst linter across both logger implementations.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add logrus generation tests, fix lint issues",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-04T18:37:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "83bfb784e6d9467b2f876ae8c14411e59507a9e7",
"body": "Use `rlog` alias for runtime logger in logrus code generation (mirrors\nzerolog's `zlog` pattern) to avoid name collisions with the project's\nown `logger` package. Make runtime logger imports conditional in\ntemplates that already have them hardcoded. Add runtime/strconv imports\nfor ErrorMsgCaller in ogen handler template.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: resolve logrus import conflicts, bump MinRuntimeVersion to v0.12.0",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-04T18:04:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fc9a960c858597099d3bdbac645298672e8595fb",
"body": "- Add LogrusLogger struct with all Logger interface methods\n- Register logrus in LoggerMapping\n- Move zlog.go.tmpl from main/ to logger/zlog/ for proper template selection\n- Create logrus.go.tmpl init template with JSON/Text formatter support\n- Update ZlogLogger.DestDir to pkg/app/logger\n- Update ZlogLogger.ReWrap to use generic logger.ReWrap\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add LogrusLogger implementation and logrus init template",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-04T09:24:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fd75002075bdfa703bc2216a78dfc2194f0eb19c",
"body": "…rpolation\n\n- Add SubContext to Logger interface for creating derived loggers\n without mutating the parent (used in kafka producer async worker)\n- Skip .Err(nil) in ErrorMsg/ErrorMsgCaller when err is \"nil\"\n- Use printf for template variables in Logger method arguments\n (nested {{ }} inside {{ }} are not processed by Go templates)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: add SubContext method, skip Err(nil), fix template variable inte…",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-04T08:04:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5204be6556b4c12ffcb1b503b831d11c7c1e34c1",
"body": "Replace all direct zerolog calls (zlog.Ctx) in 18 template files with\nLogger interface methods. Migrate all zerolog-specific params (Str, Int,\nInterface, Err) to universal type::key::value format. Add ErrorMsgCaller\nand SetupTestLogger methods to Logger interface.\n\nKey changes:\n- Fix err injection h\n[…]\nto context.Context\n- Replace all hardcoded zerolog imports with {{ .Logger.Import }}\n- Zero behavioral change: zerolog output remains identical\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: migrate templates to universal type::key::value param format",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-03T20:23:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bea759f7a89cdd7cc7f62a367e27095c806b96bb",
"body": null,
"is_bot": false,
"headline": "update CLAUDE.md",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-03T11:21:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5bfca23fbc5fea354ccc67f727d6d70af9873284",
"body": null,
"is_bot": false,
"headline": "add bearer token",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-02-03T11:03:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12000fba2df156651c8fa2f39e73f49fea8be9c5",
"body": "Support dynamic instantiation mode for gRPC buf_client, matching\nthe existing REST ogen_client pattern. Dynamic clients are not\nregistered at startup — users create them via NewDynamicClient(ctx, address).\n\nAlso includes:\n- Deprecate empty_config_available in favor of optional transport config\n- Rem\n[…]\nstruct (replaced by Optional)\n- Add deprecation warnings for empty_config_available usage\n- Migrate test configs to new transport object format\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add instantiation: dynamic for gRPC buf_client",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-03T10:45:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1b88b820eda0495819d2f91d1254eb714b2fb2c4",
"body": "Clients with empty_config_available: true can legitimately be nil\nwhen host/port are not configured. Don't fail startup validation\nfor them.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: skip ValidateFor* check for empty_config_available clients",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-03T09:18:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8453de934464901493cc2703e90cd0dffa815fe8",
"body": "- Support optional flag for drivers, kafka producers, and transports\n- Generate tryGet* methods only for optional dependencies\n- Remove accessor methods for required dependencies (fixes name collision)\n- Add ValidateFor* startup checks for required dependencies\n- Support both string[] and object[] format for kafka in app config\n- Add CapitalizeFirst template func, remove unused ToCamelCase\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add optional dependencies and startup validation",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-02-03T01:32:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ac3279ede239569bf93c1a1419a75d7f032d1722",
"body": "Replace general architecture mermaid diagram with layered view\nmatching the reference design (Transport → Service → Data).\nRemove duplicate \"Связь компонентов\" section.\nAdd `make docs` target for running mkdocs locally in Docker.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update architecture diagram and add make docs command",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-30T13:29:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "775ebd7cc09738b27db12de77eb03eca183eac99",
"body": "- Add \"Why Go Project Starter?\" section with monolith vs microservices problem\n- Explain monorepo approach for gradual decomposition\n- Add Spec-First approach documentation\n- Document Service as the core business logic component\n- Add transport types comparison (API, Workers, Bots, CLI)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add philosophy and architecture details from audio notes",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-29T12:49:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "091bd3c80ec00b25876fe48bcdb6edbf737d4e71",
"body": "Allows using @@SSH_HOST@@ in env files which gets replaced with\nthe actual deployment server IP/hostname during deploy stage.\n\nUseful when application needs to know its external IP for service\ndiscovery registration or callback URLs.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add deploy-time placeholder @@SSH_HOST@@ for env files",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-28T19:04:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "96792f413659645dcc4533aaee4fa4fa7f8bc6d0",
"body": "This ensures deb/rpm/apk packages contain statically compiled\nbinaries that work across different Linux environments.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: add CGO_ENABLED=0 to build targets for static binaries",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-28T13:20:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d807dbd7bad0b962da2a4680fe82795c3c616b34",
"body": null,
"is_bot": false,
"headline": "fix make test",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-01-27T12:44:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1fa8938c221ab036418b3793957e86bcd396b254",
"body": null,
"is_bot": false,
"headline": "update README.md",
"author_name": "sklukin",
"author_login": "sklukin",
"committed_at": "2026-01-24T07:35:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8930b2f593bacef0c77a6601731437f66f742b04",
"body": null,
"is_bot": false,
"headline": "fix: correct broken link in generator.md",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-23T02:27:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ece83722b224199874c543e1b7046f93a1c4b463",
"body": "Template changes:\n- Add IsMessageDeleteError() for expected delete errors (48h limit, already deleted)\n- Add IsMessageEditError() for expected edit errors (no text, not modified)\n- Use Warn level for expected telegram errors instead of Error\n- Keep Error level only for unexpected failures\n\nRuntime:\n- Update MinRuntimeVersion to v0.11.1 (adds ActorWasSet field)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: improve telegram error handling and update runtime version",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-23T01:19:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4498390b81b474e19c7d2f02cc5f93ed746feb63",
"body": "- Reorganize docs into modular structure (getting-started, architecture,\n cli, configuration, workflow, examples, testing, reference)\n- Add mkdocs.yml with Material theme configuration\n- Add GitHub Actions workflow for auto-deploy to Pages\n- Move COMPARISON.md and CONTRIBUTING.md to project root\n- \n[…]\nments to structs.go for Worker, CLI, Grpc, Driver, JSONSchema\n- Update defaultGolangVersion to 1.24\n- Remove old monolithic documentation files\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: restructure documentation with MkDocs",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-23T00:40:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "92b81aa8f29236e7030370b05abf282996be7c36",
"body": "…paths\n\n- AppInfo.AppName now uses Application.Name instead of ServiceName\n- Add transportName parameter to GetMiddlewares interface\n- Fix parameter order in GetMiddlewares call (appName, serviceName, transportName)\n- Fix OnlineConf paths to use 3-level hierarchy:\n /{serviceName}/transport/rest/{tr\n[…]\n transportName.\nAppInfo.AppName now contains ApplicationName, not ServiceName.\nPrometheus metric names now include transport name as subsystem.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: fix naming system for AppInfo, middlewares, and OnlineConf …",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T21:19:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3e8c5b09d0ed4f92e86fedb59dd8894cfe7d0d10",
"body": "- Add step 3: GitHub Release creation\n- Emphasize: tag != release\n- Always diff between releases, not tags\n- Compose release notes relative to last release commit\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update release checklist: GitHub release is mandatory",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T11:27:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9b5e7e5c53b4f95892da09bd00adb02382237140",
"body": "Features:\n- Add instantiation: dynamic for ogen_client (per-REST or per-app level)\n- Generate NewDynamicClient() factory for runtime client creation\n- Add migrate command for automatic config migration\n- Add deprecation system with per-feature removal versions\n\nConfig changes:\n- Transport now suppor\n[…]\npatible: both formats work\n\nNew files:\n- internal/pkg/migrate/ - config migration utilities\n- DEPRECATION.md - deprecation policy documentation\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add dynamic client instantiation and config migration",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T11:14:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "17ad4d46f8d9f8d9e10f273aef3cc240f3c497b3",
"body": "Deploy now waits for upload-packages to complete (when HasUpload is true).\nEnsures packages are uploaded before deployment starts.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add upload-packages dependency to deploy jobs",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T03:08:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1d05f5282a174fd3308cbe3d95afca38267c114e",
"body": "Remove deployed/built distinction from notifications.\nNow shows simple lists: \"Docker образы:\" and \"Пакеты:\"\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Simplify notifications: show plain artifact lists",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T03:05:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b2438018c006b4b1613c221b4d50c6e78aa675b1",
"body": "Package builds now wait for GOAT tests to complete before running.\nGitLab CI uses optional job dependencies, GitHub Actions uses\nconditional execution with result checks.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add GOAT test dependencies to build-packages job",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T02:45:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9199e6df84b7c81dc8fc5f5f2e7d574e1ded4348",
"body": "nfpm doesn't support ${VAR:-default} syntax, only plain ${VAR}\nThe VERSION is always set by Makefile's PKG_VERSION\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix nfpm version: remove bash-style default syntax",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T02:32:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3934b54b28673728b7cd181732d58508d718eb60",
"body": "- Docker images: \"Задеплоено\" when deploy runs, \"Собрано (не деплоится)\" otherwise\n- Packages (deb/rpm/apk): \"Собрано (установка вручную)\"\n- Updated both GitHub Actions and GitLab CI templates\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Split notifications into deployed vs built artifacts",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T02:31:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1bf0e15d17f31bba53e4fd8564a246d8eeec1b0a",
"body": "- Add PKG_RELEASE to replace dashes with dots in RELEASE\n- main branch: YYYYMMDD.HHMM.commit (e.g., 20260120.0512.bb7b2ca4)\n- other branches: 0~devYYYYMMDD.HHMM.commit (sorts lower than releases)\n- Update package-list to use PKG_VERSION\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix PKG_VERSION to be deb-compatible",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T02:23:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3897a3abd40b3cd9c76a80483f5005570d5f6f45",
"body": "- PKG_VERSION now uses DOCKER_TAG (date-commit format) instead of just RELEASE\n- package-list shows full package names with version like docker images\n- deb/rpm/apk targets now use per-app HasDeb()/HasRPM()/HasAPK() checks\n- packages target uses per-app artifact checks\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix package version and per-app artifact checks",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T02:09:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "517f20f3cd860dcf94d7d95fd3fe0f58d1a8a334",
"body": "- Add PACKAGES output from make package-list\n- Move artifact_version job outside HasDocker block\n- Update notification to show both Docker images and deb/rpm/apk packages\n- artifact_version now depends on build and/or build-packages based on config\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix notifications to show both Docker images and packages",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T01:40:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e0adcabee39b92c244c2411ee2c1c9d2f680b2cb",
"body": "- GitLab CI: Use minio/mc:latest image and mc commands\n- GitHub Actions: Install mc and use mc cp for uploads\n- Remove UPLOAD_REGION from MinIO (not needed for mc)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Change MinIO upload to use mc client instead of aws cli",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T00:43:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "92fdd8004e2bffd7291c2b78db3967a0c46312a5",
"body": "- Makefile: docker-list and artifact-list now only include apps with HasDocker()\n- Makefile: docker-* targets only generated for apps with docker artifacts\n- fs.go: Skip Dockerfile and docker-compose generation for non-docker apps\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Docker artifact generation for per-app artifacts",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T00:41:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "035cf8e46de233ca72da477448a76ff728791979",
"body": "Applications can now specify their own artifacts list, overriding the\nglobal configuration. When an application has artifacts: [deb], it will\nonly generate deb packages without Docker builds, and CI won't require\nDocker/TRAEFIK variables for that app.\n\n- Add Artifacts field to config.Application str\n[…]\nglobal\n- Fix artifact initialization order (before app processing loop)\n- Update CI templates to check per-app HasDocker() for each application\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add per-application artifacts support",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-20T00:23:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bada99152dfa0d2ea5f7b2b85f1c5d5784eddcb3",
"body": "For projects without Docker artifacts (e.g., packaging-only with deb/rpm/apk),\nthe CI pipelines no longer require Docker registry credentials, traefik ports,\nor other Docker-specific variables.\n\nChanges:\n- GitLab CI: wrap variables, default image, prepare-env docker-list, goat-tests,\n build-templat\n[…]\nin step, Upload env file step, create_env_files job, goat-tests\n jobs, build job, deploy job, and artifact_version job in HasDocker conditions\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make Docker-specific CI sections conditional on HasDocker",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-19T23:49:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "da94aabbc4b8c51f38f4532424cf035d9d8592b1",
"body": "Features:\n- Add package upload support (minio, aws, rsync) with CI/CD variables\n- Add ONLINECONF_DIR environment variable support in generated code\n- Add systemd EnvironmentFile override for use_envs applications\n- Generate systemd override in postinstall.sh for apps with use_envs: true\n- Clean up o\n[…]\nitHub Actions) with upload jobs\n- Update Makefile with upload-packages target\n- Add getOnlineconfDir() function to read ONLINECONF_DIR from env\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add package upload, ONLINECONF_DIR support, and systemd EnvironmentFile",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-19T23:15:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3782091e0450e9649e2c2f12a13827ff9dc768b5",
"body": null,
"is_bot": false,
"headline": "Add deb packaging support",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-19T23:15:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a4dff8f57d14b198dd2b074dc8f2b25de58faf4",
"body": "- Workers: use {name}Worker alias (e.g. balancerWorker)\n- buf_client: use {name}Client alias (e.g. balancerClient)\n\nThis fixes \"redeclared in this block\" errors when a worker\nand a transport (API client) have the same name.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add unique import aliases to prevent name collisions",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-19T23:15:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0c7d63711275102b9d83ae7a43bc7b1d7920de53",
"body": "Use golang.org/x/mod/semver for proper semantic version comparison\ninstead of lexicographic string comparison which fails for versions\nlike v0.9.0 vs v0.10.0 (string comparison incorrectly shows v0.9.0 > v0.10.0).\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix semantic version comparison for runtime_version validation",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-19T23:15:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9aa05cb61052a7636035f8f94721898b7be320a6",
"body": "Problem: Service was initializing ALL ogen_client/buf_client for ALL\napplications, causing errors when an app didn't need a specific client.\n\nSolution: Clients are now passed via application.SetClient() similar to\ndrivers, and initialized only if registered.\n\nChanges:\n- Add GetGrpcTransport() method\n[…]\nInitializer interface\n- Update MinRuntimeVersion to v0.10.0 (required for new IService interface)\n\nRequires: go-project-starter-runtime v0.10.0\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add conditional client initialization via SetClient pattern",
"author_name": "Nikolas",
"author_login": "Nikolo",
"committed_at": "2026-01-19T23:15:34Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 67,
"commits_last_year": 237,
"latest_release_at": "2026-07-17T11:29:37Z",
"latest_release_tag": "v0.26.1",
"releases_from_tags": false,
"days_since_last_push": 4,
"active_weeks_last_year": 32,
"days_since_latest_release": 4,
"mean_days_between_releases": 12.9
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": true,
"has_contributing": true,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/Educentr/go-project-starter",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/Educentr/go-project-starter",
"is_deprecated": false,
"latest_version": "v0.26.1",
"repository_url": "https://github.com/Educentr/go-project-starter",
"versions_count": 99,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-17T11:22:15Z",
"latest_version_yanked": null,
"days_since_latest_publish": 4
}
]
},
"popularity": {
"forks": 1,
"stars": 3,
"watchers": 1,
"fork_history": {
"days": [
{
"date": "2026-01-19",
"count": 1
}
],
"complete": true,
"collected": 1,
"total_forks": 1
},
"star_history": {
"days": [
{
"date": "2025-10-28",
"count": 1
},
{
"date": "2025-11-19",
"count": 1
},
{
"date": "2025-12-30",
"count": 1
}
],
"complete": true,
"collected": 3,
"total_stars": 3
},
"open_issues_and_prs": 14
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"example",
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [
"example/admin.proto",
"example/example.proto",
"example/kafka_example.proto",
"test/docker-integration/configs/combined/item.proto",
"test/docker-integration/configs/grpc-only/item.proto"
],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 56778,
"source_files_sampled": 53,
"oversized_source_files": 0,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 13236
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/AlecAivazis/survey/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.3.7"
},
{
"name": "github.com/Educentr/goat",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.3.1"
},
{
"name": "github.com/go-git/go-git/v5",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v5.11.0"
},
{
"name": "github.com/pkg/errors",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.9.1"
},
{
"name": "github.com/spf13/pflag",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.5"
},
{
"name": "github.com/spf13/viper",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.18.2"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "github.com/testcontainers/testcontainers-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.40.0"
},
{
"name": "golang.org/x/mod",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.28.0"
},
{
"name": "golang.org/x/text",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.30.0"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 12,
"open_issues": 14,
"closed_ratio": 0.263,
"closed_issues": 5,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "Nikolo",
"commits": 147,
"avatar_url": "https://avatars.githubusercontent.com/u/237986?v=4"
},
{
"type": "User",
"login": "sklukin",
"commits": 103,
"avatar_url": "https://avatars.githubusercontent.com/u/9253280?v=4"
},
{
"type": "User",
"login": "eugenzt-art",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/243577399?v=4"
}
],
"contributors_sampled": 3,
"top_contributor_share": 0.581
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"docs.yml",
"go-version-check.yml",
"integration-test.yml",
"release_notification.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": "4 out of 4 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 1/23 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 1,
"reason": "dependency not pinned by hash detected -- score normalized to 1",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "51 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "a4788e22c2710830649ab5571c43a3295821ee85",
"ran_at": "2026-07-22T03:26:27Z",
"aggregate_score": 3.1,
"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-17T11:29:47Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-17T11:22:16Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 9,
"created_at": "2026-01-23T00:39:20Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 12,
"created_at": "2026-02-24T13:57:17Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 13,
"created_at": "2026-02-24T14:51:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 14,
"created_at": "2026-02-24T14:51:34Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 15,
"created_at": "2026-02-24T14:51:36Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 17,
"created_at": "2026-02-25T19:35:47Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 20,
"created_at": "2026-04-27T07:42:28Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 21,
"created_at": "2026-05-02T17:28:48Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 23,
"created_at": "2026-05-05T13:01:38Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 24,
"created_at": "2026-05-07T15:52:43Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 25,
"created_at": "2026-05-14T17:23:49Z",
"last_comment_at": "2026-06-12T15:47:25Z",
"last_comment_author": "Nikolo"
},
{
"number": 27,
"created_at": "2026-06-17T16:53:22Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 28,
"created_at": "2026-06-22T09:10:03Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 29,
"created_at": "2026-06-30T15:38:05Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/Educentr/go-project-starter",
"host": "github.com",
"name": "go-project-starter",
"owner": "Educentr"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 57,
"inputs": {
"security": 31,
"vitality": 92,
"community": 24,
"governance": 52,
"engineering": 77
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 92,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 86,
"inputs": {
"commits_last_year": 237,
"human_commit_share": 1,
"days_since_last_push": 4,
"active_weeks_last_year": 32
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "32/52 weeks with commits",
"points": 22.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 32
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "237 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 237
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "18 commit(s) and 2 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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 67,
"latest_release_tag": "v0.26.1",
"releases_from_tags": false,
"days_since_latest_release": 4,
"mean_days_between_releases": 12.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "67 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 67
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~12.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 12.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 4,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 4 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 4
}
}
],
"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": 5,
"inputs": {
"forks": 1,
"stars": 3,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "below_threshold"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "3 stars",
"points": 4.9,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 3
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 1
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "at_risk",
"name": "Community health",
"note": null,
"notes": [],
"value": 45,
"inputs": {
"has_readme": true,
"has_license": false,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 52,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 26,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 3,
"top_contributor_share": 0.581
},
"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 58% of commits",
"points": 9.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 58
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "3 contributors",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 3
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"merged_prs": 12,
"open_issues": 14,
"closed_issues": 5,
"issue_closed_ratio": 0.263,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "26% of issues closed",
"points": 12.3,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 26
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "12/12 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 12,
"decided": 12
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 1/23 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 47,
"inputs": {
"followers": 2,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "Educentr",
"public_repos": 18,
"account_age_days": 792
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "2 followers of Educentr",
"points": 3.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 2,
"login": "Educentr"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "18 public repos, account ~2 yr old",
"points": 13.6,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 18
}
},
{
"code": "account_age_years",
"params": {
"years": 2
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/Educentr/go-project-starter"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 4
},
"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 4 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 4
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "99 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 99
}
}
],
"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": 77,
"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": "4 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 4
}
}
],
"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": "4 out of 4 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": 90,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": "https://educentr.github.io/go-project-starter/",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://educentr.github.io/go-project-starter/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 31,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 31,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 3.1
},
"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": "4 out of 4 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 1/23 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 1",
"points": 0.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": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "51 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": "good",
"name": "AI Readiness",
"value": 81,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.87,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 13236
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "87 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 87,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 72,
"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.82,
"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": "82 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 82,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 1",
"points": 1,
"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": 56778,
"source_files_sampled": 53,
"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/53 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 53,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "good",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"example_dirs": [
"example",
"examples"
],
"has_mcp_signal": false,
"api_schema_files": [
"example/admin.proto",
"example/example.proto",
"example/kafka_example.proto",
"test/docker-integration/configs/combined/item.proto",
"test/docker-integration/configs/grpc-only/item.proto"
]
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": "example/admin.proto, example/example.proto, example/kafka_example.proto, test/docker-integration/configs/combined/item.proto, test/docker-integration/configs/grpc-only/item.proto",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "example/admin.proto, example/example.proto, example/kafka_example.proto, test/docker-integration/configs/combined/item.proto, test/docker-integration/configs/grpc-only/item.proto"
}
}
],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "example, examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "example, examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-22T03:26:37.783631Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/Educentr/go-project-starter.svg",
"full_name": "Educentr/go-project-starter",
"license_state": "absent",
"license_spdx": null
}