{"id":"a11e3c11-8114-4998-92a3-53ffa8870ea5","shortId":"tdZ9CD","kind":"skill","title":"golang-uber-fx","tagline":"Golang application framework using uber-go/fx — fx.New, fx.Provide, fx.Invoke, fx.Module, fx.Lifecycle hooks, fx.Annotate (name/group/As), fx.Decorate, fx.Supply, fx.Replace, fx.WithLogger, and signal-aware Run(). Apply when using or adopting uber-go/fx, when the codebase imports","description":"**Persona:** You are a Go architect building a long-running service with fx. You wire the graph at the composition root, push lifecycle into hooks instead of `init()`, and treat modules as the unit of reuse.\n\n# Using uber-go/fx for Application Wiring in Go\n\nApplication framework combining a reflection-based DI container (built on `uber-go/dig`) with a lifecycle, module system, signal-aware run loop, and structured event logging. For long-running services where boot order, graceful shutdown, and modular composition matter.\n\n**Official Resources:**\n\n- [pkg.go.dev/go.uber.org/fx](https://pkg.go.dev/go.uber.org/fx)\n- [uber-go.github.io/fx](https://uber-go.github.io/fx/)\n- [github.com/uber-go/fx](https://github.com/uber-go/fx)\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/fx\n```\n\n## fx vs. dig\n\nfx is built on top of dig and shares the same reflection-based 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:\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 fx** for long-running services (HTTP servers, workers, daemons) — lifecycle and signal handling are mandatory there, and modules make large service graphs manageable.\n\n**Choose raw dig** when you need wiring without a framework: CLI tools, libraries that expose a container to callers, test harnesses, or embedding DI into an existing app that manages its own lifecycle. See `samber/cc-skills-golang@golang-uber-dig` skill.\n\n## The Application\n\n```go\nimport \"go.uber.org/fx\"\n\napp := fx.New(\n    fx.Provide(NewLogger, NewDatabase, NewServer),\n    fx.Invoke(RegisterRoutes),\n)\napp.Run() // blocks until SIGINT/SIGTERM, then runs OnStop hooks\n```\n\nBoot stages: `fx.New` validates types (constructors do not run); `app.Start(ctx)` runs each `fx.Invoke` and fires OnStart hooks in topological order; main blocks on `app.Done()`; `app.Stop(ctx)` fires OnStop hooks in reverse order. Default timeout is **15 seconds** — override with `fx.StartTimeout` / `fx.StopTimeout`.\n\n## Provide and Invoke\n\n```go\nfx.New(\n    fx.Provide(NewLogger, NewDatabase, NewServer),  // lazy\n    fx.Invoke(RegisterRoutes, StartMetricsExporter), // always run during Start\n)\n```\n\n`fx.Provide` registers constructors; `fx.Invoke` is the trigger — without an Invoke (directly or transitively) referencing a type, its constructor never runs.\n\n## Lifecycle Hooks\n\nInject `fx.Lifecycle` and append hooks. Constructors should return quickly; long-running work belongs in `OnStart`.\n\n```go\nfunc NewHTTPServer(lc fx.Lifecycle, log *zap.Logger, cfg *Config) *http.Server {\n    srv := &http.Server{Addr: cfg.Addr}\n\n    lc.Append(fx.Hook{\n        OnStart: func(ctx context.Context) error {\n            ln, err := net.Listen(\"tcp\", srv.Addr)\n            if err != nil { return err }\n            go srv.Serve(ln)         // blocking work in a goroutine\n            return nil\n        },\n        OnStop: func(ctx context.Context) error {\n            return srv.Shutdown(ctx)\n        },\n    })\n    return srv\n}\n```\n\nBoth callbacks receive a context bounded by `StartTimeout`/`StopTimeout` — respect cancellation. **OnStart must return quickly** — spawn a goroutine for blocking work; otherwise startup hangs and dependent hooks never fire.\n\n`fx.StartHook` / `fx.StopHook` / `fx.StartStopHook` adapt simpler signatures (no context, no error, or both):\n\n```go\nlc.Append(fx.StartStopHook(srv.Start, srv.Stop))   // matched pair\n```\n\n## Parameter and Result Objects\n\nfx re-exports dig's `dig.In` / `dig.Out` as `fx.In` / `fx.Out`. Use them when a constructor has 4+ dependencies, or when you need `name`/`group`/`optional` tags.\n\n```go\ntype ServerParams struct {\n    fx.In\n\n    Logger *zap.Logger\n    DB     *sql.DB\n    Cache  *redis.Client     `optional:\"true\"`\n    Routes []http.Handler    `group:\"routes\"`\n}\n\nfunc NewServer(p ServerParams) *Server { /* ... */ }\n```\n\n## fx.Annotate\n\n`fx.Annotate` wraps a constructor to add tags or interface bindings without a `fx.Out` struct. Prefer it for ergonomic name/group/As bindings:\n\n```go\nfx.Provide(\n    fx.Annotate(NewPrimaryDB, fx.ResultTags(`name:\"primary\"`)),\n    fx.Annotate(NewPostgresDB, fx.As(new(Database))),    // expose interface\n    fx.Annotate(NewUserHandler,\n        fx.As(new(http.Handler)),\n        fx.ResultTags(`group:\"routes\"`),\n    ),\n)\n```\n\n## Value Groups\n\nMany constructors, one consumer slice — typical for routes, health checks, metrics collectors:\n\n```go\ntype RouteResult struct {\n    fx.Out\n    Handler http.Handler `group:\"routes\"`\n}\n\ntype ServerParams struct {\n    fx.In\n    Routes []http.Handler `group:\"routes\"`\n}\n```\n\nAppend `,flatten` (`group:\"routes,flatten\"`) to unwrap a slice instead of nesting it. Order is **not guaranteed** — provide an explicit ordered slice when sequence matters.\n\n## fx.Module\n\n`fx.Module` groups providers, invokes, and decorators under a name. Modules **scope decorators** to themselves and their children — a logger renamed in `fx.Module(\"db\", ...)` only appears renamed for code inside that module.\n\n```go\nvar DatabaseModule = fx.Module(\"database\",\n    fx.Provide(NewConnection, NewUserRepository),\n    fx.Decorate(func(log *zap.Logger) *zap.Logger {\n        return log.Named(\"db\")\n    }),\n)\n\nfunc main() {\n    fx.New(\n        fx.Provide(NewConfig, NewLogger),\n        DatabaseModule,\n        HTTPModule,\n    ).Run()\n}\n```\n\nTreat each module as a small library that can be lifted into another app — its public surface is the types it Provides.\n\nFor `fx.Supply`/`fx.Replace`/`fx.Decorate`, optional deps, custom logging, manual lifecycle, and Quick Reference, see [advanced.md](./references/advanced.md).\n\n## Best Practices\n\n1. Keep `main()` thin — providers, modules, and a single `Run()`. Push real work into modules so each can be tested in isolation.\n2. Use lifecycle hooks instead of `init()` or goroutines launched from constructors — Start/Stop ordering depends on graph topology, but `init()` goroutines do not, which leads to races and leaks.\n3. OnStart must return promptly — long work goes in a goroutine inside the hook. A blocking OnStart hangs the rest of the boot.\n4. Respect `ctx.Done()` in hooks — a hook that ignores cancellation is reported as a timeout failure but its goroutine continues, leaking resources.\n5. Group by module, not by layer — a module owns the providers, lifecycle, and decorators for one concern (HTTP, DB, metrics).\n6. Use `fx.Annotate` for tags rather than wrapping a constructor in an `fx.Out` struct — keeps the constructor reusable outside fx.\n7. Replace `fx.Provide` with `fx.Supply` for pre-built values (config, command-line flags). Shorter, signals intent.\n8. Validate the graph in CI by booting under `fx.New(...).Err()` — catches missing providers and cycles before deploy.\n\n## Common Mistakes\n\n| Mistake | Fix |\n| --- | --- |\n| Long-running work directly in OnStart | Spawn a goroutine inside OnStart; the hook itself must return quickly so dependent hooks can run. |\n| `fx.Provide` something that should be `fx.Supply` | Pre-built values (config, secrets) belong in `fx.Supply` — clearer and avoids a no-op constructor. |\n| Module decorator leaking to siblings | Decorate inside `fx.Module(...)` — decorators flow only to descendants. A top-level `fx.Decorate` is global. |\n| Group order assumed | Groups are unordered. If order matters, provide an ordered slice from one constructor. |\n| Constructors with side effects | Side effects belong in OnStart — constructors should be cheap and pure-ish, since they may run concurrently and lazily. |\n| Forgotten `fx.Invoke` | Without an Invoke (or downstream consumer), constructors never run. Add at least one Invoke per app. |\n\n## Testing\n\nUse `go.uber.org/fx/fxtest` to integrate fx with `*testing.T` (failures call `t.Fatal`, `RequireStop` registers as `t.Cleanup`). `fx.Populate(&target)` pulls values out of the graph; `fx.Replace` swaps real dependencies for fakes. Full patterns in [testing.md](./references/testing.md).\n\n## Further Reading\n\n- [advanced.md](./references/advanced.md) — Supply/Replace/Decorate, optional deps, custom event logging, manual lifecycle, full Quick Reference\n- [recipes.md](./references/recipes.md) — full HTTP service with database/metrics, background workers with graceful drain, multiple impls of the same interface, manual lifecycle for CLI embedding\n- [testing.md](./references/testing.md) — fxtest patterns, `fx.Replace`, `fx.Populate`, isolated lifecycle tests, CI graph validation\n\n## Cross-References\n\n- → See `samber/cc-skills-golang@golang-uber-dig` skill for the underlying container, `dig.In`/`dig.Out`, and DI without lifecycle\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-context` skill for context propagation in OnStart/OnStop hooks\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/fx, open an issue at <https://github.com/uber-go/fx/issues>.","tags":["golang","uber","skills","samber","agent","agent-skills","antigravity","claude","claude-code","code","codex","coding"],"capabilities":["skill","source-samber","skill-golang-uber-fx","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-fx","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,889 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.663Z","embedding":null,"createdAt":"2026-04-29T00:52:36.502Z","updatedAt":"2026-05-18T18:53:03.663Z","lastSeenAt":"2026-05-18T18:53:03.663Z","tsv":"'/dig':104 '/fx':12,38,84,172,326,1283 '/fx/fxtest':1093 '/fx](https://uber-go.github.io/fx/)':140 '/go.uber.org/fx](https://pkg.go.dev/go.uber.org/fx)':137 '/references/advanced.md':785,1128 '/references/recipes.md':1141 '/references/testing.md':1124,1164 '/uber-go/fx/issues':1290 '/uber-go/fx](https://github.com/uber-go/fx)':143 '1':788 '15':379 '2':810 '3':839 '4':560,862 '5':884 '6':905 '7':925 '8':943 'adapt':523 'add':217,598,1082 'addr':452 'adopt':34 'advanced.md':784,1127 'altern':1220 'alway':398 'anoth':760 'app':307,327,761,1088 'app.done':367 'app.run':242,335 'app.start':352 'app.stop':368 'appear':716 'append':427,666 'appli':30 'applic':6,86,90,321 'architect':48 'assum':1033 'avoid':1005 'awar':28,112,239 'background':1147 'base':96,189,1219 'bash':167 'behavior':1278 'belong':437,1000,1053 'best':786 'bind':602,612 'block':243,336,365,474,510,854 'boot':125,343,861,950 'bound':496 'bug':1275 'build':49 'built':99,178,933,996 'cach':579 'call':1100 'callback':492 'caller':298 'cancel':501,871 'catch':954 'cfg':447 'cfg.addr':453 'cheap':1059 'check':646 'children':708 'choos':255,280 'ci':948,1172 'clearer':1003 'cli':290,1161 'code':155,719 'codebas':41 'collector':648 'combin':92 'command':937 'command-lin':936 'common':961 'comparison':1207 'compil':1232 'compile-tim':1231 'composit':63,131 'concept':1204 'concern':220,901 'concurr':1068 'config':448,935,998 'constructor':348,404,419,429,558,596,638,821,914,921,1010,1046,1047,1056,1079 'consum':640,1078 'contain':98,190,224,296,1188,1237 'context':495,527,1253,1256 'context.context':459,484 'context7':160 'continu':881 'cross':1176 'cross-refer':1175 'ctx':353,369,458,483,488 'ctx.done':864 'custom':776,1132 'cycl':958 'daemon':265 'databas':624,727 'database/metrics':1146 'databasemodul':725,745 'db':577,714,738,903 'decor':236,697,703,898,1012,1016,1019 'default':376 'dep':775,1131 'depend':516,561,824,984,1117,1199 'deploy':960 'descend':1023 'design':1247 'di':97,193,223,303,1192,1203,1234 'dig':175,182,221,282,318,547,1183 'dig.in':213,549,1189 'dig.new':225 'dig.out':214,550,1190 'direct':412,969 'discover':165 'document':153 'downstream':1077 'drain':1151 'effect':1050,1052 'embed':226,302,1162 'encount':1273 'engin':191 'ergonom':610 'err':462,467,470,953 'error':460,485,529 'event':117,247,1133 'exampl':156 'exhaust':148 'exist':306 'explicit':685 'export':211,546 'expos':294,625 'failur':877,1099 'fake':1119 'fire':358,370,519 'fix':964 'flag':939 'flatten':667,670 'flow':1020 'forgotten':1071 'framework':7,91,289 'full':1120,1137,1142 'func':441,457,482,587,732,739 'fx':4,56,173,176,216,222,256,543,924,1096 'fx.annotate':19,592,593,615,620,627,907 'fx.as':622,629 'fx.decorate':21,731,773,1028 'fx.hook':455 'fx.in':206,552,574,661 'fx.invoke':15,333,356,395,405,1072 'fx.lifecycle':17,229,425,444 'fx.module':16,233,691,692,713,726,1018 'fx.new':13,328,345,389,741,952 'fx.out':207,553,605,653,917 'fx.populate':1106,1168 'fx.provide':14,329,390,402,614,728,742,927,988 'fx.replace':23,772,1114,1167 'fx.resulttags':617,632 'fx.starthook':520 'fx.startstophook':522,534 'fx.starttimeout':253,383 'fx.stophook':521 'fx.stoptimeout':254,384 'fx.supply':22,771,929,993,1002 'fx.withlogger':24,249 'fxevent':250 'fxtest':1165 'general':1268 'generic':1218 'generics-bas':1217 'get':169 'github.com':142,1289 'github.com/uber-go/fx/issues':1288 'github.com/uber-go/fx](https://github.com/uber-go/fx)':141 'global':1030 'go':11,37,47,83,89,103,168,322,388,440,471,532,570,613,649,723,1282 'go.uber.org':171,325,1092 'go.uber.org/fx':170,324 'go.uber.org/fx/fxtest':1091 'goe':846 'golang':2,5,316,1181,1198,1211,1226,1241,1252,1264 'golang-context':1251 'golang-dependency-inject':1197 'golang-google-wir':1225 'golang-samber-do':1210 'golang-structs-interfac':1240 'golang-test':1263 'golang-uber-dig':315,1180 'golang-uber-fx':1 'googl':1227 'goroutin':478,508,818,830,849,880,974 'grace':127,1150 'graph':60,278,826,946,1113,1173 'group':203,567,585,633,636,656,664,668,693,885,1031,1034 'guarante':682 'handl':269 'handler':654 'hang':514,856 'har':300 'health':645 'help':162 'hook':18,68,228,342,360,372,423,428,517,813,852,866,868,978,985,1260 'http':262,902,1143 'http.handler':584,631,655,663 'http.server':449,451 'httpmodul':746 'ident':205 'ignor':870 'impl':1153 'import':42,323 'inform':159 'init':71,816,829 'inject':424,1200 'insid':720,850,975,1017 'instead':69,675,814 'integr':1095 'intent':942 'interfac':601,626,1157,1243,1246 'invok':196,387,411,695,1075,1086 'ish':1063 'isol':809,1169 'issu':1286 'keep':789,919 'larg':276 'launch':819 'layer':890 'lazi':394 'lazili':1070 'lc':443 'lc.append':454,533 'lead':834 'leak':838,882,1013 'least':1084 'level':1027 'librari':152,292,754,1206 'lifecycl':66,107,227,266,312,422,779,812,896,1136,1159,1170,1194 'lift':758 'line':938 'ln':461,473 'log':118,248,445,733,777,1134 'log.named':737 'logger':575,710 'long':52,121,259,434,844,966 'long-run':51,120,258,433,965 'loop':114,241 'main':364,740,790 'make':275 'manag':279,309 'mandatori':271 'mani':637 'manual':778,1135,1158 'match':537 'matter':132,690,1039 'may':1066 'metric':647,904 'miss':955 'mistak':962,963 'modul':74,108,231,274,701,722,750,793,802,887,892,1011 'modular':130 'multipl':1152 'must':503,841,980 'name':200,566,618,700 'name/group/as':20,611 'need':285,565 'nest':677 'net.listen':463 'never':420,518,1080 'new':623,630 'newconfig':743 'newconnect':729 'newdatabas':331,392 'newhttpserv':442 'newlogg':330,391,744 'newpostgresdb':621 'newprimarydb':616 'newserv':332,393,588 'newuserhandl':628 'newuserrepositori':730 'nil':468,480 'no-op':1007 'object':542 'offici':133 'one':639,900,1045,1085 'onstart':359,439,456,502,840,855,971,976,1055 'onstart/onstop':230,1259 'onstop':341,371,481 'op':1009 'open':1284 'option':568,581,774,1130 'order':126,363,375,679,686,823,1032,1038,1042 'otherwis':512 'outsid':923 'overrid':381 'own':893 'p':589 'pair':538 'paramet':539 'pattern':1121,1166,1248,1270 'per':1087 'persona':43 'pkg.go.dev':136 'pkg.go.dev/go.uber.org/fx](https://pkg.go.dev/go.uber.org/fx)':135 'platform':166 'pleas':149 'practic':787 'pre':932,995 'pre-built':931,994 'prefer':607 'primari':619 'primit':194 'prompt':843 'propag':1257 'provid':195,385,683,694,769,792,895,956,1040 'public':763 'pull':1108 'pure':1062 'pure-ish':1061 'push':65,798 'quick':432,505,781,982,1138 'race':836 'rather':910 'raw':281 're':210,545 're-export':209,544 'read':1126 'real':799,1116 'receiv':493 'recipes.md':1140 'redis.client':580 'refer':150,782,1139,1177 'referenc':415 'reflect':95,188,1222 'reflection-bas':94,187 'regist':403,1103 'registerrout':334,396 'renam':711,717 'replac':926 'report':873 'requirestop':1102 'resourc':134,883 'respect':500,863 'rest':858 'result':541 'return':431,469,479,486,489,504,736,842,981 'reus':79 'reusabl':922 'revers':374 'root':64 'rout':583,586,634,644,657,662,665,669 'routeresult':651 'run':29,53,113,122,240,260,340,351,354,399,421,435,747,797,967,987,1067,1081 'runtim':1236 'samber':1212 'samber/cc-skills-golang':314,1179,1196,1209,1224,1239,1250,1262 'scope':235,702 'second':380 'secret':999 'see':313,783,1178,1195,1208,1223,1238,1249,1261 'sequenc':689 'server':263,591 'serverparam':572,590,659 'servic':54,123,261,277,1144 'share':184 'shorter':940 'shutdown':128 'sibl':1015 'side':1049,1051 'sigint/sigterm':245,338 'signal':27,111,238,268,941 'signal-awar':26,110,237 'signatur':525 'simpler':524 'sinc':1064 'singl':796 'skill':145,319,1184,1201,1214,1229,1244,1254,1266 'skill-golang-uber-fx' 'slice':641,674,687,1043 'small':753 'someth':989 'source-samber' 'spawn':506,972 'sql.db':578 'srv':450,490 'srv.addr':465 'srv.serve':472 'srv.shutdown':487 'srv.start':535 'srv.stop':536 'stage':344 'start':401 'start/stop':822 'startmetricsexport':397 'starttimeout':498 'startup':513 'startup/shutdown':251 'stoptimeout':499 'struct':199,573,606,652,660,918,1242 'structur':116,246 'supply/replace/decorate':1129 'surfac':764 'swap':1115 'system':109,232 't.cleanup':1105 't.fatal':1101 'tag':569,599,909 'target':1107 'tcp':464 'test':299,807,1089,1171,1265,1269 'testing.md':1123,1163 'testing.t':1098 'thin':791 'time':1233 'timeout':252,377,876 'tool':291 'top':180,219,1026 'top-level':1025 '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' 'topolog':362,827 'transit':414 'treat':73,748 'trigger':408 'true':582 'type':347,417,571,650,658,767 'typic':642 'uber':3,10,36,82,102,317,1182,1281 'uber-go':9,35,81,101,1280 'uber-go.github.io':139 'uber-go.github.io/fx](https://uber-go.github.io/fx/)':138 'under':1187 'unexpect':1277 'unit':77 'unord':1036 'unwrap':672 'use':8,32,80,554,811,906,1090 'valid':346,944,1174 'valu':201,202,635,934,997,1109 'var':724 'vs':174 'wire':58,87,286,1228 'without':287,409,603,1073,1193,1221 'work':436,475,511,800,845,968 'worker':264,1148 'wrap':594,912 'zap.logger':446,576,734,735","prices":[{"id":"4ad6b96b-9eeb-4214-a1f8-164db40cf1f8","listingId":"a11e3c11-8114-4998-92a3-53ffa8870ea5","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.502Z"}],"sources":[{"listingId":"a11e3c11-8114-4998-92a3-53ffa8870ea5","source":"github","sourceId":"samber/cc-skills-golang/golang-uber-fx","sourceUrl":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-uber-fx","isPrimary":false,"firstSeenAt":"2026-04-29T00:52:36.502Z","lastSeenAt":"2026-05-18T18:53:03.663Z"},{"listingId":"a11e3c11-8114-4998-92a3-53ffa8870ea5","source":"skills_sh","sourceId":"samber/cc-skills-golang/golang-uber-fx","sourceUrl":"https://skills.sh/samber/cc-skills-golang/golang-uber-fx","isPrimary":true,"firstSeenAt":"2026-05-07T20:41:36.062Z","lastSeenAt":"2026-05-07T22:41:05.932Z"}],"details":{"listingId":"a11e3c11-8114-4998-92a3-53ffa8870ea5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"samber","slug":"golang-uber-fx","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":"16e7e90befdf4a743c44cc4bc6c52a5050744e41","skill_md_path":"skills/golang-uber-fx/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-uber-fx"},"layout":"multi","source":"github","category":"cc-skills-golang","frontmatter":{"name":"golang-uber-fx","license":"MIT","description":"Golang application framework using uber-go/fx — fx.New, fx.Provide, fx.Invoke, fx.Module, fx.Lifecycle hooks, fx.Annotate (name/group/As), fx.Decorate, fx.Supply, fx.Replace, fx.WithLogger, and signal-aware Run(). Apply when using or adopting uber-go/fx, when the codebase imports `go.uber.org/fx`, or when wiring services with fx.New. For raw DI without lifecycle, see `samber/cc-skills-golang@golang-uber-dig` 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-fx"},"updatedAt":"2026-05-18T18:53:03.663Z"}}