Skip to content

fix: add HTTP client timeout to prevent webhook reports hanging forever#484

Merged
agnivo988 merged 3 commits into
agnivo988:mainfrom
saurabhhhcodes:fix/webhook-http-timeout
Jun 18, 2026
Merged

fix: add HTTP client timeout to prevent webhook reports hanging forever#484
agnivo988 merged 3 commits into
agnivo988:mainfrom
saurabhhhcodes:fix/webhook-http-timeout

Conversation

@saurabhhhcodes

@saurabhhhcodes saurabhhhcodes commented Jun 14, 2026

Copy link
Copy Markdown

Closes #391

Problem

sendToWebhook uses http.Post which relies on http.DefaultClient with no timeout. A stalled webhook endpoint can block the scheduled job goroutine indefinitely.

Fix

Use an http.Client with a 30-second timeout for webhook delivery so stalled receivers fail fast with a clear error instead of hanging.

Summary by CodeRabbit

  • New Features

    • Added GitHub release detection for repositories to enhance analysis accuracy
    • Implemented caching for release checks to improve performance
    • Added 30-second timeout to webhook requests for improved reliability
  • Documentation

    • Updated README with badges and Table of Contents
    • Refreshed Quick Start section with Go 1.21+ and Docker prerequisites
    • Added comprehensive Contributing guide with development setup instructions
  • Bug Fixes

    • Fixed maturity score calculation to correctly account for repository releases instead of always defaulting to no releases

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a new HasReleases method on the GitHub client (with cache and single-flight) and propagates the result into all RepoMaturityScore call sites across cmd, analyzer, output, scheduler, and ui, replacing previously hardcoded false values. Fixes the scheduler's webhook delivery to use an HTTP client with a 30-second timeout. Updates README with badges, Table of Contents, revised Quick Start, and a Contributing guide.

Changes

HasReleases integration and webhook timeout fix

Layer / File(s) Summary
HasReleases GitHub client method
internal/github/releases.go
New (*Client).HasReleases(owner, repo) checks an in-memory cache, falls back to a single-flight-guarded GitHub Releases API call (per_page=1), caches the boolean result with default expiration, and propagates errors.
HasReleases wired into all maturity score call sites
internal/output/compare.go, cmd/compare.go, cmd/analyze.go, internal/analyzer/certificate.go, internal/scheduler/scheduler.go, internal/ui/app.go
CompareInput gains a HasReleases bool field. Every code path that computed RepoMaturityScore with a hardcoded false now calls client.HasReleases and forwards the result; errors are handled per-caller (wrapped error in compare cmd, fallback to false in UI).
Scheduler webhook HTTP timeout
internal/scheduler/scheduler.go
Webhook POST in executeJob uses a new http.Client{Timeout: 30s} instead of http.Post, bounding stalled webhook requests to 30 seconds.

README documentation update

Layer / File(s) Summary
README badges, ToC, Quick Start, and Contributing guide
README.md
Adds release/license/issues/CI badges and a Table of Contents; rewrites Prerequisites (Go 1.21+/Docker) and Installation (go install ...@latest + version check); adjusts the --contribute usage snippet; replaces tail content with a full Contributing section (workflow, dev setup, code style) and updated contributor avatar list.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

level:critical, type:bug, quality:clean

Poem

🐇 Hop, hop — no more false in the score!
The releases flag now opens the door.
Webhooks won't hang till the end of the day,
A 30-second timeout sends them away.
The README blooms bright with badges and guides —
A rabbit who codes with impeccable strides! 🌟

🚥 Pre-merge checks | ✅ 1 | ❌ 4

❌ Failed checks (4 warnings)

Check name Status Explanation Resolution
Title check ⚠️ Warning Title mentions HTTP client timeout for webhook hanging, but PR substantially adds HasReleases feature across multiple files. Update title to reflect both the HTTP timeout fix and the HasReleases feature additions, or split into separate PRs.
Linked Issues check ⚠️ Warning HTTP timeout fix is implemented in scheduler.go, addressing issue #391. However, HasReleases feature changes are unexplained and lack corresponding linked issues. Link additional issues for HasReleases feature or document why these changes belong in this PR addressing issue #391.
Out of Scope Changes check ⚠️ Warning HasReleases feature (releases.go, compare.go, certificate.go, app.go, output/compare.go) is substantially out of scope for the webhook timeout fix in issue #391. Move HasReleases feature to a separate PR or provide linked issue explaining why it should be included.
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (4)
cmd/analyze.go (1)

318-319: ⚡ Quick win

Consider logging the HasReleases error.

The error from HasReleases is silently discarded. While defaulting to hasReleases = false is safe, logging the error would help diagnose API issues or rate limit problems.

📝 Proposed logging
 	// Check releases
-	hasReleases, _ := client.HasReleases(owner, repo)
+	hasReleases, err := client.HasReleases(owner, repo)
+	if err != nil {
+		log.Printf("Failed to check releases for %s/%s: %v", owner, repo, err)
+		hasReleases = false
+	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/analyze.go` around lines 318 - 319, The error returned by the HasReleases
method call is being silently discarded with the blank identifier. Capture this
error return value and log it using an appropriate logger (debug or warn level)
to help diagnose API connectivity issues or rate limit problems, while still
allowing the code to safely default hasReleases to false when the call fails.
internal/ui/app.go (1)

1433-1434: ⚡ Quick win

Consider logging HasReleases errors in comparison flow.

Both HasReleases calls silently discard errors. While defaulting to false is safe, logging would help diagnose API issues during repository comparisons.

📝 Proposed logging
 	busFactor1, busRisk1 := analyzer.BusFactor(contributors1)
-	hasReleases1, _ := client.HasReleases(parts1[0], parts1[1])
+	hasReleases1, err := client.HasReleases(parts1[0], parts1[1])
+	if err != nil {
+		log.Printf("Failed to check releases for %s: %v", repo1Name, err)
+		hasReleases1 = false
+	}
 	maturityScore1, maturityLevel1 := analyzer.RepoMaturityScore(repo1, len(commits1), len(contributors1), hasReleases1)

Apply the same pattern for hasReleases2 at line 1460.

Also applies to: 1460-1461

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/ui/app.go` around lines 1433 - 1434, The HasReleases method calls
are silently discarding errors using the blank identifier, which prevents
visibility into API issues during repository comparisons. In the comparison flow
in internal/ui/app.go, capture the error returned by both HasReleases calls (at
lines 1433-1434 for hasReleases1 and at lines 1460-1461 for hasReleases2) and
log them appropriately instead of using the blank identifier to discard them.
This will help diagnose API failures while maintaining the safe default behavior
of treating missing releases as false.
internal/scheduler/scheduler.go (1)

132-133: ⚡ Quick win

Consider logging the HasReleases error.

The error from HasReleases is silently discarded. While defaulting to hasReleases = false is safe, logging the error would help diagnose API issues, especially important in scheduled jobs where errors might go unnoticed.

📝 Proposed logging
 	// Check releases
-	hasReleases, _ := client.HasReleases(job.Owner, job.Repo)
+	hasReleases, err := client.HasReleases(job.Owner, job.Repo)
+	if err != nil {
+		log.Printf("Failed to check releases for %s/%s in job %s: %v", job.Owner, job.Repo, job.ID, err)
+		hasReleases = false
+	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/scheduler/scheduler.go` around lines 132 - 133, The error returned
by the HasReleases method call in the scheduler is being silently discarded with
a blank identifier. Instead of ignoring the error, capture it in a named
variable and add conditional logging to record the error if it occurs. This will
help diagnose API issues in scheduled jobs without changing the safe default
behavior of setting hasReleases to false when an error occurs. Update the line
where HasReleases is called to capture both the boolean result and the error,
then add a log statement that checks if the error is not nil and logs the error
details.
internal/analyzer/certificate.go (1)

140-141: ⚡ Quick win

Consider logging the HasReleases error.

The error from HasReleases is silently discarded. While defaulting to hasReleases = false is safe, logging the error would help diagnose API issues.

📝 Proposed logging
 	// Check releases
-	hasReleases, _ := client.HasReleases(owner, repo)
+	hasReleases, err := client.HasReleases(owner, repo)
+	if err != nil {
+		log.Printf("Failed to check releases for %s/%s: %v", owner, repo, err)
+		hasReleases = false
+	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/analyzer/certificate.go` around lines 140 - 141, The error returned
by the HasReleases call on the client is being silently discarded using an
underscore. Instead of discarding the error, capture it into a named variable
and log it if an error occurs. This way, the hasReleases variable will still
safely default to false if the method fails, but any API issues or other errors
will be logged for debugging purposes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/github/releases.go`:
- Line 37: The type assertion at line 37 in the releases.go file is unsafe and
can cause a panic if the single-flight function returns an unexpected type.
Replace the unsafe type assertion `v.(bool), nil` with a safe type assertion
using the two-return-value form to check whether the type assertion succeeded.
If the type assertion fails, return an appropriate error to handle the
unexpected type gracefully instead of allowing a panic.
- Around line 16-17: The type assertion `cached.(bool)` in the cache retrieval
block will panic if the cached value is not a boolean. Replace the unsafe type
assertion with the safe type assertion pattern using the comma-ok idiom (e.g.,
`value, ok := cached.(bool)`). Check the ok flag and handle the case where the
type assertion fails, either by returning an error or logging a warning and
falling through to re-fetch the value from the source.
- Around line 11-12: The type assertion `cached.(bool)` in the cache retrieval
code is unsafe and will cause a panic if the cached value is not actually a
boolean type. Replace the unsafe type assertion with a safe type assertion using
the comma-ok idiom (e.g., `ok := true; if v, ok := cached.(bool); ok { ... }`).
This way, if the cache value is corrupted or has an unexpected type, the code
will handle it gracefully instead of panicking, and you can either return an
error or treat it as a cache miss.

In `@internal/scheduler/scheduler.go`:
- Around line 291-292: The current implementation using `client.Post()` doesn't
support context cancellation, which means webhook requests cannot be interrupted
during graceful shutdown or job cancellation. Replace the direct `client.Post()`
call with `http.NewRequestWithContext()` to create an `*http.Request` with the
appropriate context (likely from the `executeJob` function's parameters), then
call `client.Do()` with that request instead. This enables the HTTP call to
respect context cancellation while maintaining the 30-second timeout already
configured on the http.Client.

In `@README.md`:
- Around line 6-11: The license badge in README.md references a LICENSE file at
the repository root that does not currently exist, causing the badge to break.
Create a LICENSE file in the repository root directory and select an appropriate
open-source license for the project. The CI workflow badge already correctly
references the existing .github/workflows/ci.yml file, so no changes are needed
for that badge.

---

Nitpick comments:
In `@cmd/analyze.go`:
- Around line 318-319: The error returned by the HasReleases method call is
being silently discarded with the blank identifier. Capture this error return
value and log it using an appropriate logger (debug or warn level) to help
diagnose API connectivity issues or rate limit problems, while still allowing
the code to safely default hasReleases to false when the call fails.

In `@internal/analyzer/certificate.go`:
- Around line 140-141: The error returned by the HasReleases call on the client
is being silently discarded using an underscore. Instead of discarding the
error, capture it into a named variable and log it if an error occurs. This way,
the hasReleases variable will still safely default to false if the method fails,
but any API issues or other errors will be logged for debugging purposes.

In `@internal/scheduler/scheduler.go`:
- Around line 132-133: The error returned by the HasReleases method call in the
scheduler is being silently discarded with a blank identifier. Instead of
ignoring the error, capture it in a named variable and add conditional logging
to record the error if it occurs. This will help diagnose API issues in
scheduled jobs without changing the safe default behavior of setting hasReleases
to false when an error occurs. Update the line where HasReleases is called to
capture both the boolean result and the error, then add a log statement that
checks if the error is not nil and logs the error details.

In `@internal/ui/app.go`:
- Around line 1433-1434: The HasReleases method calls are silently discarding
errors using the blank identifier, which prevents visibility into API issues
during repository comparisons. In the comparison flow in internal/ui/app.go,
capture the error returned by both HasReleases calls (at lines 1433-1434 for
hasReleases1 and at lines 1460-1461 for hasReleases2) and log them appropriately
instead of using the blank identifier to discard them. This will help diagnose
API failures while maintaining the safe default behavior of treating missing
releases as false.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9f4eb136-d9f2-4ea2-9e7f-47c08048fc09

📥 Commits

Reviewing files that changed from the base of the PR and between 6d6fa89 and d7295ec.

📒 Files selected for processing (8)
  • README.md
  • cmd/analyze.go
  • cmd/compare.go
  • internal/analyzer/certificate.go
  • internal/github/releases.go
  • internal/output/compare.go
  • internal/scheduler/scheduler.go
  • internal/ui/app.go

Comment on lines +11 to +12
if cached, found := c.cache.Get(cacheKey); found {
return cached.(bool), nil

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Unsafe type assertion can panic on cache corruption.

The type assertion cached.(bool) will panic if the cached value is not a boolean (for example, due to cache corruption or a programming error elsewhere that stores a different type under this key).

🛡️ Proposed fix with safe type assertion
-	if cached, found := c.cache.Get(cacheKey); found {
-		return cached.(bool), nil
+	if cached, found := c.cache.Get(cacheKey); found {
+		if boolVal, ok := cached.(bool); ok {
+			return boolVal, nil
+		}
 	}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if cached, found := c.cache.Get(cacheKey); found {
return cached.(bool), nil
if cached, found := c.cache.Get(cacheKey); found {
if boolVal, ok := cached.(bool); ok {
return boolVal, nil
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/github/releases.go` around lines 11 - 12, The type assertion
`cached.(bool)` in the cache retrieval code is unsafe and will cause a panic if
the cached value is not actually a boolean type. Replace the unsafe type
assertion with a safe type assertion using the comma-ok idiom (e.g., `ok :=
true; if v, ok := cached.(bool); ok { ... }`). This way, if the cache value is
corrupted or has an unexpected type, the code will handle it gracefully instead
of panicking, and you can either return an error or treat it as a cache miss.

Comment on lines +16 to +17
if cached, found := c.cache.Get(cacheKey); found {
return cached.(bool), nil

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Unsafe type assertion can panic on cache corruption.

The type assertion cached.(bool) will panic if the cached value is not a boolean. Apply the same safe type assertion pattern as the outer cache check.

🛡️ Proposed fix with safe type assertion
 		if cached, found := c.cache.Get(cacheKey); found {
-			return cached.(bool), nil
+			if boolVal, ok := cached.(bool); ok {
+				return boolVal, nil
+			}
 		}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if cached, found := c.cache.Get(cacheKey); found {
return cached.(bool), nil
if cached, found := c.cache.Get(cacheKey); found {
if boolVal, ok := cached.(bool); ok {
return boolVal, nil
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/github/releases.go` around lines 16 - 17, The type assertion
`cached.(bool)` in the cache retrieval block will panic if the cached value is
not a boolean. Replace the unsafe type assertion with the safe type assertion
pattern using the comma-ok idiom (e.g., `value, ok := cached.(bool)`). Check the
ok flag and handle the case where the type assertion fails, either by returning
an error or logging a warning and falling through to re-fetch the value from the
source.

if err != nil {
return false, err
}
return v.(bool), nil

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Unsafe type assertion can panic if the single-flight function returns unexpected type.

Although the single-flight function should always return bool, defensive programming suggests using a safe type assertion here as well.

🛡️ Proposed fix with safe type assertion
-	return v.(bool), nil
+	if boolVal, ok := v.(bool); ok {
+		return boolVal, nil
+	}
+	return false, fmt.Errorf("internal error: single-flight returned non-bool value")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return v.(bool), nil
if boolVal, ok := v.(bool); ok {
return boolVal, nil
}
return false, fmt.Errorf("internal error: single-flight returned non-bool value")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/github/releases.go` at line 37, The type assertion at line 37 in the
releases.go file is unsafe and can cause a panic if the single-flight function
returns an unexpected type. Replace the unsafe type assertion `v.(bool), nil`
with a safe type assertion using the two-return-value form to check whether the
type assertion succeeded. If the type assertion fails, return an appropriate
error to handle the unexpected type gracefully instead of allowing a panic.

Comment on lines +291 to +292
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Webhook timeout fix incomplete: missing context cancellation support.

The 30-second timeout addresses the core issue from #391 (preventing indefinite hangs), but the implementation using client.Post() doesn't respect context cancellation. If the scheduler needs to shut down gracefully or cancel a job, the webhook delivery will still block for up to 30 seconds.

🔧 Proposed fix using Do() with context
 	client := &http.Client{Timeout: 30 * time.Second}
-	resp, err := client.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))
+	req, err := http.NewRequestWithContext(context.Background(), "POST", webhookURL, bytes.NewBuffer(jsonData))
+	if err != nil {
+		return fmt.Errorf("failed to create webhook request: %w", err)
+	}
+	req.Header.Set("Content-Type", "application/json")
+	resp, err := client.Do(req)

If executeJob should support context cancellation (which scheduled jobs typically should), pass that context instead of context.Background().

As per static analysis hints, the linter flagged this line with noctx - HTTP calls should use (*http.Client).Do(*http.Request) with context for proper cancellation support.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))
client := &http.Client{Timeout: 30 * time.Second}
req, err := http.NewRequestWithContext(context.Background(), "POST", webhookURL, bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("failed to create webhook request: %w", err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
🧰 Tools
🪛 golangci-lint (2.12.2)

[error] 292-292: (*net/http.Client).Post must not be called. use (*net/http.Client).Do(*http.Request)

(noctx)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/scheduler/scheduler.go` around lines 291 - 292, The current
implementation using `client.Post()` doesn't support context cancellation, which
means webhook requests cannot be interrupted during graceful shutdown or job
cancellation. Replace the direct `client.Post()` call with
`http.NewRequestWithContext()` to create an `*http.Request` with the appropriate
context (likely from the `executeJob` function's parameters), then call
`client.Do()` with that request instead. This enables the HTTP call to respect
context cancellation while maintaining the 30-second timeout already configured
on the http.Client.

Source: Linters/SAST tools

Comment thread README.md
Comment on lines +6 to +11
<p align="center">
<a href="https://github.com/agnivo988/Repo-lyzer/releases"><img src="https://img.shields.io/github/v/release/agnivo988/Repo-lyzer?style=flat-square" alt="Release"></a>
<a href="https://github.com/agnivo988/Repo-lyzer/blob/main/LICENSE"><img src="https://img.shields.io/github/license/agnivo988/Repo-lyzer?style=flat-square" alt="License"></a>
<a href="https://github.com/agnivo988/Repo-lyzer/issues"><img src="https://img.shields.io/github/issues/agnivo988/Repo-lyzer?style=flat-square" alt="Issues"></a>
<a href="https://github.com/agnivo988/Repo-lyzer/actions"><img src="https://img.shields.io/github/actions/workflow/status/agnivo988/Repo-lyzer/ci.yml?style=flat-square" alt="CI"></a>
</p>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify that README badge URLs point to valid targets.

# Check 1: Verify LICENSE file exists in repository root
echo "=== Checking LICENSE file ==="
if [ -f "LICENSE" ]; then
  echo "✓ LICENSE file exists"
else
  echo "✗ LICENSE file not found"
fi

# Check 2: Verify CI workflow file matches badge reference
echo ""
echo "=== Checking CI workflow ==="
if [ -f ".github/workflows/ci.yml" ]; then
  echo "✓ CI workflow (.github/workflows/ci.yml) exists"
else
  echo "✗ CI workflow not found at .github/workflows/ci.yml"
fi

# Check 3: List GitHub Actions workflows to confirm the correct workflow name
echo ""
echo "=== Available GitHub Actions workflows ==="
if [ -d ".github/workflows" ]; then
  ls -la .github/workflows/ | grep -E "\.yml|\.yaml"
else
  echo "No .github/workflows directory found"
fi

Repository: agnivo988/Repo-lyzer

Length of output: 490


Add a LICENSE file to the repository root.

The badge on line 8 (https://github.com/agnivo988/Repo-lyzer/blob/main/LICENSE) references a LICENSE file that does not exist in the repository. This breaks the license badge. Create a LICENSE file in the repository root and choose an appropriate open-source license for the project.

The CI workflow badge on line 11 correctly references .github/workflows/ci.yml, which exists in the repository.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 6 - 11, The license badge in README.md references a
LICENSE file at the repository root that does not currently exist, causing the
badge to break. Create a LICENSE file in the repository root directory and
select an appropriate open-source license for the project. The CI workflow badge
already correctly references the existing .github/workflows/ci.yml file, so no
changes are needed for that badge.

@agnivo988
agnivo988 merged commit 6398487 into agnivo988:main Jun 18, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Scheduled webhook reports can hang forever without an HTTP timeout

2 participants