Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"code-generation",
"dependency-injection",
"di",
"dig",
"fx",
"go",
"golang",
"microservices",
"modular",
"wire",
"framework",
"wire-alternative"
],
"is_fork": false,
"size_kb": 289,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 156569,
"PowerShell": 3774
},
"pushed_at": "2026-07-28T05:58:14Z",
"created_at": "2026-06-17T08:14:51Z",
"owner_type": "User",
"updated_at": "2026-07-28T08:07:17Z",
"description": "dig is a compile‑time code generation based DI tool for Go. It provides a more intuitive API than Wire , with native generics support , built‑in closure capture safety that Wire lacks, and is faster than Fx by eliminating runtime reflection — all with zero runtime dependencies",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "Vincent",
"type": "User",
"login": "shanjunmei",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/9591051?v=4",
"created_at": "2014-11-06T13:28:16Z",
"is_verified": null,
"public_repos": 85,
"account_age_days": 4281
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.0.11",
"kind": "patch",
"published_at": "2026-07-18T03:06:57Z"
},
{
"tag": "v1.0.10",
"kind": "patch",
"published_at": "2026-07-09T09:05:38Z"
},
{
"tag": "v1.0.9",
"kind": "patch",
"published_at": "2026-07-08T06:43:36Z"
},
{
"tag": "v1.0.8",
"kind": "patch",
"published_at": "2026-07-02T07:19:10Z"
},
{
"tag": "v1.0.7",
"kind": "patch",
"published_at": "2026-07-01T11:04:18Z"
},
{
"tag": "v1.0.6",
"kind": "patch",
"published_at": "2026-06-30T06:59:06Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2026-06-26T09:50:53Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2026-06-26T05:47:22Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2026-06-24T04:18:43Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2026-06-22T09:57:08Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2026-06-18T13:37:43Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-06-17T08:30:52Z"
}
],
"recent_commits": [
{
"oid": "26e059957bdc7f7a1c70a011b99a6669e32a6177",
"body": "inside module closure\n\nWhen using dig.Provider closure inside dig.Module(), bare cross-package\nfunction calls\nin closure body lose package alias in generated source and cause compile\nerror.\nAdd AST transformation pass to add package alias only for bare\nidentifiers at CallExpr.Fun,\nsupport generic function calls, and skip standalone function value\nreferences to prevent incorrect rewrite.",
"is_bot": false,
"headline": "fix(extractor): resolve missing package alias for bare function call",
"author_name": "Vincent",
"author_login": "shanjunmei",
"committed_at": "2026-07-28T05:58:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70f17905634f3bf3ef18025dd043e0cbdf11de6a",
"body": "The handleFuncLit function had excessive cyclomatic complexity (>15) due\nto\nmultiple responsibilities: signature validation, visibility checking,\nparameter extraction, free variable collection, argument list building,\nreturn type inference, duplicate detection, and item registration.\n\nSplit it into \n[…]\nact parameters and free variables\n- registerClosureProvider: register provider with duplicate detection\n\nThis reduces the main function's complexity to ~5 and improves\nmaintainability and testability.",
"is_bot": false,
"headline": "refactor(extractor): reduce cyclomatic complexity of handleFuncLit",
"author_name": "Vincent",
"author_login": "shanjunmei",
"committed_at": "2026-07-21T08:42:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "921e46d7829e74299c7c5cf3dcf130d7aa23fe3f",
"body": "When a closure defined in one package is used in dig.Invoke/Provide\nwithin\nanother package, unexported methods called on parameters inside the\nclosure\n(e.g., s.run()) are not caught by existing visibility checks, leading to\ncompilation errors after code generation.\n\nAdd checkMethodVisibilityInClosur\n[…]\nto the target package.\nThis ensures such issues are reported during go generate with a clear\nerror\nmessage, rather than failing at go build.\n\nApplied in handleFuncLit before building the closure item.",
"is_bot": false,
"headline": "fix(extractor): check method visibility in closure body",
"author_name": "Vincent",
"author_login": "shanjunmei",
"committed_at": "2026-07-21T07:02:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0678ef645e06b687f948661e90936519927fad8a",
"body": "logic\n\nReplace the duplicate provider lookup logic in `resolveArgNames` by\nreusing\nthe existing `resolveProvider` function, eliminating code duplication.\n\nChanges:\n- `resolveArgNames` now calls `resolveProvider` for provider lookup\n instead\n of maintaining its own implementation\n- Extract `buildPr\n[…]\n duplicate lookup code between `buildDependencyGraph` and\n `resolveArgNames`\n- Consistent error messages across both functions\n- Future provider lookup logic changes only need to be made in one place",
"is_bot": false,
"headline": "refactor(extractor): reuse resolveProvider to unify provider lookup",
"author_name": "Vincent",
"author_login": "shanjunmei",
"committed_at": "2026-07-21T05:57:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ff85e98d7ade9868ad28ee84e5a9ff6feca0f90b",
"body": "When a dig.Module is expanded into the package where dig.Build resides,\nprivate dependencies (functions, variables, constants) that were visible\nwithin the module's own package may become inaccessible across packages,\ncausing compilation failures.\n\nAdd checkGenerationVisibility to verify that each r\n[…]\n passed to dig.Invoke\n - handleSupply: for functions or variables passed to dig.Supply\n\nThis allows issues to be caught during go generate with clear error\nmessages, rather than waiting for go build.",
"is_bot": false,
"headline": "feat(extractor): add generation-time cross-package visibility check",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-21T02:55:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "06be575a494509faa02b7a16bb59aee90f55159f",
"body": "actionable fixes\n\nWhen dependency resolution fails, the current error message only\nindicates \"no provider\",\nleaving users unaware of available providers and unclear about how to\nfix the issue.\n\nImprovements:\n- List all available providers for the requested type (both named and\n default)\n- Provide s\n[…]\nthe name from the provider's return value to make it default\n```\n\nThis enables users to quickly identify the root cause and take the\ncorrect fix\nwithout consulting documentation or debugging the code.",
"is_bot": false,
"headline": "feat(extractor): improve error messages for named injection with",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-21T02:37:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "85ae83bbf59cd8ed6625c19b759407f70fe2c4a9",
"body": "- README.md & README_zh.md:\n - Bump version to v1.0.11\n - Add \"Named Instance Injection\" section with usage examples\n - Update comparison matrix with multi-instance support row\n - Replace inline version description with structured key changes list\n\n- prompts/system_prompt_dig_en.md & prompts/sys\n[…]\nction Usage\" section with how-to guide\n - Add ambiguous dependency troubleshooting to Scenario 4\n - Add forbidden behavior: never deny multi-instance support\n - Update version references to v1.0.11",
"is_bot": false,
"headline": "docs: update documentation for v1.0.11 named instance injection",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-18T06:13:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6079f0811493792963bdbfa76bccbe81e28e93f1",
"body": "name and import path\n\n**Problem**\nWhen generating dependency injection code, the generator incorrectly\nused the last segment of the import path as the package reference name\n(e.g., using `v9` instead of `redis` for\n`github.com/redis/go-redis/v9`). This led to undefined identifier errors\n(`v9.Client`\n[…]\n uses the correct package name\n (`redis`) and compiles successfully.\n- Ensure that simple imports (e.g., `net/http`) remain clean (no\n explicit alias) when the alias equals the default package name.",
"is_bot": false,
"headline": "fix(extractor): resolve compilation errors caused by mismatched package",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-18T02:51:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "277b613708e6eb1d04b48462fa755c8396f4b1ce",
"body": "injection)\n\nThis commit introduces support for injecting multiple instances of the\nsame\ntype, enabling users to distinguish them by name.\n\nProviders declare instance names using named return values:\n\n```go\ndig.Provide(func() (mainDB *sql.DB) { ... })\ndig.Provide(func() (cacheDB *sql.DB) { ... })\n```\n[…]\nth zero runtime overhead\n\n- Existing code without named return values is completely unaffected\n- Unnamed providers still work as default providers\n- Generated code format remains compatible\n\nCloses #4",
"is_bot": false,
"headline": "feat: support multiple isolated instances of the same type (named",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-17T07:26:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "267cf3cb675a1311a0646e43b7566a669dae2f27",
"body": "message\n\n- Merge three duplicate calls to extractOptionsFromFuncCall(call,\n curPkg)\n into a single exit point, centralizing handling for all\n non‑dig‑standard\n functions (non‑SelectorExpr, non‑dig package, unknown function names).\n- Remove the misleading default branch from the switch; unmatched\n[…]\n dig.Supply for constants or struct literals) when the input is of an\n unexpected type.\n\nImpact:\n- Internal refactoring only. External API behavior and all error\n outcomes\n remain exactly the same.",
"is_bot": false,
"headline": "refactor(extractor): consolidate fallback logic and improve error",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-16T09:11:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1a096990d21dbc768265a364b480a3bf46b9d4e9",
"body": null,
"is_bot": false,
"headline": "Apply the results of the new stable format code generator",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-13T01:38:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78bc05e07f156512b26e768acd3ec6aacca91ccd",
"body": "Compress multiple newlines after opening braces inside closure bodies to\na single newline, ensuring deterministic output regardless of source\nfile formatting.\n\nInsert a blank line between closure definitions in generated code for\nbetter readability.\n\nUnify closure formatting to align with standard Go code style.\n\nThis eliminates formatting instability where source file styles\ninfluenced generated closure body whitespace, and improves visual\nseparation between closure definitions.",
"is_bot": false,
"headline": "fix(generator): normalize closure formatting for consistent output",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-10T06:06:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e3450f8302b057becfffa6aadded386ce7b51b58",
"body": "Change UnusedMode.String() to panic when encountering an unknown mode\ninstead of silently returning an empty string. This makes invalid mode\nusage more visible during development and prevents silent misbehavior.",
"is_bot": false,
"headline": "refactor: panic on unknown UnusedMode in String() method",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-10T02:19:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c3f7e04c59b9c8d918391d6ba3591597a749b3a",
"body": "directives\n\nIntroduce BuildExecParams(outFile) to generate a parameter string\ncontaining all relevant CLI flags (-debug, -unused, -alias, -out) and\nembed it into the //go:generate directive of generated files.\n\nThis ensures that running go generate on the generated code reproduces\nthe exact same digen invocation with the same configuration, eliminating\nthe need for users to manually remember or re‑specify arguments when\nregenerating.",
"is_bot": false,
"headline": "feat(generator): persist CLI arguments into generated go:generate",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-10T02:18:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d061b170f15f74d8118fca6c4bf9561b41d9ce5",
"body": "The headerTemplate constant in generator.go contains a //go:generate\nline with %s placeholders. When running go generate ./..., this line was\nbeing incorrectly scanned and executed as a literal command with\nunexpanded %s placeholders, causing malformed import path \"%s/cmd/%s\"\nerrors.\n\nSolution:\nSpli\n[…]\ned files.\n\nImpact:\n\ngo generate ./... no longer fails.\n\nGenerated dig_gen.go files still contain the proper //go:generate\ndirective for regenerating code.\n\nNo functional changes to the generated code.",
"is_bot": false,
"headline": "fix(generator): prevent go:generate from scanning template placeholder",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T13:54:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f4e834a222cae3db41945aa210b2bc8695dd68dd",
"body": null,
"is_bot": false,
"headline": "Update sample code, default parameter is successful example",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T13:39:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb6fcda8e0665f0783ed84b34835eda989fbff1d",
"body": "Fix traversal in collectUsedPkgsFromType:\n\nUse indexed iteration (NumFields(), NumMethods(), Len()) instead of\nincorrect range loops for structs, interfaces, and type parameters.\n\nEnsure all nested types within composite types are properly traversed.\n\nFix typePkg to handle *types.Chan correctly.\n\nFi\n[…]\n to be missed\nduring UsedPkgs collection.\n\nEffect: Generated code now correctly imports all required packages,\nincluding those appearing inside composite types, resolving undefined\ncompilation errors.",
"is_bot": false,
"headline": "fix(extractor): correct package dependency collection for complex types",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T12:27:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e34e2b243355154385ea847ad63ac1d12faf0da4",
"body": "Extract duplicate alias generation logic into a single ensureAlias\nmethod.\n\nReplace fallback alias creation in generateClosureDef and\ncollectTypeNameAndUsedPkgs with calls to ensureAlias.\n\nMaintain existing behavior:\n\nPackages found in pkgMap use collectPkgAlias (with strategy and conflict\nresolution).\n\nPackages not in pkgMap use the last path segment as alias.\n\nReduces code duplication and centralizes alias caching logic for better\nmaintainability.\n\nNo functional changes to generated output.",
"is_bot": false,
"headline": "refactor(extractor): unify alias handling with ensureAlias method",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T09:23:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0a050c65f71d940caad806817bb30440fd9415a",
"body": "This commit marks the release of v1.0.10 with critical fixes for import\nand alias generation. It also updates the README and skill examples to\nreflect the latest version.\n\nBug Fixes:\n\nFixed missing alias replacement for standard library types (e.g.,\nnet/http) that caused go/format parsing errors.\n\nR\n[…]\nes are correctly captured and\nimported.\n\nDocumentation:\n\nUpdated README examples to use v1.0.10 in go:generate directives and\ninstallation commands.\n\nUpdated skill examples to reflect the new version.",
"is_bot": false,
"headline": "chore: bump version to 1.0.10 and update examples",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T09:09:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "86209f40b089b32c2aca5dbee24e7d23a8f37ce4",
"body": "compilation\n\nProblem: Generated code failed to compile due to:\n\nMissing alias replacement for standard library types (e.g.,\n*net/http.ServeMux), causing go/format parsing errors.\n\nMissing imports for external parameters (e.g., *config.AppConfig) and\nclosure signature types (e.g., alias.AliasStrategy\n[…]\nNameAndUsedPkgs to\ncapture package references inside closure bodies.\n\nResult: Generated dig_gen.go now includes complete imports and uses\ncorrect aliases, allowing the project to build without errors.",
"is_bot": false,
"headline": "fix: resolve import and alias generation issues for correct code",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T09:04:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2e14effead8def676456bd4695c731b5daaa8311",
"body": "spec\n1. Isolate external config IO to main only; LoadAppConfig is a pure\n utility and no longer registered via dig.Provide\n2. Leverage native dig feature: InitApp top-level cfg argument is auto\n supplied globally, remove redundant dig.Supply(cfg)\n3. Add new hard constraints: disallow loading env\n[…]\n\n4. Update all code templates including main, di.go, pgdb, server and\n domain modules\n5. Revise troubleshooting checklist, migration guides and forbidden\n rules to align with native auto injection",
"is_bot": false,
"headline": "feat(spec): Refactor config injection workflow for shanjunmei/dig coding",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T07:31:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c3d2313e60bb620ffc36b5599c3f196e6e4529c2",
"body": "spec\n1. Isolate external config IO to main only; LoadAppConfig is a pure\n utility and no longer registered via dig.Provide\n2. Leverage native dig feature: InitApp top-level cfg argument is auto\n supplied globally, remove redundant dig.Supply(cfg)\n3. Add new hard constraints: disallow loading env\n[…]\n\n4. Update all code templates including main, di.go, pgdb, server and\n domain modules\n5. Revise troubleshooting checklist, migration guides and forbidden\n rules to align with native auto injection",
"is_bot": false,
"headline": "feat(spec): Refactor config injection workflow for shanjunmei/dig coding",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T07:31:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "faf7e9f5026410cf285afd83d29c9312ca5444c4",
"body": null,
"is_bot": false,
"headline": "add Go Industrial Autonomous Business Module Coding Spec skill",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T06:57:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c7bd38e12e5abcc6822f6441f4d6f96cce08cd79",
"body": null,
"is_bot": false,
"headline": "Skill optimization, completing constraints",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T03:17:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca2a93cb0f10bf49cfc79a5f7742aefb2af963dd",
"body": "- add system_prompt_dig_en.md full english agent skill\n- update README bilingual description for /prompts folder",
"is_bot": false,
"headline": "docs: add english version llm skill & update readme prompt intro",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T02:46:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "46d635db251456dddbc87a5a3efba6b979d4169b",
"body": "- add system_prompt_dig_en.md full english agent skill\n- update README bilingual description for /prompts folder",
"is_bot": false,
"headline": "docs: add english version llm skill & update readme prompt intro",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T02:46:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e70ea8a5a2576e4a22fedb76d221e08e7a6af2e6",
"body": "- Add Chinese & English description for /prompts folder\n- Explain system_prompt_dig.md dedicated AI skill file",
"is_bot": false,
"headline": "docs: update README, add LLM Agent skill directory intro",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T02:44:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "934524abb253d6e0931fec48b675f743c74c3937",
"body": null,
"is_bot": false,
"headline": "docs: add introduction of LLM system prompt file under /prompts folder",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-09T02:37:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2c7cb78fba4870b3c8106f83b79ec9aac67d8d35",
"body": "reporting an error",
"is_bot": false,
"headline": "Update the example command in readme to pass by default instead of",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-08T11:07:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9539214032a09ad189b22671d36551127464f09",
"body": "Add debugCommentf, a helper method that returns a formatted string only\nwhen\nthe `-debug` flag is enabled. It is used to generate optional source\ncomments\nin extracted items, keeping the generated code cleaner when debug mode\nis off.",
"is_bot": false,
"headline": "feat(extractor): add debugCommentf helper for conditional debug comments",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-08T02:21:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b18fc051b56ad5ec4223c62aa47b67599c63e0d",
"body": "- Delete invalid Go Report Card badge image and link\n Reason: Go Report Card platform is permanently offline, the badge\n cannot load normally, clean dead links in document",
"is_bot": false,
"headline": "docs: remove Go Report Card badge from README.md",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-07T09:13:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2bb035c83f7715e0c131d21f653a32425629b348",
"body": "cwd\n\nThe previous implementation used os.Getwd() as the starting point for\nfindModuleRoot(), which relies on the current working directory being\nthe package root or its parent. This assumption fails in certain\nscenarios, such as when go generate is invoked from a different\ndirectory or when using Go\n[…]\nment and more robust.\n\nModified:\n- NewExtractor now accepts a startDir parameter\n- Processor passes filepath.Dir(target.File) as startDir\n- findModuleRoot uses the given startDir instead of os.Getwd()",
"is_bot": false,
"headline": "fix(extractor): determine module root from target file path instead of",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-07T06:46:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f635ac2ec7d87c7e597e580de2f3712c5503308e",
"body": null,
"is_bot": false,
"headline": "fix: correct codegen hint from go generate to digen",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-07T01:16:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1de7d61b4a7b63087fc145f6e0700dec48ff11a6",
"body": "interface{}",
"is_bot": false,
"headline": "fix(logger): correct receiver variable name and use any instead of",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-04T12:44:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "07f7951e5d2741aeadd7f0339aab72ae6ac105fd",
"body": "README:\n- Restructure content to improve readability and information density\n- Add background section comparing Uber Fx and Google Wire pain points\n- Add core features, quick start guide, API reference, and key\n constraints\n- Add feature comparison matrix against Wire and Fx\n- Add API migration che\n[…]\nd to\n generate\"\n- Output detailed errors for failed packages even without debug flag\n- Suggest using -debug flag when generation fails\n- Replace fmt.Errorf with errors.New to fix printf-style warning",
"is_bot": false,
"headline": "feat: improve README and enhance digen error diagnostics",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-03T08:53:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8c3b16ffbd264909aab096f7f13a8b0b4ed6e167",
"body": "suggestions\n\nPreviously, when a closure captured a local variable, the error message\nonly\nsuggested moving it to package level, which is not the ideal solution.\nThis\nchange improves the message by offering both options and clearly\nrecommending\nthe preferred one:\n\n- \"pass it as a parameter to the fun\n[…]\n as parameters.\n\nThis makes error messages more actionable and helps users understand the\ntrade-offs between the two approaches, encouraging the use of explicit\ndependency injection over global state.",
"is_bot": false,
"headline": "feat(extractor): enhance closure capture error with actionable",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-03T02:00:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "00a0659947347360521d05e186a9dc24672f0312",
"body": "actionable suggestions\n\nThis commit significantly improves the clarity, accuracy, and usability\nof error\nmessages emitted by the extractor, making them as intuitive as those\nfrom wire.\n\nChanges include:\n\n- **Rich context**: Every error now includes file path and line number,\n pointing to the exact \n[…]\na function\n lacks\n a `dig.Module` call or contains multiple/embedded module calls.\n\nThese improvements greatly reduce debugging time by giving developers\nimmediate, precise, and actionable feedback.",
"is_bot": false,
"headline": "feat(extractor): enhance error messages with detailed context and",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-03T01:44:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "15be68cc89f94b5dd2f730e70704298f86ba2548",
"body": "debug logs\n\n- Record file location for anonymous provider/invoke closures\n- Output comment with closure definition in generated code\n- Regenerate example without -debug flag to remove Logf calls\n- Keep source comments for better traceability",
"is_bot": false,
"headline": "feat(extractor): add source comments for closure functions and disable",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T08:33:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "da5fb3656db84200735cb7d798b4ed7056f8610e",
"body": "Record the file location of anonymous provider/invoke closures in\nextractedItem and output it as a comment in the generated code,\nimproving traceability and debugging experience.",
"is_bot": false,
"headline": "feat(extractor): add source comment for closure functions",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T08:10:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "536731eac05e08d47617aaacf784e377fdb39d7e",
"body": "digenv1\n\n- Rename cmd/digenv2 → cmd/digen as the current default generator\n- Move old cmd/digen (v1) to cmd/digenv1 for legacy compatibility\n- Update all import paths and generation directives to reference new\n location\n- Preserve v1 as a separate command for users who require older behavior\n- This change makes \"digen\" the canonical name for the latest version",
"is_bot": false,
"headline": "refactor: promote digen v2 to primary generator and archive v1 as",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T07:08:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b851826c57d97d3f7ff59883c59f19f6cb9fc9bb",
"body": "- Expand README with comprehensive advanced usage sections:\n - Supply, wrapper types, closure constraints, external parameters\n - Generic support, conditional logic, observability, module\n composition\n - Add complete example directory reference\n- Update comparison matrix with accurate feature comparisons\n- Change generation stats output to \"generated X/Y packages (Z failed)\"\n format\n- Improve readability and clarity of documentation",
"is_bot": false,
"headline": "docs: update README and improve generator output statistics",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T07:02:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52f4057a77256b93c9db760bba2a3ddc2bd5339c",
"body": "- Add Config type and dig.Supply(Config(\"production\")) to role module\n- Update generator with isLiteral to intelligently add package prefix\n only to non-literal expressions\n- Add source comments for supply values with module-relative paths\n- Demonstrate supply type conversion in example",
"is_bot": false,
"headline": "feat(example): add type conversion supply scenario",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T04:17:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24c245640daf335e484111b10407653a6a32da8d",
"body": "- Add isIdentOrSelector to avoid adding package prefix to literals in\n Supply\n- Fix generated code for dig.Supply(100) to produce \"v := 100\" instead\n of \"v := pkg.100\"\n- Extend model.Node and extractedItem with Comment field for supply\n source tracing\n- Add source location comments (file:line) to\n[…]\ngenerated\n output\n- Update example app to demonstrate module composition, generics,\n closures, and external params\n- No functional changes; generated code remains compilable and behavior\n unchanged",
"is_bot": false,
"headline": "feat: improve dig.Supply handling and add source comments",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T03:40:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c05249ef44d12d21e830d608edf8f8752686a1f2",
"body": "- Lowercase initial letters in error messages (\"Invoke\" → \"invoke\")\n- Remove trailing punctuation and reformat multi-line errors as\n parenthetical\n- No functional changes",
"is_bot": false,
"headline": "fix: correct error strings to meet Go conventions",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T02:55:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38ac23d79a0a7a0d34d6f5088573b91518619df7",
"body": "- Add .golangci.yml with recommended linters\n- Replace repeated error type checks with isErrorType helper\n- Fix fmt.Errorf to use %w for error wrapping\n- No functional changes",
"is_bot": false,
"headline": "chore: add golangci-lint config and refactor error handling",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T02:39:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc73593ff48cd99d0106cdc80d399d1355e33df8",
"body": "duplication\n\n- Add stripGenericIndexes to peel IndexExpr and IndexListExpr from AST\n expressions\n- Refactor resolveFunctionObject and extractGenericArgStr to use it\n- No functional changes",
"is_bot": false,
"headline": "refactor(extractor): extract generic index stripping to eliminate",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T02:05:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a71dd18fd170b7670df8c6c030f62679aad3bb01",
"body": "- Add newExtractedArg to unify ExtractedArg creation in handleFuncLit\n- Add addPkgToUsed to simplify package dependency collection\n- Add buildExtractedParams to replace buildArgInfo +\n buildParamsFromSignature\n- Refactor handleFuncLit, handleInvoke, handleProvide to use helpers\n- Inline replaceTypeNames logic into applyTypeAliasReplacements\n- No functional changes; generated code remains identical",
"is_bot": false,
"headline": "refactor(extractor): reduce code duplication with helper functions",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T02:01:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b81983b02f454a3b65ee96d380db256f1ba7ac2",
"body": "maintainability\n\n- Merge writeProviderStatement and handleUnusedProvider into a unified\n writeProvider with a 'blank' parameter\n- Extract buildCallArgs to build argument lists consistently\n- Use headerTemplate constant for file header to ease future changes\n- Extract getPkgAlias to simplify import \n[…]\nrateProvider logic into writeProviders to avoid\n duplicate checks\n- Align invoke call expression construction with provider logic\n- All changes are non-functional, preserving generated output exactly",
"is_bot": false,
"headline": "refactor(generator): optimize code structure for readability and",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-02T01:14:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fee8808ce4e54304b06b4d4d9e68bd2f07ab1150",
"body": "redundant loop\n\n- Remove outer `for changed` loop: since replaced aliases never match\n any package path, a single pass over all pairs is sufficient\n- Replace main package prefix using `strings.ReplaceAll` directly,\n removing unnecessary `strings.Contains` loop\n- Keep all sorting and substitution rules unchanged, ensuring identical\n output\n- Reduce worst-case string operations from O(k·n·m) to O(n·m), where k\n is the iteration count",
"is_bot": false,
"headline": "perf(extractor): optimize replacePkgPathWithAlias by eliminating",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T13:46:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7d56b1440b7be49fd1e29ae28efdd27db9f7a2d3",
"body": "type segment [T1, T2]\nExtend model.Node with GenericArgs field to pass generic info to code\ngenerator\nRewrite extractGenericArgStr: only parse IndexExpr/IndexListExpr\nindices, strip function identifier prefix\nUpdate generator render logic for provider/unused-provider/invoke\nstatements to append generic args\nReuse replacePkgPathWithAlias for every generic sub-type, resolve\ncross-package full path syntax issue",
"is_bot": false,
"headline": "Extend extractedItem with GenericArgsStr to store cleaned pure generic",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T10:03:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "51e7a28b5b80f54f3a23a6389b155a773cca41f2",
"body": "- Replace scattered parameter slices (ArgTypes, IsConstArg, etc.) with\n unified\n Params and ClosureParams using ExtractedArg embedding model.Arg.\n- Add IsTypeParam flag to skip generic type parameters in dependency\n graph.\n- Restore isContextType to string comparison for reliable\n context.Contex\n[…]\ntion layer to surface processing\n failures.\n\nThis refactor eliminates data duplication and makes parameter metadata\neasier to\nmaintain, while fixing missing context and generic type parameter\nerrors.",
"is_bot": false,
"headline": "refactor(model): aggregate parameter fields and improve error logging",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T08:45:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5dc81c49ea5af7531f85718d35761c2c84e122a3",
"body": "duplication\n\n- Move diPkgPath and tagBuild constants to model package for shared\n access\n- Move fullFuncName, shortName, longName helpers to model package as\n Node methods\n- Remove duplicate definitions from extractor and generator packages\n- Replace all references with unified implementations",
"is_bot": false,
"headline": "refactor: extract constants and common helper functions to eliminate",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T07:18:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05f9a601b98a4fef995d5f317baff908aa1fafca",
"body": "duplication\n\n- Move diPkgPath and tagBuild constants to model package for shared\n access\n- Move fullFuncName, shortName, longName helpers to model package as\n Node methods\n- Remove duplicate definitions from extractor and generator packages\n- Replace all references with unified implementations",
"is_bot": false,
"headline": "refactor: extract constants and common helper functions to eliminate",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T07:18:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "da03e4fbc50a3f62adef31205bd1538717346a6a",
"body": null,
"is_bot": false,
"headline": "refactor: remove useless migration placeholder comments",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T04:06:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "08c86d157618eed8ee0cde5a98b413b0b6eb9786",
"body": null,
"is_bot": false,
"headline": "fix: restore always-output for summary log",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T03:54:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c8d402365cb3d490913a9ec38ed91c35a8b4728b",
"body": "generation and bootstrap refactoring\n\n- Fix syntax errors (e.g., missing ',' in parameter list) caused by\n using full package paths for cross-package types in generated closure\n functions (func literals). Now type references in closure parameters\n and return values correctly use package aliases o\n[…]\nompositions;\n generated code compiles and runtime dependency injection works as\n expected.\n- Added unit tests covering closures with pointer, slice, and custom\n struct types from external packages.",
"is_bot": false,
"headline": "fix(extractor): resolve cross-package type references in closure",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-07-01T02:40:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "285b46f120adb40bcbcac9947fc534c53227200c",
"body": "closures\n\nPreviously, both `dig_invoke_` and `dig_provider_` closures shared the\nglobal `items` index for their numeric suffix. This caused\nnon‑sequential\nnumbers (e.g., `dig_invoke_5` when only two invokes exist) and made it\nharder to distinguish closure types at a glance.\n\nThis change introduces s\n[…]\nnterleaved)\n- After: `dig_invoke_1`, `dig_provider_1`, `dig_invoke_2` (clean &\n grouped)\n\nNo functional changes are introduced; only the naming convention is\nupdated for better developer experience.",
"is_bot": false,
"headline": "refactor(digen): use independent counters for invoke and provider",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-30T07:42:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8b9dbd68f2794dac50671783c6eb7b8490c73935",
"body": "Replace the cryptic `__i_` and `__p_` prefixes with more descriptive\n`dig_invoke_` and `dig_provider_`. This makes it easier to identify\nthe purpose of generated functions in logs and stack traces, especially\nduring debugging or when multiple closures are present.\n\nNo functional changes are introduced; only the naming convention is\nupdated. The new prefixes remain unlikely to conflict with user code.",
"is_bot": false,
"headline": "refactor(digen): improve readability of generated closure names",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-30T07:27:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c53e5ea8478f35b3879760aca552f5a50a5691a",
"body": "Previously, the generated InitApp function had no parameters, forcing\nusers to supply all dependencies via package-level variables or explicit\ndig.Supply calls. This commit allows the original function (containing\ndig.Build) to accept arguments, which are then automatically registered\nas implicit Su\n[…]\nStore),\ndig.Provide(deduper.NewDeduper),\n)\n}\nWill generate:\nfunc InitApp(opts *deduper.Options) func(context.Context) error {\nv0 := opts\nv1 := storage.NewStore()\nv5 := deduper.NewDeduper(v1, v0)\n...\n}",
"is_bot": false,
"headline": "feat: support function arguments as implicit dig.Supply providers",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-30T06:55:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c0a9b9d1870e3c9a6d1a35929f1f72ff3bbc07f4",
"body": "When a supply expression references a variable from another package\n(e.g.,\nctx.AppOpts), the package path was collected but not propagated to the\ngenerated node's UsedPkgs field. This caused the import statement to be\nomitted, leading to compilation errors.\n\nAdd assignment of it.UsedPkgs to Node.UsedPkgs in buildSupplyNode to\ninclude the required package in the generated code's import block.",
"is_bot": false,
"headline": "fix(digen): ensure imported packages for supply expressions are included",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-30T05:47:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bff12b987baf19f8ee37a1745c500bc54ff57ae",
"body": "Previously, digen did not enforce the expected return signature for\nanonymous functions passed to dig.Invoke, allowing invalid forms such\nas (T, error) or non-error single returns. This could result in\ngenerated code with mismatched return types, causing compilation\nerrors or silent failures.\n\nAdd a\n[…]\n check\ninto both handleInvoke (for named functions) and handleFuncLit (for\nanonymous closures). The generator now rejects illegal Invoke\nsignatures during code generation, preventing malformed output.",
"is_bot": false,
"headline": "fix(digen): validate return signature of dig.Invoke closures",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-30T02:33:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9cea9db087cf859503772b6ae9778dc12fd15247",
"body": null,
"is_bot": false,
"headline": "代码优化",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-30T02:12:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8275fdf51f411144efb144e6bcbc57e56d4982e7",
"body": "- Revert go.mod module path from github.com/shanjunmei/dig/v2 back to\n github.com/shanjunmei/dig\n- Update diPkgPath constant accordingly",
"is_bot": false,
"headline": "revert: remove v2 suffix from module path",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T09:47:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "994342f025e597983fcf912c28dc1db588499e4e",
"body": "1. Update import paths: dig/pkg/* → dig/v2/pkg/*\n2. Modify constant diPkgPath to v2 module root address\n3. Fix module reference address in generated code header comment\n\nFix the issue where digen fails to scan dig.Build markers after\nupgrading dig to v2",
"is_bot": false,
"headline": "feat(digen): fully adapt dig v2 /v2 module path",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T09:31:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b941e961e5c156af44feb5d1cd19ece8c02f77a9",
"body": "- Add usage examples for `digen ./...` to generate all sub-packages\n- Clarify `-out` flag is ignored in multi-package mode\n- Update both English and Chinese versions",
"is_bot": false,
"headline": "docs(readme): document recursive package generation via digen ./...",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T08:38:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2d649cc08d52890be29fa558dd0755aad24ea67",
"body": "- Extend `digen` to accept `./...` pattern to generate for all\n sub-packages\n- Load packages via `packages.Load` with path args, fallback to current\n directory\n- Each package generates `dig_gen.go` in its own directory\n- Multi-package mode ignores `-out` flag\n- Display source file -> generated file per package\n- Show total packages, success count, failed count in summary\n- Maintains backward compatibility: `digen` alone still processes\n current package",
"is_bot": false,
"headline": "feat(digen): support recursive package generation with ./...",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T08:22:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4279bd7c1b2c6a8b52537b426ebf7a84e994348e",
"body": "- Extend `digen` to accept `./...` pattern to generate for all\n sub-packages\n- Load packages via `packages.Load` with path args, fallback to current\n directory\n- Each package generates `dig_gen.go` in its own directory\n- Multi-package mode ignores `-out` flag\n- Display source file -> generated file per package\n- Show total packages, success count, failed count in summary\n- Maintains backward compatibility: `digen` alone still processes\n current package",
"is_bot": false,
"headline": "feat(digen): support recursive package generation with ./...",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T08:21:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "932e53a9d2915a6b3dd11bfac29912b0d873cb23",
"body": "- Replace string-based type comparison with robust types.Named lookup in\n isContextType\n- Sync README and README_zh.md with latest usage examples and\n constraints\n- Minor code and doc cleanup for consistency",
"is_bot": false,
"headline": "feat: improve type checking and update documentation",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T07:41:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3c8d87d9f8389ffbc5f7ec03315fb85f7cff21af",
"body": "The function signature incorrectly declared both originFuncName and\nunusedMode as UnusedMode. Change to (originFuncName string, unusedMode\nUnusedMode).",
"is_bot": false,
"headline": "fix: correct writeMainFunc parameter types",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T06:08:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "587aa22ce94ecf7c00b0518c159e179e5003b86f",
"body": null,
"is_bot": false,
"headline": "fix: remove unused App interface definition",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T06:06:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "055b79c1393501cbd0fb10ad11c6f8b513ff61d8",
"body": "- Remove unused `defaultDigAlias` constant\n- Remove unnecessary `currentFile` assignment in `findInjectorFunctions`\n- Simplify `usedPkgSet` capacity and remove commented `diPath` import\n- Remove `diAlias` handling from `generateCode` and `writeGeneratedCode`\n- Simplify `writeMainFunc` signature by removing unused `diAlias`\n parameter\n- Update `writeImports` to no longer treat dig package specially\n- General code cleanup and comment updates",
"is_bot": false,
"headline": "refactor: clean up unused code and simplify after App removal",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T05:57:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f365d312653acb7062ed5f4c784f08fddf8a7e6e",
"body": "BREAKING CHANGE: The generated Init() function now returns\nfunc(context.Context) error instead of *dig.App or dig.App.\nThis removes the need to import the dig package in the generated code.\n\n- Generator: validateReturnType now checks for func(context.Context)\n error.\n- Generator: writeMainFunc gene\n[…]\nig.App type (if present) from runtime library.\n\nThis reduces binary size, eliminates runtime type dependency, and keeps\nthe\ngenerated code self-contained. Users now call Init() directly as a\nfunction.",
"is_bot": false,
"headline": "refactor!: eliminate runtime dependency by returning bare closure",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T05:45:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0322ea19560102a7659e07cbbe7d2a6866d748fa",
"body": "- Move alias generation logic from cmd/digen to pkg/alias\n- Split strategies into separate files: alias.go (interface,\n short/full),\n alias_obf.go (obfuscated), alias_numeric.go (numeric)\n- Add pkg/functional with generic Map/Reduce/Keys utilities\n- Update main.go imports and usage accordingly\n- Remove unused alias.go, alias_obf.go, util.go from cmd/digen",
"is_bot": false,
"headline": "refactor: extract alias strategies and functional helpers into pkg/",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-26T03:38:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "664b555379c7cc1bede8f641c692ec1ab257bf50",
"body": "- Clarify where conditional logic works (inside Provide/Invoke closures)\n and where it doesn't (Module function body)\n- Add classic conditional injection example (MySQL vs Redis)\n- Emphasize using build tags for compile-time module selection\n- Update module organization examples with nested modules and\n composition\n- Include warnings against IIFE patterns inside Module arguments",
"is_bot": false,
"headline": "docs(readme): add closure constraints and conditional logic guidance",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T13:40:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68393c0a8fdc4ff22eed37e89865a4f9def9d31a",
"body": "- Only report capture errors for non-package-level variables and\n constants\n- Skip built-in constants (true/false) and package-level functions\n (e.g., fmt.Println)\n- Remove misleading \"or use dig.Supply\" from error message\n- Prevents generation of invalid code referencing undefined local\n symbols",
"is_bot": false,
"headline": "fix(generator): correctly validate closure free variable/constant scope",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T12:17:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a84373dfee11f5d104fa2cae27e145c1f1edd8e",
"body": "- Split into Basic/Advanced Usage with complete examples\n- Add closure constraint root-cause explanation and observability guide\n\n- Document module nesting with dig.Module and pure ASCII tree\n- Add language cross-references and objective comparison table",
"is_bot": false,
"headline": "docs(readme): restructure and enhance documentation",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T10:05:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c06fd59d25e35674a199eaa5898b79d3ecb10aba",
"body": "examples\n\n- Split README into Basic Usage and Advanced Usage sections for clarity\n- Add detailed coverage of all core features with runnable examples:\n - Basic: Build, Provide, Supply, Invoke with error handling\n - Advanced: Wrapper types, closure constraints (with root-cause\n explanation)\n - \n[…]\ncode generation vs\n reflection)\n- Provide both English and Chinese versions\n- Include generation commands and flag usage in context\n- Fix module nesting warning: avoid duplicate provider registration",
"is_bot": false,
"headline": "docs(readme): completely rewrite documentation with comprehensive",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T09:55:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ec4bc6468aaf0e19a4b3bae7c92d4667bd1edec1",
"body": "config",
"is_bot": false,
"headline": "chore: introduce .gitattributes for file text/binary & line ending",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T09:01:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69fad3db9e4c6893544e25b7130d69e1db565e8c",
"body": "simplify log labels\n\n- Remove hard-coded tab characters (`\\t`) from code generation, as final\n code is formatted by `format.Source`; manual indentation is no longer\n needed.\n- Add `-alias` flag with three strategies:\n - `short`: last segment only, append numbers on conflict (e.g.,\n handler, ha\n[…]\n1)\n- Change debug log labels from `starting/completed` to `before/after`\n for brevity and clarity.\n- Introduce `AliasType` enum and `ParseAliasType` helper for better type\n safety and extensibility.",
"is_bot": false,
"headline": "refactor(generator): remove hard tabs, add alias strategies, and",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T07:19:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cee017920319de831f337a77274668eea591bfb9",
"body": "Users can now choose between two alias strategies via the -alias flag:\n- full (default): concatenates parent directories until unique, e.g.\n addr_handler\n- short: uses only the last segment, appends numbers on conflict, e.g.\n handler2\n\nDefault remains 'full' to preserve backward compatibility with existing\ngenerated code.\nUsers who prefer concise aliases can opt into 'short' mode.",
"is_bot": false,
"headline": "feat: add -alias flag to select package alias generation strategy",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-25T03:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b089be3716b51ac328e25438dd30678451f81c4a",
"body": "- Merge duplicate ident handling in collectTypeNameAndUsedPkgs:\n Reduce redundant type assertions and ObjectOf calls during AST\n traversal,\n improving performance and code clarity.\n\n- Add logs for unused providers in handleUnusedProvider:\n When -debug is enabled, unused providers (generated with\n[…]\n_ =` in\n -unused=ignore mode) now also output [PROVIDE] starting/completed\n logs,\n providing full visibility into all providers in the dependency graph,\n regardless of whether they are referenced.",
"is_bot": false,
"headline": "feat(digen): improve observability and performance for provider handling",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T13:44:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8cc18850223ea55e05282542363e475ea1dff915",
"body": "optimizations, and alias preservation\n\n- **Observability**: Inject startup logs (PROVIDE/INVOKE/SUPPLY phases)\n into generated code with user-overridable Logf variable, enabling\n custom log formats without modifying generation logic\n\n- **Performance**: Add type string cache, merge AST traversals\n \n[…]\n use mainPkgPath for correct log\n display, preserve user-defined import aliases (drp, prp, cpay, i18n,\n etc.) that were lost during refactoring, add original package comments\n on generated closures",
"is_bot": false,
"headline": "feat(digen): enhance code generation with startup logs, performance",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T10:39:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed427319a45d337bf3d8aa44bd0ff73752cf7b34",
"body": "- Split single-line return into explicit empty PkgPath early return\n branch\n- Logic unchanged, output identical, only code formatting adjustment",
"is_bot": false,
"headline": "refactor: restructure longName with early return for better readability",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T09:05:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a7b81f770d4b42e3f673e86631843d2e916e6b3",
"body": "The UnusedMode field was never used inside the extractor logic.\nAll unused provider handling is done in the main flow. Removing it\nsimplifies the code and reduces unnecessary coupling.",
"is_bot": false,
"headline": "refactor(digen): remove unused UnusedMode field from Extractor",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T07:08:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "314eef47c1a4589d3ec4317494c1aea68b46f1a1",
"body": "Change panic message from \"godi: Build called...\" to \"dig: Build\ncalled...\"\nto match the actual package name and avoid confusion.",
"is_bot": false,
"headline": "fix(dig): correct package name in Build panic message",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T05:43:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c42a9619a1937dddfbefd743aa638d9e1b57a1e9",
"body": "Previously, the unused provider error used only the package alias\nand function name, which could be ambiguous when multiple packages\nuse the same alias. Now use longName (pkgPath.Func) to provide\nunambiguous identification of the unused provider.",
"is_bot": false,
"headline": "fix(digen): use full package path in unused provider error message",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T04:34:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f4bf5284c9d2e4c928a09fbb6f5f7fb326e6bf0",
"body": "When a closure (__p_*, __i_*) is moved to the current package, its\noriginal\npackage path is lost in logs. Add a comment above the closure definition\nto retain this information for debugging purposes.",
"is_bot": false,
"headline": "feat(digen): add original package path comment on generated closures",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T03:58:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47c56bf698bccd47d7cbeb84fa3b27cbce769020",
"body": "Closure functions (__p_*, __i_*) are generated in the current package,\nso their PkgPath should be mainPkgPath instead of the imported package\npath.\nThis fixes log output showing incorrect package names for closures.",
"is_bot": false,
"headline": "fix(digen): set correct PkgPath for closure nodes",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T03:54:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab03bf0a3c9ed5b30611f0b82944018a5d5645d1",
"body": null,
"is_bot": false,
"headline": "optimize supply log mesage",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T02:17:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c2103857f61c027d50f3c1362d944b2e7b7deb9",
"body": "duplication\n\n- Add shortName(node) returning package alias + function name for call\n generation\n- Add longName(node) returning package path + function name for log\n display\n- Replace inline calculations in writeProviderStatement, writeInvokes,\n and handleUnusedProvider\n- Fix closure PkgPath to use mainPkgPath so logs show correct package\n for generated functions\n- Improves maintainability and consistency across logging and code\n generation",
"is_bot": false,
"headline": "refactor(digen): extract shortName and longName helpers to eliminate",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T01:47:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ad552594ca96bbb24a9b39cabf208322bca3b21",
"body": "Change log output for non-supply providers and invokes to use the\ncomplete\npackage path (e.g., \"dig.example/role.NewDB\") instead of the package\nalias\n(e.g., \"dig.NewDB\"). This provides more context and aligns with the\nexisting\nsupply logs which already display the full type path.\n\nThe generated function calls remain unchanged, using either the package\nalias\nor the closure function name to ensure correct compilation.",
"is_bot": false,
"headline": "feat(digen): show full import path in provider/invoke logs",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T01:29:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "023ec2801b5138d7178489c76304140620463fa3",
"body": "Previously, `buildSupplyNode` did not populate the `RetType` field of\nthe\n`Node` struct, causing supply logs to show an empty type name in\n`[PROVIDE] starting: supply %s` and `completed` logs.\n\nNow, `it.RetType` is assigned to `RetType`, so the full type path is\ncorrectly displayed in generated logs.",
"is_bot": false,
"headline": "fix(digen): set RetType for supply nodes to fix empty log messages",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-24T01:18:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e7c579ee984fc9749bd85672834e22f3a297205",
"body": "- Reuse existing -debug flag to control log injection in generated code\n- Generate `var Logf = log.Printf` when -debug is enabled, allowing\n runtime override\n- Add emitLog helper to unify Logf call generation, eliminating manual\n format string拼接\n- Inject start/complete/failed logs for all Provider\n[…]\nlly observable and gives users complete\ncontrol\nover log output (e.g., JSON format, file output, custom loggers) by\nsimply\noverriding Logf in main() without changing generated code or init\nsignatures.",
"is_bot": false,
"headline": "feat(digen): inject startup logs with overridable Logf using -debug flag",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T13:46:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e2960e6c3331bd5b17a0264c762e1538a90cf539",
"body": "Previously collectUsedPkgsFromBody only collected packages of type\nnames,\nmissing imports needed for function calls (e.g., fmt.Println). Now it\ncollects from any identifier's object package, ensuring all required\npackages are imported.",
"is_bot": false,
"headline": "fix: collect packages from all identifiers in closure bodies",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T05:45:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "923a8bc44fa3604bdd8eaf9f2f3da3f6ebc6ed8e",
"body": "- Extend fmt.Printf log to output file path + execution time cost\n- Show human-readable duration for code generation performance\n observation",
"is_bot": false,
"headline": "refactor(digen): add generation elapsed time in success print message",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T02:43:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d1fd86e50136c818bf3015bebe96d15a1d0fc0c3",
"body": "Remove diPath and diAlias parameters from writeImports function\nand update its callers accordingly, as these parameters were never\nused within the function body.",
"is_bot": false,
"headline": "refactor: remove unused parameters from writeImports",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T02:32:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24a4b6851763e099b2dd0665ce1de027af95c37e",
"body": "unused params\n\n- Move unused provider check from buildFinalNodes to main to keep node\n construction\n focused and separate from policy decisions.\n- Compute refCount once in main and pass it through the generation\n chain,\n avoiding duplicate loops across check and generate stages.\n- Merge usedPkgS\n[…]\nonly emit `_ =` statements for ignore\n mode.\n\nThese changes improve code clarity, reduce duplication, and make the\nextraction–checking–generation pipeline more maintainable with no\nfunctional impact.",
"is_bot": false,
"headline": "refactor: streamline generation pipeline, eliminate redundant loops and",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T02:25:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "66e07377054d0d8c7078f3a81f0f87d774b91e0b",
"body": "- Remove unused provider check from buildFinalNodes to keep it focused\n on node construction.\n- Calculate refCount in main after nodes are built and pass it to\n generation functions.\n- Eliminate duplicate refCount loops (previously computed in both check\n and generate stages).\n- Adjust signatures\n[…]\ns on\n unusedMode.\n- Improve separation of concerns: extraction, checking, and generation\n are now distinct steps.\n\nNo behavioral changes; purely a structural improvement for clarity and\nperformance.",
"is_bot": false,
"headline": "refactor: compute refCount once and move unused check to main",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T02:06:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "50d646e8e9dbea91ef36d768905fb3e0fc56e220",
"body": null,
"is_bot": false,
"headline": "代码结构优化",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-23T01:51:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93650b74d42c4e9a167a7b699334153a729c2c8c",
"body": "Previously, when using -unused=drop, closure definitions for unused\nproviders\nwere still emitted in the generated code, even though their invocations\nwere\ndropped. This caused dead code to remain.\n\nThis change:\n- Moves flag variables to main() to reduce package-level globals.\n- Refactors writeClosur\n[…]\nunctions to avoid duplicate\n counting.\n- Cleans up duplicate code with helper functions.\n\nNow, all three unused modes (error, ignore, drop) behave consistently\nfor both normal providers and closures.",
"is_bot": false,
"headline": "fix(digen): remove unused closure providers in drop mode",
"author_name": "MiaoMiao Li",
"author_login": "shanjunmei",
"committed_at": "2026-06-22T09:06:30Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 12,
"commits_last_year": 123,
"latest_release_at": "2026-07-18T03:06:57Z",
"latest_release_tag": "v1.0.11",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 6,
"days_since_latest_release": 10,
"mean_days_between_releases": 2.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/shanjunmei/dig",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/shanjunmei/dig",
"is_deprecated": false,
"latest_version": "v1.0.11",
"repository_url": "https://github.com/shanjunmei/dig",
"versions_count": 12,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-18T02:51:15Z",
"latest_version_yanked": null,
"days_since_latest_publish": 10
}
]
},
"popularity": {
"forks": 3,
"stars": 46,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-07-07",
"count": 1
},
{
"date": "2026-07-21",
"count": 1
},
{
"date": "2026-07-27",
"count": 1
}
],
"complete": true,
"collected": 3,
"total_forks": 3
},
"star_history": null,
"open_issues_and_prs": 1
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"example"
],
"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": 62774,
"source_files_sampled": 31,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 3,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "golang.org/x/tools",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.46.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "golang.org/x/tools",
"direct": true,
"version": "v0.46.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/mod",
"direct": false,
"version": "v0.37.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sync",
"direct": false,
"version": "v0.21.0",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 3,
"direct_count": 1,
"indirect_count": 2
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 1,
"closed_ratio": 0.667,
"closed_issues": 2,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "shanjunmei",
"commits": 124,
"avatar_url": "https://avatars.githubusercontent.com/u/9591051?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": false,
"has_tests": false,
"ci_workflows": [],
"has_docs_dir": false,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"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": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"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": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "26e059957bdc7f7a1c70a011b99a6669e32a6177",
"ran_at": "2026-07-28T10:57:08Z",
"aggregate_score": 2.6,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": [
{
"number": 7,
"created_at": "2026-07-28T06:00:55Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/shanjunmei/dig",
"host": "github.com",
"name": "dig",
"owner": "shanjunmei"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 49,
"inputs": {
"security": 41,
"vitality": 75,
"community": 39,
"governance": 47,
"engineering": 36
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 75,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"commits_last_year": 123,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 6
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "6/52 weeks with commits",
"points": 4.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 6
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "123 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 123
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"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": 12,
"latest_release_tag": "v1.0.11",
"releases_from_tags": false,
"days_since_latest_release": 10,
"mean_days_between_releases": 2.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "12 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 12
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 10 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 10
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~2.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 2.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 39,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 29,
"inputs": {
"forks": 3,
"stars": 46,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "46 stars",
"points": 26.8,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 46
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "3 forks",
"points": 2.5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 3
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 47,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 51,
"inputs": {
"merged_prs": 0,
"open_issues": 1,
"closed_issues": 2,
"issue_closed_ratio": 0.667,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "67% of issues closed",
"points": 31.2,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 67
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 44,
"inputs": {
"followers": 0,
"owner_type": "User",
"is_verified": null,
"owner_login": "shanjunmei",
"public_repos": 85,
"account_age_days": 4281
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "0 followers of shanjunmei",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "shanjunmei"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "85 public repos, account ~11 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 85
}
},
{
"code": "account_age_years",
"params": {
"years": 11
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/shanjunmei/dig"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 10
},
"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 10 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 10
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "12 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 12
}
}
],
"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": "at_risk",
"name": "Engineering Quality",
"value": 36,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "critical",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 20,
"inputs": {
"has_ci": false,
"has_tests": false,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"code-generation",
"dependency-injection",
"di",
"dig",
"fx",
"go",
"golang",
"microservices",
"modular",
"wire",
"framework",
"wire-alternative"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 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": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "12 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 12
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 41,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 26,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 2.6
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"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": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"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 3 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": 3
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 3,
"unassessed_packages": 0,
"affected_by_severity": "none",
"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": 3,
"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
}
]
}
],
"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": 53,
"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.92,
"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": "92 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 92,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 50,
"inputs": {
"has_nix": false,
"has_tests": false,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"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": 0,
"status": "missed",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"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": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 62774,
"source_files_sampled": 31,
"oversized_source_files": 1
},
"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": "1/31 source files over 60KB",
"points": 53.2,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 31,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"example"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "example",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "example"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-28T10:57:13.310597Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/shanjunmei/dig.svg",
"full_name": "shanjunmei/dig",
"license_state": "standard",
"license_spdx": "MIT"
}