原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 506,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 404863
},
"pushed_at": "2026-07-26T03:53:00Z",
"created_at": "2024-02-19T04:55:57Z",
"owner_type": "Organization",
"updated_at": "2026-07-26T03:48:06Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": "AGPL-3.0",
"default_branch": "main",
"license_spdx_raw": "AGPL-3.0",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "dracory",
"company": null,
"location": null,
"followers": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/202408768?v=4",
"created_at": "2025-03-08T11:35:51Z",
"is_verified": null,
"public_repos": 74,
"account_age_days": 506
},
"license": {
"state": "standard",
"spdx_id": "AGPL-3.0",
"raw_spdx": "AGPL-3.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.34.0",
"kind": "minor",
"published_at": "2026-07-26T03:53:01Z"
},
{
"tag": "v1.33.0",
"kind": "minor",
"published_at": "2026-07-24T07:53:14Z"
},
{
"tag": "v1.32.0",
"kind": "minor",
"published_at": "2026-07-24T06:51:08Z"
},
{
"tag": "v1.31.0",
"kind": "minor",
"published_at": "2026-07-23T16:46:23Z"
},
{
"tag": "v1.30.0",
"kind": "minor",
"published_at": "2026-07-19T21:05:25Z"
},
{
"tag": "v1.29.0",
"kind": "minor",
"published_at": "2026-06-28T05:48:08Z"
},
{
"tag": "v1.28.0",
"kind": "minor",
"published_at": "2026-06-27T01:54:26Z"
},
{
"tag": "v1.27.0",
"kind": "minor",
"published_at": "2026-06-21T00:53:37Z"
},
{
"tag": "v1.26.0",
"kind": "minor",
"published_at": "2026-06-20T23:04:52Z"
},
{
"tag": "v1.25.0",
"kind": "minor",
"published_at": "2026-06-20T12:03:35Z"
},
{
"tag": "v1.24.0",
"kind": "minor",
"published_at": "2026-06-15T18:59:51Z"
},
{
"tag": "v1.23.0",
"kind": "minor",
"published_at": "2026-06-15T18:05:49Z"
},
{
"tag": "v1.22.0",
"kind": "minor",
"published_at": "2026-05-24T22:26:10Z"
},
{
"tag": "v1.21.0",
"kind": "minor",
"published_at": "2026-05-19T06:36:32Z"
},
{
"tag": "v1.20.0",
"kind": "minor",
"published_at": "2026-05-13T04:05:27Z"
},
{
"tag": "v1.19.0",
"kind": "minor",
"published_at": "2026-05-09T17:45:13Z"
},
{
"tag": "v1.18.0",
"kind": "minor",
"published_at": "2026-05-03T12:37:25Z"
},
{
"tag": "v1.17.0",
"kind": "minor",
"published_at": "2026-05-03T06:14:55Z"
},
{
"tag": "v1.16.0",
"kind": "minor",
"published_at": "2026-05-02T22:06:02Z"
},
{
"tag": "v1.15.0",
"kind": "minor",
"published_at": "2026-05-02T16:55:57Z"
},
{
"tag": "v1.14.0",
"kind": "minor",
"published_at": "2026-05-02T16:47:32Z"
},
{
"tag": "v1.13.0",
"kind": "minor",
"published_at": "2026-05-02T16:29:45Z"
},
{
"tag": "v1.12.0",
"kind": "minor",
"published_at": "2026-04-08T04:57:35Z"
},
{
"tag": "v1.11.0",
"kind": "minor",
"published_at": "2026-04-07T19:49:48Z"
},
{
"tag": "v1.10.0",
"kind": "minor",
"published_at": "2026-04-07T07:25:12Z"
},
{
"tag": "v1.9.0",
"kind": "minor",
"published_at": "2026-04-07T06:52:47Z"
},
{
"tag": "v1.8.0",
"kind": "minor",
"published_at": "2026-04-07T06:34:00Z"
},
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2026-03-28T23:23:10Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2026-03-21T06:26:20Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-02-04T22:29:14Z"
},
{
"tag": "v1.4.4",
"kind": "patch",
"published_at": "2026-01-16T18:18:26Z"
},
{
"tag": "v1.4.3",
"kind": "patch",
"published_at": "2026-01-15T08:31:57Z"
},
{
"tag": "v1.4.2",
"kind": "patch",
"published_at": "2026-01-15T07:52:38Z"
},
{
"tag": "v1.4.1",
"kind": "patch",
"published_at": "2026-01-10T06:34:52Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-01-09T08:54:12Z"
},
{
"tag": "v1.3.1",
"kind": "patch",
"published_at": "2026-01-09T02:46:19Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-01-08T18:38:23Z"
},
{
"tag": "v1.2.1",
"kind": "patch",
"published_at": "2025-12-06T05:34:23Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2025-11-21T10:47:00Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2025-09-01T18:27:10Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2025-04-01T18:51:51Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2025-03-14T06:22:46Z"
},
{
"tag": "v0.8.1",
"kind": "patch",
"published_at": "2024-11-28T17:51:35Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2024-11-02T20:21:30Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2024-10-31T06:59:34Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2024-10-31T06:55:53Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2024-09-10T07:08:28Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2024-09-08T18:39:28Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2024-04-22T00:31:21Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2024-02-19T05:45:31Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2024-02-19T05:26:51Z"
}
],
"recent_commits": [
{
"oid": "6c08071c2ad7c89b880ff6501b1768f954ca42f0",
"body": "Update dependencies to latest version",
"is_bot": false,
"headline": "Merge pull request #2 from dracory/jules-15759358083476341671-90594248",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2026-07-26T03:48:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0992c4b13d4ca6bcb25b9c4ca8febc118003308c",
"body": "Co-authored-by: lesichkovm <7744963+lesichkovm@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: update dependencies to latest versions",
"author_name": "google-labs-jules[bot]",
"author_login": "google-labs-jules[bot]",
"committed_at": "2026-07-26T03:46:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "63cdffc5f598ef2eeaa89da76bfa17b12d07ee78",
"body": "…amples",
"is_bot": false,
"headline": "docs: add media handler documentation with configuration and usage ex…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-07-24T07:44:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "64833c84472bc8dd98d072e7611ccc05418f5e1c",
"body": "…urable prefix support",
"is_bot": false,
"headline": "refactor: move ServeURL from Media entity to MediaHandler with config…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-07-24T07:43:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f378e33656078a540a01d5d7d2d0efd94543b2e",
"body": "… redirect support",
"is_bot": false,
"headline": "feat: add HTTP handler for serving blog media files with data URI and…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-07-24T06:49:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1e6021e13c9acb90d80cc5171bb8923628a62f6",
"body": "…of string concatenation",
"is_bot": false,
"headline": "fix: use separate arguments for OrderBy column and direction instead …",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-07-23T08:49:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d726de883bb5e2e7a5d807eb6cf10b4d447d53d2",
"body": "…ults",
"is_bot": false,
"headline": "fix: reset limit and offset in count queries to prevent incorrect res…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-07-22T05:19:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3fb07a26404aa1340a92b66010ac09857ecf6f42",
"body": "…d error handling\n\n- Upgrade github.com/dracory/neat from v0.27.0 to v0.31.0\n- Upgrade modernc.org/sqlite from v1.53.0 to v1.54.0\n- Upgrade golang.org/x/crypto from v0.53.0 to v0.54.0\n- Upgrade golang.org/x/sys from v0.46.0 to v0.47.0\n- Upgrade golang.org/x/text from v0.38.0 to v0.40.0\n- Upgrade golang.org/x/exp from v0.0.0-20260611194520-c48552f49976 to v0.0.0-20260718201538-764159d718ef\n- Upgrade github.com/mattn/go-isatty from v0.0.",
"is_bot": false,
"headline": "chore: upgrade neat to v0.31.0 and sqlite to v1.54.0, improve test an…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-07-19T20:58:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6752380c1ea31a4f52d8dc124e04165b3256bdc1",
"body": "- Rename post file columns to media columns (COLUMN_URL → COLUMN_MEDIA_URL, COLUMN_FILE_TYPE → COLUMN_MEDIA_TYPE)\n- Add MEDIA_STATUS_DRAFT, MEDIA_STATUS_ACTIVE, MEDIA_STATUS_INACTIVE constants\n- Create MediaInterface with methods for ID, EntityID, Title, Description, Memo, URL, Type, Size, Extension, Sequence, Status, timestamps, and metadata operations\n- Implement mediaImplementation using neat ORM traits (ShortID, SoftDeletesMaxDate, Cre",
"is_bot": false,
"headline": "feat: add media entity for file attachments with metadata support",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-28T05:11:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19b0c00e746f0d6cdaec0d777fe61b82d0edafc7",
"body": "- Add COLUMN_URL, COLUMN_FILE_TYPE, COLUMN_FILE_SIZE, COLUMN_FILE_EXTENSION constants\n- Add PostFileTableName field to NewStoreOptions with default \"blog_post_file\"\n- Create PostFileInterface with methods for ID, PostID, Name, URL, Type, Size, Extension, Sequence, timestamps\n- Implement postFileImplementation using neat ORM traits (ShortID, SoftDeletesMaxDate, CreatedAt, UpdatedAt)\n- Add NewPostFile() and NewPostFileFromExistingData() factory functions",
"is_bot": false,
"headline": "feat: add post file entity for media attachments",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-27T11:30:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bec259e75f685d83386e40c45e1f78799b1eb782",
"body": "…defaults\n\n- Upgrade github.com/dracory/neat from v0.26.0 to v0.27.0\n- Upgrade modernc.org/sqlite from v1.52.0 to v1.53.0\n- Upgrade modernc.org/libc from v1.73.4 to v1.73.5\n- Add default values to post table columns in MigrateUp()\n- Change COLUMN_TITLE from Text to String(255)\n- Change COLUMN_FEATURED from Boolean to String(3) with default \"no\"\n- Set COLUMN_STATUS default to POST_STATUS_DRAFT\n- Set COLUMN_PUBLISHED_AT default to neat.Null",
"is_bot": false,
"headline": "chore: upgrade neat to v0.27.0 and sqlite to v1.53.0, improve schema …",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-27T01:53:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5eec143f24244e37942515460f0e6686b4fd91a8",
"body": null,
"is_bot": false,
"headline": "chore: upgrade neat to v0.26.0",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-21T00:46:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cfd628fc00fea95a2f1c7aa06b87dba738e04c96",
"body": "…78244\n\nUpdate neat to v0.25.0",
"is_bot": false,
"headline": "Merge pull request #1 from dracory/update-neat-v0.25.0-81253442257410…",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2026-06-20T23:02:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11d3f9a640064b35744e408e5adfb859b221d610",
"body": "Updated the neat dependency to version v0.25.0 and ran go mod tidy to update go.sum. Verified that all tests pass with the new version.\n\nCo-authored-by: lesichkovm <7744963+lesichkovm@users.noreply.github.com>",
"is_bot": true,
"headline": "build: update github.com/dracory/neat to v0.25.0",
"author_name": "google-labs-jules[bot]",
"author_login": "google-labs-jules[bot]",
"committed_at": "2026-06-20T23:00:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e0a3f9a2b6ac2573012bfd114a31a98d566360d5",
"body": "…ORM features\n\n- Upgrade github.com/dracory/neat from v0.15.0 to v0.23.0\n- Remove github.com/dracory/versionstore v1.3.0 dependency\n- Embed orm.ShortID and soft_delete.SoftDeletesMaxDate in versioningImplementation\n- Add db struct tags to versioningImplementation fields for ORM mapping\n- Update buildVersioningQuery() to use Model() with Select(\"*\") for automatic soft delete handling\n- Update buildPostQuery() to explicitly set table",
"is_bot": false,
"headline": "chore: upgrade neat to v0.23.0 and refactor versioning to use neat's …",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-20T11:15:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59b4829fd5fdbc571e93251adb0a76c9d489b73e",
"body": "…ally\n\n- Remove github.com/dracory/versionstore dependency from go.mod\n- Add COLUMN_ENTITY_ID and COLUMN_ENTITY_TYPE constants\n- Replace versioningStore field with versioningTableName in storeImplementation\n- Implement versioning table migration directly in MigrateUp() and MigrateDown()\n- Reimplement all versioning methods (Create, Delete, FindByID, List, SoftDelete, Update) using neat database operations\n- Add buildVersioningQuery() helper method",
"is_bot": false,
"headline": "chore: remove versionstore dependency and implement versioning intern…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-20T07:31:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49b03affeca70fd3e507f66977968de48cad55c6",
"body": null,
"is_bot": false,
"headline": "chore: upgrade versionstore to v1.3.0",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-15T18:57:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb9fc17d714641e257cec5039ea87ee8dfc4a899",
"body": "…oft delete test",
"is_bot": false,
"headline": "test: fix versioning query method call from SetEntityID to SetID in s…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-15T18:54:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce41c4d4530c77c7288d5c5ef1a7ff66b338f229",
"body": "- Upgrade github.com/dracory/versionstore from v1.1.0 to v1.2.0\n- Upgrade modernc.org/libc from v1.73.3 to v1.73.4\n- Remove unused github.com/doug-martin/goqu/v9 and github.com/dracory/database dependencies\n- Update CreatedAt() to GetCreatedAt() in mcp/mcp.go\n- Update SoftDeletedAt() to GetSoftDeletedAt() in store_versioning_test.go\n- Clean up go.sum with updated dependency versions",
"is_bot": false,
"headline": "chore: upgrade versionstore to v1.2.0 and update method calls",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-15T18:45:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0ad5decc01d240df3d4bea40440199eb9f85c6b1",
"body": "…t.go\n\n- Delete post_implementation.go containing postImplementation struct and methods\n- Consolidate post implementation into post.go for better code organization\n- No functional changes, pure file reorganization",
"is_bot": false,
"headline": "refactor: move post implementation from post_implementation.go to pos…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-15T17:58:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e7ecfae6dc13d9223fe6a2fedd88a3f6d1e2c3fc",
"body": "…package with neat\n\n- Add NULL_DATETIME and MAX_DATETIME constants for datetime boundary values\n- Upgrade go version from 1.26 to 1.26.3\n- Replace github.com/dracory/dataobject v1.7.0 with github.com/dracory/neat v0.15.0\n- Upgrade modernc.org/sqlite from v1.50.1 to v1.52.0\n- Upgrade golang.org/x/crypto from v0.52.0 to v0.53.0\n- Upgrade golang.org/x/sys from v0.45.0 to v0.46.0\n- Upgrade golang.org/x/text from v0.37.0 to v0.38.0\n- Upgrade modern",
"is_bot": false,
"headline": "chore: add datetime constants, upgrade dependencies, and replace uid …",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-06-15T16:30:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7cebda12199d621ddf78c903cc7c4ff58e61accf",
"body": "…e schema package\n\n- Upgrade github.com/dracory/sb from v0.24.0 to v0.26.0\n- Upgrade golang.org/x/crypto from v0.51.0 to v0.52.0\n- Upgrade golang.org/x/sys from v0.44.0 to v0.45.0\n- Upgrade modernc.org/libc from v1.72.3 to v1.72.4\n- Refactor migrateSlugColumn() to use schema.TableColumnExists() and schema.TableColumnAdd()\n- Replace manual SQL generation with schema package methods for column operations\n- Simplify column existence",
"is_bot": false,
"headline": "chore: upgrade sb to v0.26.0 and refactor slug column migration to us…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-24T22:21:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b856e87da44caa198ffb915e1beede72f3e92d7",
"body": "…ation methods\n\n- Upgrade github.com/dracory/versionstore from v1.0.0 to v1.1.0\n- Add context.Context parameter to MigrateUp() and MigrateDown() methods\n- Replace Exec() calls with ExecContext() in migration methods\n- Update NewStore() to pass context.Background() to MigrateUp()\n- Update versioning store migration calls to include context parameter",
"is_bot": false,
"headline": "chore: upgrade versionstore to v1.1.0 and add context support to migr…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-19T06:29:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1eca1c8cf9e244062e7c2b4d7134fd75561ba5ab",
"body": "- Upgrade github.com/dracory/versionstore from v0.9.0 to v1.0.0\n- Upgrade golang.org/x/tools from v0.44.0 to v0.45.0\n- Rename AutoMigrate() to MigrateUp() and add optional transaction parameter\n- Add MigrateDown() method for dropping all blog store tables\n- Add SQL drop table methods for post, taxonomy, term, and term relation tables\n- Add getter/setter methods for all table names (post, taxonomy, term, term relation)\n- Update",
"is_bot": false,
"headline": "chore: upgrade versionstore to v1.0.0 and refactor migration methods",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-19T05:53:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3c46e50a284fcdc93b30f2dbd845e7044d134e9",
"body": "- Upgrade modernc.org/sqlite from v1.50.0 to v1.50.1\n- Add MarkAsDirty() method to PostInterface, TaxonomyInterface, TermInterface, and TermRelationInterface\n- Extend MarkAsNotDirty() to accept optional column parameters for selective dirty state management\n- Update all implementations to support column-specific dirty tracking via variadic parameters\n- Add comprehensive documentation for dirty tracking methods across all interfaces",
"is_bot": false,
"headline": "feat: add selective column dirty tracking and upgrade SQLite dependency",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-13T04:00:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4256af2dfcd257719951a80629ec1d085520426d",
"body": "…sting\n\n- Remove github.com/stretchr/testify dependency from go.mod\n- Replace testify assertions with standard library if/t.Errorf patterns in id_helpers_test.go\n- Replace testify assertions with standard library if/t.Errorf patterns in mcp/content_type_test.go\n- Update go.sum to remove testify and related transitive dependencies\n- Clean up outdated dependency versions in go.sum (golang.org/x/crypto, golang.org/x/mod, etc.)",
"is_bot": false,
"headline": "chore: remove testify dependency and replace with standard library te…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-09T17:43:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f6c15e324e5e628a136376f97ea31ecb019b7508",
"body": null,
"is_bot": false,
"headline": "test: add comprehensive versioning store test suite",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-09T17:39:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91d8e210d07662c62cfb2f03cfbf8ff404f0f138",
"body": "… for precise JSON filtering\n\n- Rename MetaContains to MetaEquals in PostQueryOptions for clarity on equality checks\n- Add MetaArrayContains filter for checking if JSON array fields contain specific values\n- Update postQuery() to implement MetaEquals with driver-specific JSON extraction\n- Add MetaArrayContains implementation with proper JSON array contains logic for SQLite, MySQL, and PostgreSQL\n- Fix MySQL JSON_CONTAINS syntax in",
"is_bot": false,
"headline": "refactor: rename MetaContains to MetaEquals and add MetaArrayContains…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-03T12:36:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a2def96e8b4322b54d37a5c3ccdd4f7133dcb35b",
"body": "- Add Slug filter to PostQueryOptions for slug-based queries\n- Add PostFindBySlug() method to retrieve posts by slug\n- Implement slug filtering in postQuery() using COLUMN_SLUG equality check\n- Add comprehensive test suite for PostFindBySlug with existent and non-existent slugs",
"is_bot": false,
"headline": "feat: add PostFindBySlug method for retrieving posts by slug",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-03T06:14:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc8f72c7d825ca8197b179e24e04ca0855cc2d3f",
"body": "… references\n\n- Move META_KEY_OLD_SLUGS constant from post_implementation.go to constants.go\n- Rename constant value from \"_wp_old_slug\" to \"_old_slugs\"\n- Update all JSON path references in postQuery() to use META_KEY_OLD_SLUGS constant\n- Apply constant usage across SQLite, MySQL, and PostgreSQL driver implementations",
"is_bot": false,
"headline": "refactor: move META_KEY_OLD_SLUGS constant to constants.go and update…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-02T22:04:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "941614ac6f570cb3225bf4e1ff139e4681f7e558",
"body": "…me parameter\n\n- Remove duplicate table name parameter from TableColumnAdd method call\n- Table name already specified in Column struct, no need to pass separately",
"is_bot": false,
"headline": "refactor: simplify TableColumnAdd call by removing redundant table na…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-02T16:55:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c34bbe80e704ab83266a42a49b8e2b5dbc42b43",
"body": "…tion\n\n- Add error handling for sql.ErrNoRows case when checking column existence\n- Set exists to false when no rows returned instead of failing migration\n- Add error logging for non-ErrNoRows database errors",
"is_bot": false,
"headline": "fix: handle sql.ErrNoRows in slug column existence check during migra…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-02T16:47:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f585d6b2c50bb6bf1c99b8f5667dbe11cc6e0ada",
"body": "…g history\n\n- Add OldSlug filter to PostQueryOptions for old slug-based queries\n- Add PostFindByOldSlug() method to retrieve posts by old slug from history\n- Implement old slug filtering in postQuery() with driver-specific JSON array contains logic\n- Add comprehensive test suite for PostFindByOldSlug with existent and non-existent slugs",
"is_bot": false,
"headline": "feat: add PostFindByOldSlug method for redirect handling with old slu…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-02T16:28:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05693a99690c6a34787cd38d0be9dc8088397355",
"body": "- Add COLUMN_SLUG to post table schema with VARCHAR(255) type\n- Add SetSlug() method to PostInterface and implementation\n- Modify GetSlug() to return custom slug if set, otherwise auto-generate from title\n- Initialize slug to empty string in NewPost() defaults\n- Add PostFindBySlug() method to retrieve posts by slug\n- Add Slug filter to PostQueryOptions for slug-based queries\n- Add old slug history tracking with GetOldSlugs(), SetOldSlugs(), and AddOldSlug()",
"is_bot": false,
"headline": "feat: add custom slug support and old slug history tracking for posts",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-02T16:24:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4a0333d945a7bd43253ae122b69e4c95d365a513",
"body": "… direct key access\n\n- Change JSON path from `$..key` to `$.key` for both SQLite and MySQL drivers\n- Add debug logging for SQL parameters in PostList method\n- Add comprehensive test suite for MetaContains filtering with multiple metadata scenarios",
"is_bot": false,
"headline": "fix: correct JSON path syntax in MetaContains query from recursive to…",
"author_name": "Milan",
"author_login": "lesichkovm",
"committed_at": "2026-05-02T12:32:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "164b26a0f65f566ddd581cb788d933810ad0666b",
"body": "…sequence management\n\n- Add PostAddTerm() method to append terms at the end of the sequence automatically\n- Add PostMoveTermTo() method to reorder terms by moving to a specific sequence position\n- Add internal helper methods: postMaxSequence(), postTermList(), postTermUpdateSequence()\n- Add comprehensive test suite covering sequence operations, edge cases, and error handling\n- Implement in-memory reordering algorithm with bubble",
"is_bot": false,
"headline": "feat: add PostAddTerm and PostMoveTermTo methods for simplified term …",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T04:56:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5d76729a874ba7ce5dfbbe2d231a585bc3a6c038",
"body": "…CRUD naming conventions\n\n- Rename PostTermAddAt to PostInsertTermAt to align with Insert/Remove pattern\n- Rename PostTermRemove to PostRemoveTerm to match object-action naming style\n- Update all method calls in implementation, tests, and MCP integration\n- Update interface documentation to reflect new method names",
"is_bot": false,
"headline": "refactor: rename post-term relationship methods for consistency with …",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T04:29:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5867155b6d616152bbee6a9dd57f90ce945a48f8",
"body": "…rsions",
"is_bot": false,
"headline": "deps: update dracory dependencies and modernc.org/sqlite to latest ve…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T04:22:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f225a1e120ff0c68959e0352c4153863d6d9ea0",
"body": null,
"is_bot": false,
"headline": "test: add comprehensive versioning store test suite",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T04:02:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65fd91fc14c6f69ed77e303de0e49ed5ad74e325",
"body": "…ns, and context utilities\n\n- Add package-level documentation for PostInterface describing main content entity features\n- Document all PostInterface methods with detailed comments for identity, author, content, SEO, status, timestamps, metadata, versioning, and taxonomy operations\n- Add method documentation for content type checks, status checks, and timestamp conversions\n- Document PostQueryOptions struct and all filtering, sorting, and pagination fields",
"is_bot": false,
"headline": "docs: add comprehensive godoc comments to post interface, query optio…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T03:26:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5eaa0637fa75d0567af6ec74e83b9d2439f87345",
"body": "…aces, and store creation\n\n- Add package-level documentation for NewStore constructor and NewStoreOptions struct\n- Document versioning internal interfaces (versioningMarshalToInterface, versioningDataInterface)\n- Add method documentation for all versioning operations (create, delete, find, list, update, track)\n- Document TaxonomyInterface, TermInterface, and TermRelationInterface with detailed method comments\n- Add documentation",
"is_bot": false,
"headline": "docs: add comprehensive godoc comments to versioning, taxonomy interf…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T03:22:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6dcb6771faf6c69a508a8105c7bd7d8795a177f1",
"body": "…on files\n\n- Add package-level documentation for NewPost and NewPostFromExistingData constructors\n- Document postImplementation struct and its DataObject embedding\n- Add method documentation for all post getters, setters, and helper methods\n- Document slug generation, editor types, content types, and status checks\n- Add versioning serialization/deserialization method documentation\n- Document metadata operations (GetMeta, SetMeta, GetMetas",
"is_bot": false,
"headline": "docs: add comprehensive godoc comments to post and store implementati…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T03:20:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "25a6cc077de60b4572de016cab2819a92f1cfb0b",
"body": "…D method\n\n- Rename PostTermAdd to PostTermAddAt to clarify sequence parameter purpose\n- Rename PostTerms to TermListByPostID for clearer method naming convention\n- Add PostListByTermID method to retrieve posts associated with a term\n- Rename taxonomy_store.go to store_implementation_taxonomy.go for consistency\n- Add comprehensive taxonomy store test suite (641 lines)\n- Update README example to use renamed TermListByPostID method",
"is_bot": false,
"headline": "refactor: rename taxonomy methods for clarity and add PostListByTermI…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-08T03:08:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2bf10149570eeb5884ebaa04ca7ee02203985fa",
"body": "- Add COLUMN_SEQUENCE constant (renamed from COLUMN_TERM_SEQUENCE for consistency)\n- Add sequence column to term table schema with INTEGER type\n- Add GetSequence() and SetSequence() methods to TermInterface and termImplementation\n- Initialize sequence to 0 in NewTerm() defaults\n- Update TermRelation to use COLUMN_SEQUENCE constant instead of COLUMN_TERM_SEQUENCE\n- Fix parseInt() to handle negative integers correctly\n- Add comprehensive",
"is_bot": false,
"headline": "feat: add sequence field to Term model for ordering hierarchical terms",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T19:48:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd2c059f6b782b97f35336e3dd4fe17df69d4208",
"body": "…omy feature state\n\n- Add TaxonomyEnabled() method to StoreInterface\n- Implement TaxonomyEnabled() in storeImplementation to return taxonomyEnabled field\n- Enable runtime checking of taxonomy feature availability",
"is_bot": false,
"headline": "feat: add TaxonomyEnabled method to StoreInterface for checking taxon…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T17:12:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b59d4931503b458056fa14889af4a3dabe4f6ba5",
"body": "…taxonomy system\n\n- Add Installation section with go get command\n- Add Setup section with NewStore configuration example\n- Add Usage section with post creation and listing examples\n- Add Taxonomy System section documenting three-table architecture\n- Document hierarchical terms, cached counts, slugs, and ordered relations features\n- Add taxonomy usage examples for creating taxonomies, terms, and post-term relationships\n- Remove detailed",
"is_bot": false,
"headline": "docs: add comprehensive README sections for installation, usage, and …",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T07:24:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b016be7221848ac73fa866a365f6bbd7de91ab5",
"body": "… consistency\n\n- Rename sqlCreateTable method to sqlCreatePostTable to explicitly indicate it creates the post table\n- Update AutoMigrate to call sqlCreatePostTable instead of sqlCreateTable\n- Update method documentation to reflect new name",
"is_bot": false,
"headline": "refactor: rename sqlCreateTable to sqlCreatePostTable for clarity and…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T07:19:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ad46f609a48015e26b93e5c75267353a54e756e",
"body": "- Add TaxonomyEnabled field to NewStoreOptions for opt-in taxonomy feature\n- Add taxonomyEnabled field to storeImplementation to track taxonomy state\n- Conditionally create taxonomy tables in AutoMigrate only when enabled\n- Add taxonomy enabled checks to all taxonomy, term, and term relation store methods\n- Return descriptive errors when taxonomy methods are called while disabled\n- Update all taxonomy tests to explicitly enable",
"is_bot": false,
"headline": "feat: add TaxonomyEnabled flag to conditionally enable taxonomy system",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T07:07:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13c24eab592642ac0d8713c75786e94ffc0b172d",
"body": "- Rename post_test.go to post_implementation_test.go for consistency with implementation file naming\n- Add COLUMN_UPDATED_AT to taxonomy, term, and term_relation table schemas\n- Add comprehensive test suite for taxonomy system (681 lines)\n- Test taxonomy, term, and term relation domain models with defaults, setters, and slug normalization\n- Test store integration for create, find, list, count, update, and delete operations\n- Test post-term relationships and hierarchical term structures",
"is_bot": false,
"headline": "refactor: rename test files and add updated_at column to taxonomy tables",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T07:03:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b86de21ffdf5451025e42c0a93ac3bf7f226a656",
"body": "… design proposal\n\n- Add database column constants for taxonomy tables (count, description, name, parent_id, post_id, slug, taxonomy_id, term_id, sequence)\n- Add pre-defined taxonomy type constants (TAXONOMY_CATEGORY, TAXONOMY_TAG)\n- Add detailed taxonomy system proposal document outlining three-table architecture\n- Document implementation plan covering domain models, store layer, database schema, post integration, MCP tools, and",
"is_bot": false,
"headline": "feat: add taxonomy system foundation with constants and comprehensive…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T06:50:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2caf2b5eb519ee7a297284884f77a63fb03b672c",
"body": "… interface naming convention\n\n- Replace ContentType() with GetContentType() in all test files\n- Replace Editor() with GetEditor() in test assertions\n- Replace Meta() with GetMeta() in test validations\n- Replace ID() with GetID() in test lookups\n- Replace Title(), Status(), Featured(), Content() with Get-prefixed versions\n- Update all Post getter methods in post_implementation.go to use Get prefix\n- Update Slug() to GetSlug() and adjust implementation",
"is_bot": false,
"headline": "test: update Post method calls to use Get prefix for consistency with…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T06:34:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b48fc2e51d2b4a2ca87cfd59ddf0e2cadfa7b96",
"body": "…sed architecture\n\n- Rename store struct to storeImplementation to distinguish from StoreInterface\n- Update NewStore to instantiate storeImplementation instead of store\n- Change all method receivers from *store to *storeImplementation\n- Update interface implementation verification comment and variable declaration\n- Update test type assertion to expect *storeImplementation concrete type\n- Maintain all existing functionality while enabling",
"is_bot": false,
"headline": "refactor: rename store struct to storeImplementation for interface-ba…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T05:35:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff124154f98ad213f5626887caef99bcc11720a8",
"body": "…d architecture\n\n- Rename Post struct to postImplementation to distinguish from PostInterface\n- Update NewPost and NewPostFromExistingData to return PostInterface instead of concrete type\n- Change all method receivers from *Post to *postImplementation\n- Update interface implementation verification comment and variable declaration\n- Maintain all existing functionality while enabling interface-based polymorphism",
"is_bot": false,
"headline": "refactor: rename Post struct to postImplementation for interface-base…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T05:31:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "165fd2951e93fd17ae9fc8ca78997e8ba46a3e2a",
"body": "…d of concrete type\n\n- Add PostInterface to define contract for blog post operations\n- Update all Post setter methods to return PostInterface instead of *Post\n- Expose DataObject methods (Data, DataChanged, Get, Set, Hydrate, IsDirty, MarkAsNotDirty) through Post\n- Update store methods to accept and\n[…]\nost\n- Update MCP postToMap to accept PostInterface parameter\n- Modify PostList to return []PostInterface instead of []Post\n- Update PostFindByID, PostFindPrevious, PostFindNext to return PostInterface",
"is_bot": false,
"headline": "refactor: change Post method receivers to return PostInterface instea…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-04-07T05:28:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "21d0231535cad894c41d843ae12211490bc64fdf",
"body": "… descent for nested key support",
"is_bot": false,
"headline": "refactor: switch MetaContains JSON path from exact match to recursive…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-03-28T23:28:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "55960d4379c6e45f463fdc5b248c41a5a84af6de",
"body": "…-database support\n\n- Add MetaContains field to PostQueryOptions for filtering posts by meta JSON key-value pairs\n- Implement database-specific JSON extraction in postQuery method\n- Support SQLite (json_extract), MySQL (JSON_UNQUOTE/JSON_EXTRACT), and PostgreSQL (->>) syntax\n- Add documentation and usage example for MetaContains field",
"is_bot": false,
"headline": "feat: add MetaContains filter for JSON-based post querying with cross…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-03-28T23:22:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "383e02ede6c99faca0006468889dc0897b273fe8",
"body": "- Upgrade Go version from 1.25 to 1.26\n- Update sb from v0.15.0 to v0.20.0\n- Update versionstore from v0.5.0 to v0.6.0\n- Update samber/lo from v1.52.0 to v1.53.0\n- Update modernc.org/sqlite from v1.44.3 to v1.47.0\n- Update various indirect dependencies (crypto, sys, text, mod, tools, etc.)\n- Refactor sqlCreateTable to return error alongside SQL string\n- Update AutoMigrate to handle sqlCreateTable error return",
"is_bot": false,
"headline": "chore: upgrade Go to 1.26 and update dependencies to latest versions",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-03-21T06:24:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97c38f7090a59af6318f30ecb8a49a5d8ff7ecfa",
"body": "…st lookups\n\n- Add GenerateShortID, ShortenID, UnshortenID, IsShortID, and NormalizeID helper functions\n- Implement Crockford Base32 encoding for shortened IDs (9-21 chars vs 32+ chars)\n- Update NewPost to use GenerateShortID instead of uid.HumanUid\n- Modify PostFindByID to normalize IDs and support both short and long ID lookups\n- Add automatic ID shortening in MCP postToMap for API responses\n- Add comprehensive tests for all ID",
"is_bot": false,
"headline": "feat: add ID shortening helpers and automatic ID normalization for po…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-02-04T21:15:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8303cff8d6ca2f45a9c77980de327b548bc89dab",
"body": null,
"is_bot": false,
"headline": "chore: upgrade dependencies to latest versions",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-02-04T21:14:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "253c94e593eea3e931582ffa84c628a9097589e6",
"body": "Removed Gitpod link from the README.",
"is_bot": false,
"headline": "Remove Gitpod link from README",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2026-01-16T18:17:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fdc6545691aba4174456d8d231c6fee8296b4024",
"body": "…mestamp on restore",
"is_bot": false,
"headline": "refactor: exclude timestamp fields from versioning and auto-update ti…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-16T18:16:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3cff1532b878663230870adf0037921e6c8c515e",
"body": "…ned content\n\n- Implement UnmarshalFromVersioning to deserialize JSON content back into Post entity\n- Parse versioned data map and restore fields using Set method\n- Add error handling for JSON unmarshaling failures",
"is_bot": false,
"headline": "feat: add UnmarshalFromVersioning method to Post for restoring versio…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-15T08:31:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "244abd96def11c947033291422752600e5cb3dc5",
"body": "- Move sortOrder initialization and OrderBy handling inside the Limit > 0 conditional block\n- Ensure sorting is only applied when pagination is active\n- Fix indentation to match conditional scope",
"is_bot": false,
"headline": "refactor: move sorting logic inside limit condition block in postQuery",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-14T20:21:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d9d4f21dab80c56da363ec4f32d12e06b76c45c1",
"body": "…stUpdate methods\n\n- Remove manual version creation logic from toolPostUpsert in MCP handler\n- Add automatic version tracking in PostCreate and PostUpdate using versioningTrackEntity\n- Update tests to expect version creation on both create and update operations (1 + N versions instead of N)\n- Fix test assertions to verify all expected version titles are present without assuming ordering\n- Remove redundant manual version creation from",
"is_bot": false,
"headline": "refactor: move version creation from post_upsert to PostCreate and Po…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-10T15:48:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c29be06f44c3256d4c5039083635c67148b3f53b",
"body": "…content extraction\n\n- Add versioningMarshalToInterface and versioningDataInterface for flexible entity serialization\n- Implement versioningContentFromEntity to extract versionable content from entities, excluding timestamp fields\n- Add versioningCreateIfChanged to prevent duplicate versions by comparing with last version\n- Implement versioningTrackEntity as unified method for tracking entity changes\n- Add comprehensive error handling for nil",
"is_bot": false,
"headline": "feat: add internal versioning helper methods for entity tracking and …",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-10T15:46:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39272d78ed5fee5bb8c3940a0f42492377a41a3d",
"body": null,
"is_bot": false,
"headline": "chore: upgrade dependencies to latest versions",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-10T06:07:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4290d00a023ed8cb53565bfab122bdcb7a9ce254",
"body": "…story\n\n- Add post_versions tool to MCP tools list with support for id, limit, order_by, and sort_order parameters\n- Implement toolPostVersions method to query and return version history for blog posts\n- Add automatic version creation in toolPostUpsert before updating posts when versioning is enabled\n- Update blog_schema tool to document post_versions usage and versioning behavior\n- Add comprehensive tests for version creation, retrieval, and integration",
"is_bot": false,
"headline": "feat: add post_versions tool to MCP handler for retrieving version hi…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-09T08:49:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "828f9224d9a1409d2b4cbbd36b4f926f4d78d429",
"body": "…sert tool",
"is_bot": false,
"headline": "refactor: consolidate post_create and post_update into single post_up…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-09T08:43:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c8e7453770a901c361ca14f19ba593dbdf79cea3",
"body": null,
"is_bot": false,
"headline": "feat: add versioning support",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-09T07:28:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e00b8ac5f5fc459526dc8db4977a53693c1d863b",
"body": "…ext options",
"is_bot": false,
"headline": "feat: add content_type field support with markdown, HTML, and plain t…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-09T02:41:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "940875b9f99792ce406717c6ffeb9a6c74f60348",
"body": "…t management",
"is_bot": false,
"headline": "docs: add MCP (Model Context Protocol) handler for LLM-based blog pos…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2026-01-08T18:02:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12250a9d7bb3418d5d526f4209688691a3934ba2",
"body": null,
"is_bot": false,
"headline": "chore: update indirect dependencies in go.mod and go.sum",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-12-06T05:31:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7de394752ae50fc1c20ad65e3a71ec25e3251dcf",
"body": "…istency\n\n- Rename constant COLUMN_DELETED_AT to COLUMN_SOFT_DELETED_AT\n- Update Post methods: DeletedAt() to SoftDeletedAt(), DeletedAtCarbon() to SoftDeletedAtCarbon(), and SetDeletedAt() to SetSoftDeletedAt()\n- Update all references in NewPost(), PostSoftDelete(), postQuery(), and tests to use new naming convention",
"is_bot": false,
"headline": "refactor: rename COLUMN_DELETED_AT to COLUMN_SOFT_DELETED_AT for cons…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-21T10:54:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0622f430c05c272e20603c758702b0cc2efcd8d",
"body": "…ation\n\n- Add post_test.go with tests for NewPost defaults, meta handling, status helpers, and slug/image methods\n- Add store_implementation_test.go tests for PostList, PostCount, PostTrash, PostUpdate, PostSoftDeleteByID, PostDeleteByID, PostFindPrevious, PostFindNext, and query options including search, ordering, and WithDeleted flag",
"is_bot": false,
"headline": "test: add comprehensive unit tests for Post model and Store implement…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-21T10:45:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "090803fbafb0d34362593e842f3641ef7916d4de",
"body": null,
"is_bot": false,
"headline": "chore: move dracory/database from indirect to direct dependency",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-21T10:40:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4addc81200eb0def20c93258388bb1b954ee945b",
"body": "…ade dependencies\n\n- Rename consts.go to constants.go and blogpost.go to post.go for consistent naming\n- Add context.Context parameter to all store interface methods\n- Replace sb.NewDatabase with dracory/database package for query execution\n- Upgrade dracory/sb from v0.12.0 to v0.15.0\n- Upgrade modernc.org/sqlite from v1.40.0 to v1.40.1\n- Upgrade golang.org/x/crypto from v0.44.0 to v0.45.0\n- Update tests to use in-memory database an",
"is_bot": false,
"headline": "refactor: rename files for consistency, add context support, and upgr…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-21T10:39:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9eaffe5ae0c13ba78afb5aaa23a1ae621bad80af",
"body": "…ng convention",
"is_bot": false,
"headline": "refactor: rename Post.go to blogpost.go for consistent lowercase nami…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-21T10:29:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "934a7193f2981ff1edf2df573949b32bb60e18d0",
"body": "…/mysql, stretchr/testify, and modernc.org/sqlite",
"is_bot": false,
"headline": "chore: upgrade dependencies including dracory packages, go-sql-driver…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-17T08:23:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "106bb9588b482a1fc86dac585971524b37a7635f",
"body": "…ackages, carbon/v2, samber/lo, and modernc.org/sqlite",
"is_bot": false,
"headline": "chore: upgrade Go to 1.25 and update dependencies including dracory p…",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-11-17T08:21:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "082d5616073316965861bb4203252d691e6c1b2c",
"body": null,
"is_bot": false,
"headline": "chore: upgrade dependencies including carbon/v2 and sqlite packages",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-09-01T18:25:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "08c69396660233271742e31ede2d168d93347bbc",
"body": "…JSON handling",
"is_bot": false,
"headline": "refactor: migrate from gouniverse to dracory dependencies and update …",
"author_name": "Sinevia",
"author_login": "lesichkovm",
"committed_at": "2025-09-01T18:24:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fab3aa78ea72173bd310f0d1862ac7161f7f799b",
"body": null,
"is_bot": false,
"headline": "updated dependencies",
"author_name": "lesichkovm",
"author_login": "lesichkovm",
"committed_at": "2025-04-01T18:50:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d0a7a4e3a734c2cef24b26a9c0b3e6d9bc13990",
"body": null,
"is_bot": false,
"headline": "updated dependencies",
"author_name": "lesichkovm",
"author_login": "lesichkovm",
"committed_at": "2025-03-14T06:18:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c67649f19e3b74561498574b1fad20e14d5c38f",
"body": null,
"is_bot": false,
"headline": "updated interface",
"author_name": "lesichkovm",
"author_login": "lesichkovm",
"committed_at": "2025-03-14T06:14:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f79b5662091ccde7ccc56b06bcc5a8bafef87cd",
"body": null,
"is_bot": false,
"headline": "Merge branch 'main'",
"author_name": "Sinevia",
"author_login": "Sinevia",
"committed_at": "2024-11-28T17:50:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43212737210d23b817c081cb189d007ab839ab6d",
"body": null,
"is_bot": false,
"headline": "upgraded carbon",
"author_name": "Sinevia",
"author_login": "Sinevia",
"committed_at": "2024-11-28T17:46:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2fe460356c43ff381a42687535ed64c2073ee56d",
"body": null,
"is_bot": false,
"headline": "Update README.md",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-11-04T19:25:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb1ef6987df02172b01a70a2ce7e8f4aafadf1bb",
"body": null,
"is_bot": false,
"headline": "Update LICENSE",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-11-04T19:23:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16eebd50a20b7f829d97db11071b2e0ba5346f54",
"body": null,
"is_bot": false,
"headline": "updated dependencies",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-11-02T20:19:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c75bd8cab88512ae79be789d770bde9c43b4f9d6",
"body": null,
"is_bot": false,
"headline": "updated soft delete logic to use max date time",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-11-02T20:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5d357d69cfa723d041ca24eae2734d6d59acb55d",
"body": null,
"is_bot": false,
"headline": "Update README.md",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-10-31T06:58:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92a5255dcf1cc783fb2a2e270179f88479cb86c4",
"body": null,
"is_bot": false,
"headline": "Create LICENSE_COMMERCIAL.txt",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-10-31T06:57:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d915de93ab99b131a41e5eabc26bc2ce545069d",
"body": null,
"is_bot": false,
"headline": "added new editor",
"author_name": "Sinevia",
"author_login": "Sinevia",
"committed_at": "2024-10-31T02:26:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "559385817c663cc0aa565c0c31eb7c073d99a444",
"body": null,
"is_bot": false,
"headline": "updated search to be case insensitive",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-09-10T06:39:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0e3a869d09dcf5b95eb64385d9ad1d55e9622e1",
"body": null,
"is_bot": false,
"headline": "updated dependencies",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-09-08T18:38:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "018706f20ce4da5c3a5e1dfdcea737e2e5ed0b37",
"body": null,
"is_bot": false,
"headline": "Update tests.yml",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-09-08T18:35:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d9b7506d2d47be3d8e94fd8643f4b4e02d58237",
"body": null,
"is_bot": false,
"headline": "added search option",
"author_name": "Milan Lesichkov",
"author_login": "lesichkovm",
"committed_at": "2024-09-08T18:31:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59f1e52623b930ba8b217fe20ba29244ae765594",
"body": null,
"is_bot": false,
"headline": "added editor",
"author_name": "Sinevia",
"author_login": "Sinevia",
"committed_at": "2024-08-23T20:46:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3968fced04a7b0d3fe8014901b4221cabe45ae2b",
"body": null,
"is_bot": false,
"headline": "added memo attribute",
"author_name": "Sinevia",
"author_login": "Sinevia",
"committed_at": "2024-08-23T06:04:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17e28598d0841ffab367d6fe28879f165594aded",
"body": null,
"is_bot": false,
"headline": "added IsDraft method",
"author_name": "Sinevia",
"author_login": "Sinevia",
"committed_at": "2024-08-22T05:11:42Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 51,
"commits_last_year": 81,
"latest_release_at": "2026-07-26T03:53:01Z",
"latest_release_tag": "v1.34.0",
"releases_from_tags": false,
"days_since_last_push": 2,
"active_weeks_last_year": 19,
"days_since_latest_release": 2,
"mean_days_between_releases": 4
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": false,
"has_contributing": false,
"health_percentage": 37,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/dracory/blogstore",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/dracory/blogstore",
"is_deprecated": false,
"latest_version": "v1.34.0",
"repository_url": "https://github.com/dracory/blogstore",
"versions_count": 52,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-26T03:48:02Z",
"latest_version_yanked": null,
"days_since_latest_publish": 2
}
]
},
"popularity": {
"forks": 0,
"stars": 1,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 35349,
"source_files_sampled": 30,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "golang.org/x/crypto",
"direct": false,
"version": "v0.54.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5932"
],
"fixed_version": null,
"advisory_count": 1,
"oldest_advisory_days": 20
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"unknown": 1
},
"advisory_count": 1,
"affected_count": 1,
"assessed_count": 21,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/dracory/neat",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.33.0"
},
{
"name": "github.com/dracory/sb",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.26.0"
},
{
"name": "github.com/dracory/str",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.18.0"
},
{
"name": "github.com/dromara/carbon/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.6.16"
},
{
"name": "github.com/samber/lo",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.53.0"
},
{
"name": "modernc.org/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.54.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/dracory/neat",
"direct": true,
"version": "v0.33.0",
"ecosystem": "go"
},
{
"name": "github.com/dracory/sb",
"direct": true,
"version": "v0.26.0",
"ecosystem": "go"
},
{
"name": "github.com/dracory/str",
"direct": true,
"version": "v0.18.0",
"ecosystem": "go"
},
{
"name": "github.com/dromara/carbon/v2",
"direct": true,
"version": "v2.6.16",
"ecosystem": "go"
},
{
"name": "github.com/samber/lo",
"direct": true,
"version": "v1.53.0",
"ecosystem": "go"
},
{
"name": "modernc.org/sqlite",
"direct": true,
"version": "v1.54.0",
"ecosystem": "go"
},
{
"name": "github.com/dracory/uid",
"direct": false,
"version": "v1.9.0",
"ecosystem": "go"
},
{
"name": "github.com/dustin/go-humanize",
"direct": false,
"version": "v1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/georgysavva/scany",
"direct": false,
"version": "v1.2.3",
"ecosystem": "go"
},
{
"name": "github.com/google/uuid",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-isatty",
"direct": false,
"version": "v0.0.24",
"ecosystem": "go"
},
{
"name": "github.com/ncruces/go-strftime",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/remyoudompheng/bigfft",
"direct": false,
"version": "v0.0.0-20230129092748-24d4a6f8daec",
"ecosystem": "go"
},
{
"name": "github.com/spf13/cast",
"direct": false,
"version": "v1.10.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/crypto",
"direct": false,
"version": "v0.54.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/exp",
"direct": false,
"version": "v0.0.0-20260718201538-764159d718ef",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.47.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/text",
"direct": false,
"version": "v0.40.0",
"ecosystem": "go"
},
{
"name": "modernc.org/libc",
"direct": false,
"version": "v1.74.3",
"ecosystem": "go"
},
{
"name": "modernc.org/mathutil",
"direct": false,
"version": "v1.7.1",
"ecosystem": "go"
},
{
"name": "modernc.org/memory",
"direct": false,
"version": "v1.11.0",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 21,
"direct_count": 6,
"indirect_count": 15
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 2,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "lesichkovm",
"commits": 99,
"avatar_url": "https://avatars.githubusercontent.com/u/7744963?v=4"
},
{
"type": "User",
"login": "Sinevia",
"commits": 8,
"avatar_url": "https://avatars.githubusercontent.com/u/3450815?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.925
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"tests.yml"
],
"has_docs_dir": false,
"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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/28 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 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": 9,
"reason": "1 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "6c08071c2ad7c89b880ff6501b1768f954ca42f0",
"ran_at": "2026-07-28T11:30:52Z",
"aggregate_score": 4.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-26T03:48:39Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-26T03:48:02Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/dracory/blogstore",
"host": "github.com",
"name": "blogstore",
"owner": "dracory"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 57,
"inputs": {
"security": 53,
"vitality": 86,
"community": 24,
"governance": 56,
"engineering": 57
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 86,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"commits_last_year": 81,
"human_commit_share": 0.98,
"days_since_last_push": 2,
"active_weeks_last_year": 19
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "19/52 weeks with commits",
"points": 13.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 19
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "81 commits in the last year",
"points": 17.2,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 81
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "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": 51,
"latest_release_tag": "v1.34.0",
"releases_from_tags": false,
"days_since_latest_release": 2,
"mean_days_between_releases": 4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "51 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 51
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 4
}
}
],
"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": 2,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 2 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 2
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 24,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 1,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 1
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (AGPL-3.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "AGPL-3.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 56,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.925
},
"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 92% of commits",
"points": 1.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 92
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 2,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "2/2 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 2,
"decided": 2
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 51,
"inputs": {
"followers": 4,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "dracory",
"public_repos": 74,
"account_age_days": 506
},
"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": "4 followers of dracory",
"points": 5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 4,
"login": "dracory"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "74 public repos, account ~1 yr old",
"points": 15.8,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 74
}
},
{
"code": "account_age_years",
"params": {
"years": 1
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/dracory/blogstore"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 2
},
"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 2 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 2
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "52 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 52
}
}
],
"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": "moderate",
"name": "Engineering Quality",
"value": 57,
"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": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "at_risk",
"name": "Documentation",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"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": "moderate",
"name": "Security",
"value": 53,
"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": 41,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow 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 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file 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": "1 existing vulnerabilities detected",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 21 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 21
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 1,
"affected_packages": 1,
"assessed_packages": 21,
"unassessed_packages": 0,
"affected_by_severity": "unknown 1",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 21,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 1
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 60,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.796,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "78 of 98 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 78,
"sampled": 98
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.02,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"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": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "2 of the last 100 commits agent-authored or agent-credited",
"points": 4,
"status": "partial",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 2,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 35349,
"source_files_sampled": 30,
"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/30 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 30,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-28T11:31:00.265409Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dracory/blogstore.svg",
"full_name": "dracory/blogstore",
"license_state": "standard",
"license_spdx": "AGPL-3.0"
}