{"id":"069627b5-16e9-4fcc-a0ff-de5db13300e2","shortId":"pPjnDL","kind":"skill","title":"golang-uber-dig","tagline":"Implements dependency injection in Golang using uber-go/dig — reflection-based container, Provide/Invoke, dig.In/dig.Out parameter and result objects, named values, value groups, optional dependencies, scopes, and Decorate. Apply when using or adopting uber-go/dig, when the codeb","description":"**Persona:** You are a Go architect wiring an application graph with dig. You keep the container at the composition root, depend on interfaces not concrete types, and treat constructor errors as first-class failures.\n\n# Using uber-go/dig for Dependency Injection in Go\n\nReflection-based DI toolkit, designed to power application frameworks (it is the engine behind `uber-go/fx`) and resolve object graphs during startup.\n\n**Official Resources:**\n\n- [pkg.go.dev/go.uber.org/dig](https://pkg.go.dev/go.uber.org/dig)\n- [github.com/uber-go/dig](https://github.com/uber-go/dig)\n\nThis skill is not exhaustive. Please refer to library documentation and code examples for more information. Context7 can help as a discoverability platform.\n\n```bash\ngo get go.uber.org/dig\n```\n\n## dig vs. fx\n\nfx is built on dig and shares the same container engine — the DI primitives (`Provide`, `Invoke`, `In`/`Out` structs, named values, value groups) are identical. `fx.In`/`fx.Out` are re-exports of `dig.In`/`dig.Out`.\n\nWhat fx adds on top of dig:\n\n| Concern | dig | fx |\n| --- | --- | --- |\n| DI container | ✅ `dig.New()` | ✅ (embedded) |\n| Lifecycle hooks | ❌ | ✅ `fx.Lifecycle` OnStart/OnStop |\n| Module system | ❌ | ✅ `fx.Module` with scoped decorators |\n| Signal-aware run loop | ❌ | ✅ `app.Run()` blocks on SIGINT/SIGTERM |\n| Structured event logging | ❌ | ✅ `fx.WithLogger` / `fxevent` |\n| Startup/shutdown timeout | ❌ | ✅ `fx.StartTimeout` / `fx.StopTimeout` |\n\n**Choose dig** when you need the wiring graph only: CLI tools, libraries exposing a container to callers, test harnesses, or embedding DI into an existing app that manages its own lifecycle.\n\n**Choose fx** for long-running services (HTTP servers, workers, daemons) — lifecycle and signal handling are non-negotiable there. See `samber/cc-skills-golang@golang-uber-fx` skill.\n\n## Container\n\n```go\nimport \"go.uber.org/dig\"\n\nc := dig.New()\n```\n\nUseful options: `dig.DeferAcyclicVerification()` (faster startup), `dig.RecoverFromPanics()` (turn panics into `dig.PanicError`), `dig.DryRun(true)` (validate without invoking).\n\n## Provide and Invoke\n\n```go\n// Register a constructor — lazy, only runs when its output is needed\nerr := c.Provide(func(cfg *Config) (*sql.DB, error) {\n    return sql.Open(\"postgres\", cfg.DSN)\n})\n\n// Pull a service out of the container by asking for it as a function parameter\nerr = c.Invoke(func(db *sql.DB) error {\n    return db.Ping()\n})\n```\n\nConstructors are **lazy** and **memoized**: each output type is built once and shared (singleton per container). `Provide` errors at registration if the constructor is malformed; `Invoke` returns the constructor's error wrapped with the dependency path that triggered it.\n\nA dig constructor is any function. Inputs are dependencies, outputs are provided types. `error` (last return) signals construction failure. Follow \"accept interfaces, return structs\".\n\n## Parameter Objects with `dig.In`\n\nOnce a constructor has 4+ dependencies, embed `dig.In` to group them as struct fields and tag fields:\n\n```go\ntype HandlerParams struct {\n    dig.In\n\n    Logger *zap.Logger\n    DB     *sql.DB\n    Cache  *redis.Client `optional:\"true\"`           // zero value if not provided\n    DBRO   *sql.DB       `name:\"readonly\"`           // named dependency\n    Routes []http.Handler `group:\"routes\"`           // value group\n}\n\nfunc NewHandler(p HandlerParams) *Handler { /* ... */ }\n```\n\nTags: `name:\"...\"`, `optional:\"true\"`, `group:\"...\"`.\n\n## Result Objects with `dig.Out`\n\nReturn several values from one constructor and attach `name`/`group` tags to results:\n\n```go\ntype ConnResult struct {\n    dig.Out\n\n    ReadWrite *sql.DB `name:\"primary\"`\n    ReadOnly  *sql.DB `name:\"readonly\"`\n}\n\nfunc NewConnections(cfg *Config) (ConnResult, error) { /* ... */ }\n```\n\n## Named Values\n\nTwo providers of the same type collide. Disambiguate with `dig.Name`:\n\n```go\nc.Provide(NewPrimaryDB,  dig.Name(\"primary\"))\nc.Provide(NewReadOnlyDB, dig.Name(\"readonly\"))\n```\n\nConsume by adding `name:\"primary\"` / `name:\"readonly\"` to a `dig.In` field.\n\n## Value Groups\n\nMany providers, one consumer slice — typical for HTTP handlers, health checks, migrations:\n\n```go\ntype RouteResult struct {\n    dig.Out\n    Handler http.Handler `group:\"routes\"`\n}\n\nfunc NewUserHandler(db *sql.DB) RouteResult { /* ... */ }\nfunc NewPostHandler(db *sql.DB) RouteResult { /* ... */ }\n\ntype ServerParams struct {\n    dig.In\n    Routes []http.Handler `group:\"routes\"`\n}\n```\n\n**Flatten** — append `,flatten` (e.g. `group:\"routes,flatten\"`) to unwrap a slice instead of nesting it. Group order is **not guaranteed**; if order matters, provide an explicit ordered slice from a single constructor.\n\n## Provide as Interface (`dig.As`)\n\nRegister a concrete constructor and expose it under one or more interfaces without a separate adapter:\n\n```go\nc.Provide(NewPostgresDB, dig.As(new(Database), new(io.Closer)))\n// Consumers ask for Database or io.Closer; *PostgresDB stays hidden.\n```\n\n## Full Application Example\n\n```go\nfunc main() {\n    c := dig.New()\n\n    must(c.Provide(NewConfig))\n    must(c.Provide(NewLogger))\n    must(c.Provide(NewDatabase))\n    must(c.Provide(NewServer))\n\n    err := c.Invoke(func(srv *http.Server) error {\n        return srv.ListenAndServe()\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n\nfunc must(err error) { if err != nil { panic(err) } }\n```\n\ndig has **no built-in lifecycle**. If you need OnStart/OnStop hooks, signal handling, and graceful shutdown, use fx — see `samber/cc-skills-golang@golang-uber-fx` skill.\n\nFor Decorate, Scopes, optional deps, error helpers, and Visualize, see [advanced.md](./references/advanced.md).\n\n## Best Practices\n\n1. Keep the container at the composition root — never pass `*dig.Container` as a parameter; treat it like a plumbing detail of `main()`. Service-locator patterns defeat the testability gains of DI.\n2. Depend on interfaces, not concrete types — lets you swap implementations in tests without touching production code, and lets you use `dig.As` to expose narrow interfaces from wide structs.\n3. Prefer parameter objects (`dig.In` structs) once a constructor has 4+ dependencies — call sites stay readable and adding a new dependency is a one-line change instead of a signature break.\n4. Group registration by module (one file per module that calls `c.Provide` for its types) — review and refactoring become a per-module concern, and you can extract a module into a fx.Module later without rewriting wiring.\n5. Validate the graph eagerly in tests — call `c.Invoke` against the composition root in CI to surface missing providers at boot time, not at first request. `DryRun(true)` skips constructor execution.\n6. Return errors from constructors instead of panicking — dig wraps them with the dependency path, which makes the failure point obvious.\n\n## Common Mistakes\n\n| Mistake | Fix |\n| --- | --- |\n| Passing the container into services | The container belongs to `main()`. Inject the typed dependencies a service needs; otherwise tests need to build a real container. |\n| Two providers for the same type without `Name` | dig errors at `Provide` time. Either name them, or merge into a single provider that returns a `dig.Out` result struct. |\n| Ignoring `Provide` errors | Wrap each `Provide` with a `must` helper. A silent registration error becomes a missing-type error far later. |\n| Using groups when ordering matters | Groups are unordered. If order matters (middleware chain, migration sequence), provide an explicit ordered slice with one constructor. |\n| Constructors with side effects on import | Keep `init()` empty — start work only inside the constructor, after the graph is built. |\n\n## Testing\n\ndig containers are cheap — build a fresh one per test, override providers with `Decorate`, and call `Invoke` to drive the system. For full patterns (per-test wiring, shared helpers, graph validation in CI, asserting wire-time errors, recovering from constructor panics), see [testing.md](./references/testing.md).\n\n## Further Reading\n\n- [advanced.md](./references/advanced.md) — Decorate, Scopes, optional deps, error helpers, Visualize, full Quick Reference\n- [recipes.md](./references/recipes.md) — end-to-end examples: HTTP server with route group, two databases, request scopes, decorators, dry-run validation\n- [testing.md](./references/testing.md) — testing patterns and graph validation\n\n## Cross-References\n\n- → See `samber/cc-skills-golang@golang-uber-fx` skill for application lifecycle, modules, and signal-aware Run() built on top of dig\n- → See `samber/cc-skills-golang@golang-dependency-injection` skill for DI concepts and library comparison\n- → See `samber/cc-skills-golang@golang-samber-do` skill for a generics-based alternative without reflection\n- → See `samber/cc-skills-golang@golang-google-wire` skill for compile-time DI (no runtime container)\n- → See `samber/cc-skills-golang@golang-structs-interfaces` skill for interface design patterns\n- → See `samber/cc-skills-golang@golang-testing` skill for general testing patterns\n\nIf you encounter a bug or unexpected behavior in uber-go/dig, open an issue at <https://github.com/uber-go/dig/issues>.","tags":["golang","uber","dig","skills","samber","agent","agent-skills","antigravity","claude","claude-code","code","codex"],"capabilities":["skill","source-samber","skill-golang-uber-dig","topic-agent","topic-agent-skills","topic-antigravity","topic-claude","topic-claude-code","topic-code","topic-codex","topic-coding","topic-copilot","topic-cursor","topic-gemini","topic-gemini-cli-extension"],"categories":["cc-skills-golang"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/samber/cc-skills-golang/golang-uber-dig","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add samber/cc-skills-golang","source_repo":"https://github.com/samber/cc-skills-golang","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1725 github stars · SKILL.md body (9,122 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:03.573Z","embedding":null,"createdAt":"2026-04-29T00:52:36.426Z","updatedAt":"2026-05-18T18:53:03.573Z","lastSeenAt":"2026-05-18T18:53:03.573Z","tsv":"'/dig':14,44,87,154,297,1241 '/dig.out':22 '/fx':111 '/go.uber.org/dig](https://pkg.go.dev/go.uber.org/dig)':122 '/references/advanced.md':745,1102 '/references/recipes.md':1114 '/references/testing.md':1098,1135 '/uber-go/dig/issues':1248 '/uber-go/dig](https://github.com/uber-go/dig)':125 '1':748 '2':780 '3':809 '4':435,819,841 '5':878 '6':909 'accept':423 'ad':547,826 'adapt':648 'add':194 'adopt':40 'advanced.md':744,1101 'altern':1190 'app':259 'app.run':221 'append':598 'appli':36 'applic':56,101,667,1152 'architect':53 'ask':349,658 'assert':1087 'attach':499 'awar':218,1158 'base':17,95,1189 'bash':149 'becom':859,1001 'behavior':1236 'behind':107 'belong':941 'best':746 'block':222 'boot':898 'break':840 'bug':1233 'build':955,1057 'built':160,373,712,1051,1160 'built-in':711 'c':298,672 'c.invoke':357,687,886 'c.provide':331,537,541,650,675,678,681,684,852 'cach':457 'call':821,851,885,1068 'caller':250 'cfg':333,520 'cfg.dsn':340 'chain':1021 'chang':835 'cheap':1056 'check':568 'choos':234,265 'ci':892,1086 'class':81 'cli':243 'code':137,796 'codeb':47 'collid':532 'common':930 'comparison':1177 'compil':1202 'compile-tim':1201 'composit':66,754,889 'concept':1174 'concern':199,864 'concret':72,635,785 'config':334,521 'connresult':507,522 'construct':420 'constructor':76,321,364,386,392,405,433,497,628,636,817,907,913,1031,1032,1046,1094 'consum':545,561,657 'contain':18,63,167,203,248,292,347,379,751,936,940,958,1054,1207 'context7':142 'cross':1142 'cross-refer':1141 'daemon':275 'databas':654,660,1126 'db':359,455,581,586 'db.ping':363 'dbro':466 'decor':35,215,735,1066,1103,1129 'defeat':774 'dep':738,1106 'depend':6,32,68,89,398,411,436,471,781,820,829,922,947,1169 'design':98,1217 'detail':767 'di':96,170,202,255,779,1173,1204 'dig':4,59,155,162,198,200,235,404,708,917,967,1053,1164 'dig.as':632,652,801 'dig.container':758 'dig.deferacyclicverification':302 'dig.dryrun':310 'dig.in':21,190,430,438,452,554,592,813 'dig.in/dig.out':20 'dig.name':535,539,543 'dig.new':204,299,673 'dig.out':191,491,509,574,984 'dig.panicerror':309 'dig.recoverfrompanics':305 'disambigu':533 'discover':147 'document':135 'dri':1131 'drive':1071 'dry-run':1130 'dryrun':904 'e.g':600 'eager':882 'effect':1035 'either':972 'emb':437 'embed':205,254 'empti':1040 'encount':1231 'end':1116,1118 'end-to-end':1115 'engin':106,168 'err':330,356,686,695,698,701,704,707 'error':77,336,361,381,394,416,523,691,702,739,911,968,989,1000,1006,1091,1107 'event':226 'exampl':138,668,1119 'execut':908 'exhaust':130 'exist':258 'explicit':622,1026 'export':188 'expos':246,638,803 'extract':868 'failur':82,421,927 'far':1007 'faster':303 'field':444,447,555 'file':847 'first':80,902 'first-class':79 'fix':933 'flatten':597,599,603 'follow':422 'framework':102 'fresh':1059 'full':666,1075,1110 'func':332,358,478,518,579,584,670,688,699 'function':354,408 'fx':157,158,193,201,266,290,726,732,1149 'fx.in':183 'fx.lifecycle':208 'fx.module':212,873 'fx.out':184 'fx.starttimeout':232 'fx.stoptimeout':233 'fx.withlogger':228 'fxevent':229 'gain':777 'general':1226 'generic':1188 'generics-bas':1187 'get':151 'github.com':124,1247 'github.com/uber-go/dig/issues':1246 'github.com/uber-go/dig](https://github.com/uber-go/dig)':123 'go':13,43,52,86,92,110,150,293,318,448,505,536,570,649,669,1240 'go.uber.org':153,296 'go.uber.org/dig':152,295 'golang':2,9,288,730,1147,1168,1181,1196,1211,1222 'golang-dependency-inject':1167 'golang-google-wir':1195 'golang-samber-do':1180 'golang-structs-interfac':1210 'golang-test':1221 'golang-uber-dig':1 'golang-uber-fx':287,729,1146 'googl':1197 'grace':723 'graph':57,115,241,881,1049,1083,1139 'group':30,180,440,474,477,487,501,557,577,595,601,612,842,1010,1014,1124 'guarante':616 'handl':279,721 'handler':482,566,575 'handlerparam':450,481 'har':252 'health':567 'help':144 'helper':740,996,1082,1108 'hidden':665 'hook':207,719 'http':272,565,1120 'http.handler':473,576,594 'http.server':690 'ident':182 'ignor':987 'implement':5,790 'import':294,1037 'inform':141 'init':1039 'inject':7,90,944,1170 'input':409 'insid':1044 'instead':608,836,914 'interfac':70,424,631,644,783,805,1213,1216 'invok':173,314,317,389,1069 'io.closer':656,662 'issu':1244 'keep':61,749,1038 'last':417 'later':874,1008 'lazi':322,366 'let':787,798 'librari':134,245,1176 'lifecycl':206,264,276,714,1153 'like':764 'line':834 'locat':772 'log':227 'log.fatal':697 'logger':453 'long':269 'long-run':268 'loop':220 'main':671,769,943 'make':925 'malform':388 'manag':261 'mani':558 'matter':619,1013,1019 'memoiz':368 'merg':976 'middlewar':1020 'migrat':569,1022 'miss':895,1004 'missing-typ':1003 'mistak':931,932 'modul':210,845,849,863,870,1154 'must':674,677,680,683,700,995 'name':27,177,468,470,484,500,512,516,524,548,550,966,973 'narrow':804 'need':238,329,717,950,953 'negoti':283 'nest':610 'never':756 'new':653,655,828 'newconfig':676 'newconnect':519 'newdatabas':682 'newhandl':479 'newlogg':679 'newpostgresdb':651 'newposthandl':585 'newprimarydb':538 'newreadonlydb':542 'newserv':685 'newuserhandl':580 'nil':696,705 'non':282 'non-negoti':281 'object':26,114,428,489,812 'obvious':929 'offici':118 'one':496,560,641,833,846,1030,1060 'one-lin':832 'onstart/onstop':209,718 'open':1242 'option':31,301,459,485,737,1105 'order':613,618,623,1012,1018,1027 'otherwis':951 'output':327,370,412 'overrid':1063 'p':480 'panic':307,706,1095 'panick':916 'paramet':23,355,427,761,811 'pass':757,934 'path':399,923 'pattern':773,1076,1137,1218,1228 'per':378,848,862,1061,1078 'per-modul':861 'per-test':1077 'persona':48 'pkg.go.dev':121 'pkg.go.dev/go.uber.org/dig](https://pkg.go.dev/go.uber.org/dig)':120 'platform':148 'pleas':131 'plumb':766 'point':928 'postgr':339 'postgresdb':663 'power':100 'practic':747 'prefer':810 'primari':513,540,549 'primit':171 'product':795 'provid':172,315,380,414,465,527,559,620,629,896,960,970,980,988,992,1024,1064 'provide/invoke':19 'pull':341 'quick':1111 're':187 're-export':186 'read':1100 'readabl':824 'readon':469,514,517,544,551 'readwrit':510 'real':957 'recipes.md':1113 'recov':1092 'redis.client':458 'refactor':858 'refer':132,1112,1143 'reflect':16,94,1192 'reflection-bas':15,93 'regist':319,633 'registr':383,843,999 'request':903,1127 'resolv':113 'resourc':119 'result':25,488,504,985 'return':337,362,390,418,425,492,692,910,982 'review':856 'rewrit':876 'root':67,755,890 'rout':472,475,578,593,596,602,1123 'routeresult':572,583,588 'run':219,270,324,1132,1159 'runtim':1206 'samber':1182 'samber/cc-skills-golang':286,728,1145,1166,1179,1194,1209,1220 'scope':33,214,736,1104,1128 'see':285,727,743,1096,1144,1165,1178,1193,1208,1219 'separ':647 'sequenc':1023 'server':273,1121 'serverparam':590 'servic':271,343,771,938,949 'service-loc':770 'sever':493 'share':164,376,1081 'shutdown':724 'side':1034 'sigint/sigterm':224 'signal':217,278,419,720,1157 'signal-awar':216,1156 'signatur':839 'silent':998 'singl':627,979 'singleton':377 'site':822 'skill':127,291,733,1150,1171,1184,1199,1214,1224 'skill-golang-uber-dig' 'skip':906 'slice':562,607,624,1028 'source-samber' 'sql.db':335,360,456,467,511,515,582,587 'sql.open':338 'srv':689 'srv.listenandserve':693 'start':1041 'startup':117,304 'startup/shutdown':230 'stay':664,823 'struct':176,426,443,451,508,573,591,808,814,986,1212 'structur':225 'surfac':894 'swap':789 'system':211,1073 'tag':446,483,502 'test':251,792,884,952,1052,1062,1079,1136,1223,1227 'testabl':776 'testing.md':1097,1134 'time':899,971,1090,1203 'timeout':231 'tool':244 'toolkit':97 'top':196,1162 'topic-agent' 'topic-agent-skills' 'topic-antigravity' 'topic-claude' 'topic-claude-code' 'topic-code' 'topic-codex' 'topic-coding' 'topic-copilot' 'topic-cursor' 'topic-gemini' 'topic-gemini-cli-extension' 'touch':794 'treat':75,762 'trigger':401 'true':311,460,486,905 'turn':306 'two':526,959,1125 'type':73,371,415,449,506,531,571,589,786,855,946,964,1005 'typic':563 'uber':3,12,42,85,109,289,731,1148,1239 'uber-go':11,41,84,108,1238 'unexpect':1235 'unord':1016 'unwrap':605 'use':10,38,83,300,725,800,1009 'valid':312,879,1084,1133,1140 'valu':28,29,178,179,462,476,494,525,556 'visual':742,1109 'vs':156 'wide':807 'wire':54,240,877,1080,1089,1198 'wire-tim':1088 'without':313,645,793,875,965,1191 'work':1042 'worker':274 'wrap':395,918,990 'zap.logger':454 'zero':461","prices":[{"id":"4ce7a588-5e4f-4c1e-89ef-10b7feff9af5","listingId":"069627b5-16e9-4fcc-a0ff-de5db13300e2","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"samber","category":"cc-skills-golang","install_from":"skills.sh"},"createdAt":"2026-04-29T00:52:36.426Z"}],"sources":[{"listingId":"069627b5-16e9-4fcc-a0ff-de5db13300e2","source":"github","sourceId":"samber/cc-skills-golang/golang-uber-dig","sourceUrl":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-uber-dig","isPrimary":false,"firstSeenAt":"2026-04-29T00:52:36.426Z","lastSeenAt":"2026-05-18T18:53:03.573Z"},{"listingId":"069627b5-16e9-4fcc-a0ff-de5db13300e2","source":"skills_sh","sourceId":"samber/cc-skills-golang/golang-uber-dig","sourceUrl":"https://skills.sh/samber/cc-skills-golang/golang-uber-dig","isPrimary":true,"firstSeenAt":"2026-05-07T20:41:36.448Z","lastSeenAt":"2026-05-07T22:41:06.151Z"}],"details":{"listingId":"069627b5-16e9-4fcc-a0ff-de5db13300e2","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"samber","slug":"golang-uber-dig","github":{"repo":"samber/cc-skills-golang","stars":1725,"topics":["agent","agent-skills","ai","antigravity","claude","claude-code","code","codex","coding","copilot","cursor","gemini","gemini-cli-extension","openclaw","opencode","plugin","skills","skillsmp","vibe-coding"],"license":"mit","html_url":"https://github.com/samber/cc-skills-golang","pushed_at":"2026-05-18T17:36:00Z","description":"🧑‍🎨 A collection of Golang agentic skills that works","skill_md_sha":"a51551bd3e7a95f7389c3df1dc8c1384ccb426c7","skill_md_path":"skills/golang-uber-dig/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-uber-dig"},"layout":"multi","source":"github","category":"cc-skills-golang","frontmatter":{"name":"golang-uber-dig","license":"MIT","description":"Implements dependency injection in Golang using uber-go/dig — reflection-based container, Provide/Invoke, dig.In/dig.Out parameter and result objects, named values, value groups, optional dependencies, scopes, and Decorate. Apply when using or adopting uber-go/dig, when the codebase imports `go.uber.org/dig`, or when wiring an application graph at startup. For higher-level lifecycle and modules, see `samber/cc-skills-golang@golang-uber-fx` skill.","compatibility":"Designed for Claude Code or similar AI coding agents, and for projects using Golang."},"skills_sh_url":"https://skills.sh/samber/cc-skills-golang/golang-uber-dig"},"updatedAt":"2026-05-18T18:53:03.573Z"}}