SYMBOL INDEX (200 symbols across 24 files) FILE: cmd/awesome-docker/main.go constant readmePath (line 21) | readmePath = "README.md" constant excludePath (line 22) | excludePath = "config/exclude.yaml" constant templatePath (line 23) | templatePath = "config/website.tmpl.html" constant healthCachePath (line 24) | healthCachePath = "config/health_cache.yaml" constant websiteOutput (line 25) | websiteOutput = "website/index.html" constant version (line 26) | version = "0.1.0" type checkSummary (line 29) | type checkSummary struct function main (line 38) | func main() { function versionCmd (line 61) | func versionCmd() *cobra.Command { function parseReadme (line 69) | func parseReadme() (parser.Document, error) { function collectURLs (line 78) | func collectURLs(sections []parser.Section, urls *[]string) { type entryMeta (line 87) | type entryMeta struct function collectEntriesWithCategory (line 92) | func collectEntriesWithCategory(sections []parser.Section, parentPath st... function runLinkChecks (line 105) | func runLinkChecks(prMode bool) (checkSummary, error) { function runHealth (line 153) | func runHealth(ctx context.Context) error { function scoredFromCache (line 207) | func scoredFromCache() ([]scorer.ScoredEntry, error) { function markdownReportFromCache (line 233) | func markdownReportFromCache() (string, error) { function writeGitHubOutput (line 241) | func writeGitHubOutput(path, key, value string) error { function sanitizeOutputValue (line 256) | func sanitizeOutputValue(v string) string { function buildBrokenLinksIssueBody (line 262) | func buildBrokenLinksIssueBody(summary checkSummary, runErr error) string { function buildHealthReportIssueBody (line 302) | func buildHealthReportIssueBody(report string, healthErr error) string { function lintCmd (line 317) | func lintCmd() *cobra.Command { function checkCmd (line 354) | func checkCmd() *cobra.Command { function healthCmd (line 409) | func healthCmd() *cobra.Command { function buildCmd (line 419) | func buildCmd() *cobra.Command { function reportCmd (line 433) | func reportCmd() *cobra.Command { function validateCmd (line 463) | func validateCmd() *cobra.Command { function ciCmd (line 504) | func ciCmd() *cobra.Command { function ciBrokenLinksCmd (line 516) | func ciBrokenLinksCmd() *cobra.Command { function ciHealthReportCmd (line 588) | func ciHealthReportCmd() *cobra.Command { function browseCmd (line 665) | func browseCmd() *cobra.Command { FILE: internal/builder/builder.go function Build (line 17) | func Build(markdownPath, templatePath, outputPath string) error { FILE: internal/builder/builder_test.go function TestBuild (line 10) | func TestBuild(t *testing.T) { function TestBuildWithSectionPlaceholder (line 49) | func TestBuildWithSectionPlaceholder(t *testing.T) { function TestBuildRealREADME (line 88) | func TestBuildRealREADME(t *testing.T) { function TestBuildFailsWithoutPlaceholder (line 115) | func TestBuildFailsWithoutPlaceholder(t *testing.T) { function TestBuildAddsHeadingIDs (line 135) | func TestBuildAddsHeadingIDs(t *testing.T) { FILE: internal/cache/cache.go type ExcludeList (line 12) | type ExcludeList struct method IsExcluded (line 17) | func (e *ExcludeList) IsExcluded(url string) bool { function LoadExcludeList (line 27) | func LoadExcludeList(path string) (*ExcludeList, error) { type HealthEntry (line 40) | type HealthEntry struct type HealthCache (line 55) | type HealthCache struct method Merge (line 85) | func (hc *HealthCache) Merge(entries []HealthEntry) { function LoadHealthCache (line 60) | func LoadHealthCache(path string) (*HealthCache, error) { function SaveHealthCache (line 76) | func SaveHealthCache(path string, hc *HealthCache) error { FILE: internal/cache/cache_test.go function TestLoadExcludeList (line 10) | func TestLoadExcludeList(t *testing.T) { function TestHealthCacheRoundTrip (line 36) | func TestHealthCacheRoundTrip(t *testing.T) { function TestLoadHealthCacheMissing (line 71) | func TestLoadHealthCacheMissing(t *testing.T) { function TestLoadHealthCacheInvalidYAML (line 81) | func TestLoadHealthCacheInvalidYAML(t *testing.T) { function TestMerge (line 97) | func TestMerge(t *testing.T) { function TestMergeDeduplicatesIncomingBatch (line 123) | func TestMergeDeduplicatesIncomingBatch(t *testing.T) { FILE: internal/checker/github.go type RepoInfo (line 15) | type RepoInfo struct function ExtractGitHubRepo (line 30) | func ExtractGitHubRepo(rawURL string) (owner, name string, ok bool) { function isHTTPURL (line 61) | func isHTTPURL(raw string) bool { function isGitHubAuthError (line 69) | func isGitHubAuthError(err error) bool { function PartitionLinks (line 80) | func PartitionLinks(urls []string) (github, external []string) { type GitHubChecker (line 92) | type GitHubChecker struct method CheckRepo (line 104) | func (gc *GitHubChecker) CheckRepo(ctx context.Context, owner, name st... method CheckRepos (line 144) | func (gc *GitHubChecker) CheckRepos(ctx context.Context, urls []string... function NewGitHubChecker (line 97) | func NewGitHubChecker(token string) *GitHubChecker { FILE: internal/checker/github_test.go function TestExtractGitHubRepo (line 8) | func TestExtractGitHubRepo(t *testing.T) { function TestPartitionLinks (line 43) | func TestPartitionLinks(t *testing.T) { function TestIsGitHubAuthError (line 61) | func TestIsGitHubAuthError(t *testing.T) { FILE: internal/checker/http.go constant defaultTimeout (line 13) | defaultTimeout = 30 * time.Second constant defaultConcurrency (line 14) | defaultConcurrency = 10 constant userAgent (line 15) | userAgent = "awesome-docker-checker/1.0" type LinkResult (line 19) | type LinkResult struct function shouldFallbackToGET (line 28) | func shouldFallbackToGET(statusCode int) bool { function CheckLink (line 38) | func CheckLink(url string, client *http.Client) LinkResult { function CheckLinks (line 94) | func CheckLinks(urls []string, concurrency int, exclude *cache.ExcludeLi... FILE: internal/checker/http_test.go function TestCheckLinkOK (line 9) | func TestCheckLinkOK(t *testing.T) { function TestCheckLink404 (line 21) | func TestCheckLink404(t *testing.T) { function TestCheckLinkRedirect (line 36) | func TestCheckLinkRedirect(t *testing.T) { function TestCheckLinks (line 56) | func TestCheckLinks(t *testing.T) { function TestCheckLinkFallbackToGETOnMethodNotAllowed (line 82) | func TestCheckLinkFallbackToGETOnMethodNotAllowed(t *testing.T) { function TestCheckLinkFallbackToGETOnForbiddenHead (line 101) | func TestCheckLinkFallbackToGETOnForbiddenHead(t *testing.T) { FILE: internal/linter/fixer.go function RemoveAttribution (line 27) | func RemoveAttribution(desc string) string { function FormatEntry (line 34) | func FormatEntry(e parser.Entry) string { function FixFile (line 57) | func FixFile(path string) (int, error) { FILE: internal/linter/fixer_test.go function TestRemoveAttribution (line 11) | func TestRemoveAttribution(t *testing.T) { function TestFormatEntry (line 54) | func TestFormatEntry(t *testing.T) { function TestFormatEntryWithMarkers (line 67) | func TestFormatEntryWithMarkers(t *testing.T) { function TestFixFile (line 81) | func TestFixFile(t *testing.T) { function TestFixFileSortsAcrossBlankLinesAndIsIdempotent (line 142) | func TestFixFileSortsAcrossBlankLinesAndIsIdempotent(t *testing.T) { FILE: internal/linter/linter.go type Result (line 8) | type Result struct function Lint (line 15) | func Lint(doc parser.Document) Result { function lintSections (line 30) | func lintSections(sections []parser.Section, result *Result) { function collectEntries (line 44) | func collectEntries(sections []parser.Section) []parser.Entry { function addIssue (line 53) | func addIssue(result *Result, issue Issue) { FILE: internal/linter/linter_test.go function TestRuleDescriptionCapital (line 9) | func TestRuleDescriptionCapital(t *testing.T) { function TestRuleDescriptionPeriod (line 23) | func TestRuleDescriptionPeriod(t *testing.T) { function TestRuleSorted (line 37) | func TestRuleSorted(t *testing.T) { function TestRuleSortedOK (line 48) | func TestRuleSortedOK(t *testing.T) { function TestRuleDuplicateURL (line 59) | func TestRuleDuplicateURL(t *testing.T) { function TestValidEntry (line 70) | func TestValidEntry(t *testing.T) { function TestFixDescriptionCapital (line 78) | func TestFixDescriptionCapital(t *testing.T) { function TestFixDescriptionPeriod (line 86) | func TestFixDescriptionPeriod(t *testing.T) { function TestLintDocument (line 94) | func TestLintDocument(t *testing.T) { FILE: internal/linter/rules.go type Rule (line 13) | type Rule constant RuleDescriptionCapital (line 16) | RuleDescriptionCapital Rule = "description-capital" constant RuleDescriptionPeriod (line 17) | RuleDescriptionPeriod Rule = "description-period" constant RuleSorted (line 18) | RuleSorted Rule = "sorted" constant RuleDuplicateURL (line 19) | RuleDuplicateURL Rule = "duplicate-url" type Severity (line 23) | type Severity constant SeverityError (line 26) | SeverityError Severity = iota constant SeverityWarning (line 27) | SeverityWarning type Issue (line 31) | type Issue struct method String (line 38) | func (i Issue) String() string { function CheckEntry (line 47) | func CheckEntry(e parser.Entry) []Issue { function CheckSorted (line 72) | func CheckSorted(entries []parser.Entry) []Issue { function CheckDuplicates (line 90) | func CheckDuplicates(entries []parser.Entry) []Issue { function firstLetter (line 110) | func firstLetter(s string) (rune, bool) { function FixEntry (line 120) | func FixEntry(e parser.Entry) parser.Entry { function SortEntries (line 142) | func SortEntries(entries []parser.Entry) []parser.Entry { FILE: internal/parser/parser.go function ParseEntry (line 32) | func ParseEntry(line string, lineNum int) (Entry, error) { function Parse (line 63) | func Parse(r io.Reader) (Document, error) { function buildTree (line 114) | func buildTree(flat []struct { FILE: internal/parser/parser_test.go function TestParseEntry (line 9) | func TestParseEntry(t *testing.T) { function TestParseEntryWithMarkers (line 29) | func TestParseEntryWithMarkers(t *testing.T) { function TestParseEntryMultipleMarkers (line 46) | func TestParseEntryMultipleMarkers(t *testing.T) { function TestParseEntryMarkersCanonicalOrder (line 57) | func TestParseEntryMarkersCanonicalOrder(t *testing.T) { function TestParseDocument (line 71) | func TestParseDocument(t *testing.T) { function TestParseNotAnEntry (line 124) | func TestParseNotAnEntry(t *testing.T) { function TestParseRealREADME (line 131) | func TestParseRealREADME(t *testing.T) { function countEntries (line 154) | func countEntries(sections []Section) int { FILE: internal/parser/types.go type Marker (line 4) | type Marker constant MarkerAbandoned (line 7) | MarkerAbandoned Marker = iota constant MarkerPaid (line 8) | MarkerPaid constant MarkerWIP (line 9) | MarkerWIP constant MarkerStale (line 10) | MarkerStale type Entry (line 14) | type Entry struct type Section (line 24) | type Section struct type Document (line 33) | type Document struct FILE: internal/scorer/scorer.go type Status (line 14) | type Status constant StatusHealthy (line 17) | StatusHealthy Status = "healthy" constant StatusInactive (line 18) | StatusInactive Status = "inactive" constant StatusStale (line 19) | StatusStale Status = "stale" constant StatusArchived (line 20) | StatusArchived Status = "archived" constant StatusDead (line 21) | StatusDead Status = "dead" type ScoredEntry (line 25) | type ScoredEntry struct type ReportSummary (line 38) | type ReportSummary struct type ReportData (line 47) | type ReportData struct function Score (line 56) | func Score(info checker.RepoInfo) Status { function ScoreAll (line 77) | func ScoreAll(infos []checker.RepoInfo) []ScoredEntry { function ToCacheEntries (line 94) | func ToCacheEntries(scored []ScoredEntry) []cache.HealthEntry { function GenerateReport (line 115) | func GenerateReport(scored []ScoredEntry) string { function BuildReportData (line 153) | func BuildReportData(scored []ScoredEntry) ReportData { function GenerateJSONReport (line 175) | func GenerateJSONReport(scored []ScoredEntry) ([]byte, error) { FILE: internal/scorer/scorer_test.go function TestScoreHealthy (line 13) | func TestScoreHealthy(t *testing.T) { function TestScoreInactive (line 26) | func TestScoreInactive(t *testing.T) { function TestScoreStale (line 37) | func TestScoreStale(t *testing.T) { function TestScoreArchived (line 48) | func TestScoreArchived(t *testing.T) { function TestScoreDisabled (line 59) | func TestScoreDisabled(t *testing.T) { function TestGenerateReport (line 69) | func TestGenerateReport(t *testing.T) { function TestGenerateReportShowsAllEntries (line 87) | func TestGenerateReportShowsAllEntries(t *testing.T) { function TestGenerateJSONReport (line 108) | func TestGenerateJSONReport(t *testing.T) { function TestScoreAll (line 149) | func TestScoreAll(t *testing.T) { FILE: internal/tui/model.go type panel (line 15) | type panel constant panelTree (line 18) | panelTree panel = iota constant panelList (line 19) | panelList constant entryHeight (line 22) | entryHeight = 5 constant scrollOff (line 23) | scrollOff = 4 type Model (line 26) | type Model struct method Init (line 61) | func (m Model) Init() tea.Cmd { method Update (line 66) | func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { method handleFilterKey (line 104) | func (m Model) handleFilterKey(msg tea.KeyPressMsg) (tea.Model, tea.Cm... method applyFilter (line 128) | func (m *Model) applyFilter() { method handleTreeKey (line 151) | func (m Model) handleTreeKey(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) { method adjustTreeScroll (line 234) | func (m *Model) adjustTreeScroll() { method treePanelHeight (line 251) | func (m Model) treePanelHeight() int { method handleListKey (line 259) | func (m Model) handleListKey(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) { method updateCurrentEntries (line 307) | func (m *Model) updateCurrentEntries() { method visibleListEntries (line 321) | func (m Model) visibleListEntries() int { method adjustListScroll (line 329) | func (m *Model) adjustListScroll() { method listPanelHeight (line 346) | func (m Model) listPanelHeight() int { method View (line 356) | func (m Model) View() tea.View { method renderTree (line 401) | func (m Model) renderTree(width, height int) string { method renderList (line 451) | func (m Model) renderList(width, height int) string { method renderFooter (line 563) | func (m Model) renderFooter() string { function New (line 44) | func New(entries []cache.HealthEntry) Model { type openURLMsg (line 572) | type openURLMsg struct function openURL (line 574) | func openURL(url string) tea.Cmd { function truncateToWidth (line 590) | func truncateToWidth(s string, maxWidth int) string { FILE: internal/tui/styles.go function statusStyle (line 44) | func statusStyle(status string) lipgloss.Style { FILE: internal/tui/tree.go type TreeNode (line 11) | type TreeNode struct method HasChildren (line 26) | func (n *TreeNode) HasChildren() bool { method TotalEntries (line 31) | func (n *TreeNode) TotalEntries() int { method AllEntries (line 40) | func (n *TreeNode) AllEntries() []cache.HealthEntry { type FlatNode (line 20) | type FlatNode struct function BuildTree (line 50) | func BuildTree(entries []cache.HealthEntry) []*TreeNode { function ensureNode (line 69) | func ensureNode(root *TreeNode, nodeMap map[string]*TreeNode, path strin... function sortTree (line 93) | func sortTree(node *TreeNode) { function FlattenVisible (line 103) | func FlattenVisible(roots []*TreeNode) []FlatNode { function flattenNode (line 111) | func flattenNode(node *TreeNode, depth int, result *[]FlatNode) { FILE: internal/tui/tree_test.go function TestBuildTree (line 9) | func TestBuildTree(t *testing.T) { function TestBuildTreeEmpty (line 49) | func TestBuildTreeEmpty(t *testing.T) { function TestTotalEntries (line 56) | func TestTotalEntries(t *testing.T) { function TestFlattenVisible (line 72) | func TestFlattenVisible(t *testing.T) { function TestAllEntries (line 99) | func TestAllEntries(t *testing.T) { FILE: internal/tui/tui.go function Run (line 9) | func Run(entries []cache.HealthEntry) error {