From ba4663e3618facdb7e4fc3755056e5ed0a540875 Mon Sep 17 00:00:00 2001 From: cplieger Date: Mon, 8 Jun 2026 10:38:23 +0200 Subject: [PATCH 1/2] refactor(module): root module at github.com/cplieger/plex-language-sync + gofumpt/gci Domainless module renamed to a domain-rooted path so gofumpt + gci [standard, default] converge. Mechanical import rewrite + formatting; build/vet/test verified. --- config.go | 52 +++++++++---------- go.mod | 2 +- internal/api/plex.go | 4 +- internal/api/users.go | 2 +- internal/cache/cache.go | 3 +- internal/cache/cache_test.go | 3 +- internal/ignore/policy.go | 6 +-- internal/ignore/policy_test.go | 13 +++-- internal/notify/classify_test.go | 3 +- internal/notify/fuzz_test.go | 2 +- internal/notify/listener_test.go | 3 +- internal/notify/predicates.go | 4 +- internal/plex/fuzz_test.go | 2 +- internal/plex/library.go | 2 +- internal/plex/types.go | 2 +- internal/scheduler/scheduler.go | 11 ++-- internal/scheduler/scheduler_test.go | 11 ++-- internal/streams/score_test.go | 19 +++++-- internal/sync/episode.go | 6 +-- internal/sync/profile.go | 4 +- internal/sync/tracks.go | 6 +-- internal/sync/tracks_test.go | 10 ++-- internal/testsupport/fakeapi/cache.go | 2 +- .../testsupport/fakeapi/cache_contract.go | 2 +- internal/testsupport/fakeapi/plex.go | 6 +-- internal/testsupport/fakeapi/users.go | 4 +- internal/users/manager.go | 4 +- internal/users/manager_test.go | 6 +-- internal/users/refresh.go | 2 +- main.go | 18 +++---- main_test.go | 8 +-- 31 files changed, 117 insertions(+), 105 deletions(-) diff --git a/config.go b/config.go index 4d811ea..38dec9d 100644 --- a/config.go +++ b/config.go @@ -17,8 +17,8 @@ import ( "path/filepath" "strings" - syncpkg "plex-language-sync/internal/sync" - "plex-language-sync/internal/timeutil" + syncpkg "github.com/cplieger/plex-language-sync/internal/sync" + "github.com/cplieger/plex-language-sync/internal/timeutil" ) // --------------------------------------------------------------------------- @@ -42,19 +42,19 @@ const ( // --------------------------------------------------------------------------- type config struct { - plexURL string - plexToken string - updateLevel string // "show" or "season" - updateStrategy string // "all" or "next" - schedulerTime string // "HH:MM" - caCertPath string - ignoreLabels []string - ignoreLibraries []string - triggerOnPlay bool - triggerOnScan bool - schedulerEnable bool - languageProfiles bool - debug bool + plexURL string + plexToken string + updateLevel string // "show" or "season" + updateStrategy string // "all" or "next" + schedulerTime string // "HH:MM" + caCertPath string + ignoreLabels []string + ignoreLibraries []string + triggerOnPlay bool + triggerOnScan bool + schedulerEnable bool + languageProfiles bool + debug bool } // loadConfig reads environment variables into a config value, applying @@ -71,17 +71,17 @@ func loadConfig() config { &slog.HandlerOptions{Level: level}))) cfg := config{ - plexURL: requireEnv("PLEX_URL"), - plexToken: requireEnv("PLEX_TOKEN"), - updateLevel: envOr("UPDATE_LEVEL", defaultUpdateLevel), - updateStrategy: envOr("UPDATE_STRATEGY", defaultUpdateStrategy), - triggerOnPlay: envBool("TRIGGER_ON_PLAY", true), - triggerOnScan: envBool("TRIGGER_ON_SCAN", true), - schedulerEnable: envBool("SCHEDULER_ENABLE", true), - languageProfiles: envBool("LANGUAGE_PROFILES", true), - schedulerTime: envOr("SCHEDULER_SCHEDULE_TIME", defaultScheduleTime), - debug: debug, - caCertPath: envOr("PLEX_CA_CERT_PATH", ""), + plexURL: requireEnv("PLEX_URL"), + plexToken: requireEnv("PLEX_TOKEN"), + updateLevel: envOr("UPDATE_LEVEL", defaultUpdateLevel), + updateStrategy: envOr("UPDATE_STRATEGY", defaultUpdateStrategy), + triggerOnPlay: envBool("TRIGGER_ON_PLAY", true), + triggerOnScan: envBool("TRIGGER_ON_SCAN", true), + schedulerEnable: envBool("SCHEDULER_ENABLE", true), + languageProfiles: envBool("LANGUAGE_PROFILES", true), + schedulerTime: envOr("SCHEDULER_SCHEDULE_TIME", defaultScheduleTime), + debug: debug, + caCertPath: envOr("PLEX_CA_CERT_PATH", ""), } if v := os.Getenv("IGNORE_LABELS"); v != "" { diff --git a/go.mod b/go.mod index 1172e03..273c28e 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module plex-language-sync +module github.com/cplieger/plex-language-sync go 1.26.4 diff --git a/internal/api/plex.go b/internal/api/plex.go index 5b7042b..8dc7620 100644 --- a/internal/api/plex.go +++ b/internal/api/plex.go @@ -10,8 +10,8 @@ package api import ( "context" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" ) // PlexReader is the read side of the Plex HTTP client as consumed by the diff --git a/internal/api/users.go b/internal/api/users.go index bb8769d..850418c 100644 --- a/internal/api/users.go +++ b/internal/api/users.go @@ -1,6 +1,6 @@ package api -import "plex-language-sync/internal/plex" +import "github.com/cplieger/plex-language-sync/internal/plex" // UserInfo is the minimal user record consumers pass across the api // spine. Mirrors internal/users.Info but uses primitive string IDs so diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 53c7e5a..48300bd 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -19,8 +19,7 @@ import ( "sync" "github.com/cplieger/atomicfile" - - "plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/api" ) // Compile-time interface satisfaction assertion. diff --git a/internal/cache/cache_test.go b/internal/cache/cache_test.go index d0d9397..de2a262 100644 --- a/internal/cache/cache_test.go +++ b/internal/cache/cache_test.go @@ -11,8 +11,7 @@ import ( "testing" "time" - "plex-language-sync/internal/testsupport/fakeapi" - + "github.com/cplieger/plex-language-sync/internal/testsupport/fakeapi" "pgregory.net/rapid" ) diff --git a/internal/ignore/policy.go b/internal/ignore/policy.go index 7d9e712..563bbc4 100644 --- a/internal/ignore/policy.go +++ b/internal/ignore/policy.go @@ -14,9 +14,9 @@ import ( "log/slog" "slices" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" ) // Compile-time interface satisfaction assertion. diff --git a/internal/ignore/policy_test.go b/internal/ignore/policy_test.go index cc0320d..21a9d7b 100644 --- a/internal/ignore/policy_test.go +++ b/internal/ignore/policy_test.go @@ -5,9 +5,9 @@ import ( "errors" "testing" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" ) func TestPolicyIgnoreLibrary(t *testing.T) { @@ -72,24 +72,31 @@ type stubReader struct { func (r *stubReader) Episode(context.Context, plex.RatingKey) (*streams.Episode, error) { panic("Episode: not used") } + func (r *stubReader) ShowEpisodes(context.Context, plex.RatingKey) ([]streams.Episode, error) { panic("ShowEpisodes: not used") } + func (r *stubReader) SeasonEpisodes(context.Context, plex.RatingKey) ([]streams.Episode, error) { panic("SeasonEpisodes: not used") } + func (r *stubReader) ShowMetadata(_ context.Context, _ plex.RatingKey) (*plex.Show, error) { return r.show, r.err } + func (r *stubReader) RecentlyAdded(context.Context, plex.RatingKey, int64) ([]streams.Episode, error) { panic("RecentlyAdded: not used") } + func (r *stubReader) History(context.Context, int64) ([]plex.HistoryItem, error) { panic("History: not used") } + func (r *stubReader) ShowSections(context.Context) ([]plex.Section, error) { panic("ShowSections: not used") } + func (r *stubReader) UserFromSession(context.Context, string) (string, string, error) { panic("UserFromSession: not used") } diff --git a/internal/notify/classify_test.go b/internal/notify/classify_test.go index c6f8f0c..5a817ee 100644 --- a/internal/notify/classify_test.go +++ b/internal/notify/classify_test.go @@ -7,8 +7,7 @@ import ( "testing" "github.com/coder/websocket" - - "plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/plex" ) // TestClassifyError covers the substring-free, typed-sentinel diff --git a/internal/notify/fuzz_test.go b/internal/notify/fuzz_test.go index 9c024c4..ab68001 100644 --- a/internal/notify/fuzz_test.go +++ b/internal/notify/fuzz_test.go @@ -9,7 +9,7 @@ import ( // nopHandler is a no-op Handler for fuzz dispatch safety. type nopHandler struct{} -func (nopHandler) OnPlay(_ context.Context, _ PlayEvent) {} +func (nopHandler) OnPlay(_ context.Context, _ PlayEvent) {} func (nopHandler) OnTimeline(_ context.Context, _ []TimelineEntry) {} func FuzzNotificationUnmarshal(f *testing.F) { diff --git a/internal/notify/listener_test.go b/internal/notify/listener_test.go index 6da5343..a481f9b 100644 --- a/internal/notify/listener_test.go +++ b/internal/notify/listener_test.go @@ -11,9 +11,8 @@ import ( "time" "github.com/coder/websocket" + "github.com/cplieger/plex-language-sync/internal/plex" "pgregory.net/rapid" - - "plex-language-sync/internal/plex" ) // fakeHandler records the events delivered by dispatch / Listen so diff --git a/internal/notify/predicates.go b/internal/notify/predicates.go index 469dbb5..c3012ad 100644 --- a/internal/notify/predicates.go +++ b/internal/notify/predicates.go @@ -3,8 +3,8 @@ package notify import ( "fmt" - "plex-language-sync/internal/cache" - "plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/cache" + "github.com/cplieger/plex-language-sync/internal/plex" ) // Plex wire-format constants used by the event predicates. These mirror diff --git a/internal/plex/fuzz_test.go b/internal/plex/fuzz_test.go index e299a13..1fcdd37 100644 --- a/internal/plex/fuzz_test.go +++ b/internal/plex/fuzz_test.go @@ -6,7 +6,7 @@ import ( "strconv" "testing" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/streams" ) func FuzzSharedServersXMLUnmarshal(f *testing.F) { diff --git a/internal/plex/library.go b/internal/plex/library.go index 29a29ce..d9f0c99 100644 --- a/internal/plex/library.go +++ b/internal/plex/library.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/streams" ) // ShowSections returns the TV-show library sections. diff --git a/internal/plex/types.go b/internal/plex/types.go index 8386f1e..1c04724 100644 --- a/internal/plex/types.go +++ b/internal/plex/types.go @@ -11,7 +11,7 @@ import ( "fmt" "strconv" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/streams" ) // Plex wire-protocol constants. These strings/numbers appear in the diff --git a/internal/scheduler/scheduler.go b/internal/scheduler/scheduler.go index 22131e0..5cfd7d1 100644 --- a/internal/scheduler/scheduler.go +++ b/internal/scheduler/scheduler.go @@ -42,13 +42,12 @@ import ( "sync/atomic" "time" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/cache" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/timeutil" "golang.org/x/sync/singleflight" - - "plex-language-sync/internal/api" - "plex-language-sync/internal/cache" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" - "plex-language-sync/internal/timeutil" ) // deepAnalysisConcurrency is the upper bound on in-flight per-item work diff --git a/internal/scheduler/scheduler_test.go b/internal/scheduler/scheduler_test.go index 9e90750..f7aec3f 100644 --- a/internal/scheduler/scheduler_test.go +++ b/internal/scheduler/scheduler_test.go @@ -7,11 +7,11 @@ import ( "testing" "time" - "plex-language-sync/internal/api" - "plex-language-sync/internal/ignore" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" - "plex-language-sync/internal/testsupport/fakeapi" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/ignore" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/testsupport/fakeapi" ) // --------------------------------------------------------------------------- @@ -72,6 +72,7 @@ type fakeSyncer struct { func (s *fakeSyncer) ChangeTracksForEpisode(_ context.Context, _ api.PlexReadWriter, _ string, _ *streams.Episode, _ string) { s.changeCalls.Add(1) } + func (s *fakeSyncer) ProcessNewOrUpdatedEpisodeAllUsers(_ context.Context, _ *streams.Episode, _ string) { s.processCalls.Add(1) } diff --git a/internal/streams/score_test.go b/internal/streams/score_test.go index 5e34a0e..a6112c2 100644 --- a/internal/streams/score_test.go +++ b/internal/streams/score_test.go @@ -501,11 +501,20 @@ func TestSubtitleCodecScore(t *testing.T) { codec string want int }{ - {"ass", 3}, {"ssa", 3}, {"ASS", 3}, - {"pgs", 2}, {"vobsub", 2}, {"dvdsub", 2}, - {"dvb_subtitle", 2}, {"hdmv_pgs_subtitle", 2}, - {"srt", 1}, {"subrip", 1}, {"mov_text", 1}, {"webvtt", 1}, - {"", 0}, {"unknown", 0}, + {"ass", 3}, + {"ssa", 3}, + {"ASS", 3}, + {"pgs", 2}, + {"vobsub", 2}, + {"dvdsub", 2}, + {"dvb_subtitle", 2}, + {"hdmv_pgs_subtitle", 2}, + {"srt", 1}, + {"subrip", 1}, + {"mov_text", 1}, + {"webvtt", 1}, + {"", 0}, + {"unknown", 0}, } for _, tt := range tests { t.Run(tt.codec, func(t *testing.T) { diff --git a/internal/sync/episode.go b/internal/sync/episode.go index f83191f..ca04ad6 100644 --- a/internal/sync/episode.go +++ b/internal/sync/episode.go @@ -5,9 +5,9 @@ import ( "log/slog" "slices" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" ) // EpisodeRef bundles a shared reference episode and its selected diff --git a/internal/sync/profile.go b/internal/sync/profile.go index ab8bd16..0e11296 100644 --- a/internal/sync/profile.go +++ b/internal/sync/profile.go @@ -4,8 +4,8 @@ import ( "context" "log/slog" - "plex-language-sync/internal/api" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/streams" ) // ApplyLanguageProfile applies a learned language profile to a new diff --git a/internal/sync/tracks.go b/internal/sync/tracks.go index 4878e32..c4f19a2 100644 --- a/internal/sync/tracks.go +++ b/internal/sync/tracks.go @@ -31,9 +31,9 @@ import ( "log/slog" "strings" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" ) // Config captures the subset of application configuration the Syncer diff --git a/internal/sync/tracks_test.go b/internal/sync/tracks_test.go index eb57abe..77ec29b 100644 --- a/internal/sync/tracks_test.go +++ b/internal/sync/tracks_test.go @@ -5,11 +5,11 @@ import ( "errors" "testing" - "plex-language-sync/internal/api" - "plex-language-sync/internal/ignore" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" - "plex-language-sync/internal/testsupport/fakeapi" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/ignore" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/testsupport/fakeapi" ) // --------------------------------------------------------------------------- diff --git a/internal/testsupport/fakeapi/cache.go b/internal/testsupport/fakeapi/cache.go index 851fe44..2d8a2ec 100644 --- a/internal/testsupport/fakeapi/cache.go +++ b/internal/testsupport/fakeapi/cache.go @@ -16,7 +16,7 @@ import ( "sync" "time" - "plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/api" ) // Cache is a concurrency-safe in-memory implementation of api.Cache. diff --git a/internal/testsupport/fakeapi/cache_contract.go b/internal/testsupport/fakeapi/cache_contract.go index 707964a..9eb5903 100644 --- a/internal/testsupport/fakeapi/cache_contract.go +++ b/internal/testsupport/fakeapi/cache_contract.go @@ -4,7 +4,7 @@ import ( "sync" "testing" - "plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/api" ) // RunCacheContract exercises the api.Cache contract against any diff --git a/internal/testsupport/fakeapi/plex.go b/internal/testsupport/fakeapi/plex.go index e48518b..aa2e2aa 100644 --- a/internal/testsupport/fakeapi/plex.go +++ b/internal/testsupport/fakeapi/plex.go @@ -5,9 +5,9 @@ import ( "sync" "sync/atomic" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/streams" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/streams" ) // Plex implements api.PlexReadWriter for tests. All methods are diff --git a/internal/testsupport/fakeapi/users.go b/internal/testsupport/fakeapi/users.go index d2d4243..a4515a5 100644 --- a/internal/testsupport/fakeapi/users.go +++ b/internal/testsupport/fakeapi/users.go @@ -1,8 +1,8 @@ package fakeapi import ( - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" ) // Users implements api.UserLookup for tests. The zero value returns diff --git a/internal/users/manager.go b/internal/users/manager.go index 2a055a9..1dcfb5d 100644 --- a/internal/users/manager.go +++ b/internal/users/manager.go @@ -21,8 +21,8 @@ import ( "net/url" "sync" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" ) // Compile-time interface satisfaction assertion. diff --git a/internal/users/manager_test.go b/internal/users/manager_test.go index 0bb4c7b..6b7bc75 100644 --- a/internal/users/manager_test.go +++ b/internal/users/manager_test.go @@ -9,9 +9,9 @@ import ( "testing" "time" - "plex-language-sync/internal/api" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/testsupport/fakeapi" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/testsupport/fakeapi" ) // Verify *Manager satisfies api.UserLookup at compile time. diff --git a/internal/users/refresh.go b/internal/users/refresh.go index 5a00079..0da9e87 100644 --- a/internal/users/refresh.go +++ b/internal/users/refresh.go @@ -5,7 +5,7 @@ import ( "log/slog" "time" - "plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/plex" ) // RefreshConfig bundles retry tunables for the initial token-refresh diff --git a/main.go b/main.go index ce4aedf..21ea0b7 100644 --- a/main.go +++ b/main.go @@ -24,15 +24,15 @@ import ( "syscall" "time" - "plex-language-sync/internal/api" - "plex-language-sync/internal/cache" - "plex-language-sync/internal/ignore" - "plex-language-sync/internal/notify" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/scheduler" - "plex-language-sync/internal/streams" - syncpkg "plex-language-sync/internal/sync" - "plex-language-sync/internal/users" + "github.com/cplieger/plex-language-sync/internal/api" + "github.com/cplieger/plex-language-sync/internal/cache" + "github.com/cplieger/plex-language-sync/internal/ignore" + "github.com/cplieger/plex-language-sync/internal/notify" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/scheduler" + "github.com/cplieger/plex-language-sync/internal/streams" + syncpkg "github.com/cplieger/plex-language-sync/internal/sync" + "github.com/cplieger/plex-language-sync/internal/users" ) // Compile-time interface satisfaction assertions for concrete types diff --git a/main_test.go b/main_test.go index 29bfc7d..ec5ab46 100644 --- a/main_test.go +++ b/main_test.go @@ -46,10 +46,10 @@ import ( "testing" "time" - "plex-language-sync/internal/cache" - "plex-language-sync/internal/notify" - "plex-language-sync/internal/plex" - "plex-language-sync/internal/users" + "github.com/cplieger/plex-language-sync/internal/cache" + "github.com/cplieger/plex-language-sync/internal/notify" + "github.com/cplieger/plex-language-sync/internal/plex" + "github.com/cplieger/plex-language-sync/internal/users" ) // --------------------------------------------------------------------------- From 0d4d93134e5ca41fbee7152a2f87a25f92feab3a Mon Sep 17 00:00:00 2001 From: cplieger Date: Mon, 8 Jun 2026 20:21:26 +0200 Subject: [PATCH 2/2] refactor: use health.DefaultPath instead of hardcoded marker literal --- health.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/health.go b/health.go index 5202a49..e07522a 100644 --- a/health.go +++ b/health.go @@ -2,11 +2,9 @@ package main import "github.com/cplieger/health" -// healthMarkerPath is the default marker location. Docker healthchecks -// stat this path; the app creates and removes it at lifecycle points. -// /tmp is conventional because strict-tier compose services mount -// /tmp as tmpfs (see base.yaml -strict templates). -const healthMarkerPath = "/tmp/.healthy" +// healthMarkerPath is the marker location, sourced from the library so +// the literal lives in exactly one place. +const healthMarkerPath = health.DefaultPath // healthMarker wraps *health.Marker for backward-compatible usage in main. type healthMarker = health.Marker