Skip to content

Scanning Module Oslo Accords - #36

Merged
IdanKoblik merged 1 commit into
mainfrom
feature/scanning
Aug 1, 2026
Merged

Scanning Module Oslo Accords#36
IdanKoblik merged 1 commit into
mainfrom
feature/scanning

Conversation

@IdanKoblik

@IdanKoblik IdanKoblik commented Aug 1, 2026

Copy link
Copy Markdown
Member

Summary

Add full-target scan with live progress output.
Scan enumerates the target's subdomains and runs every installed module against each one, module by module, so a module can rely on its dependencies having reported before it runs.

Related issues

Fixes #25

Type of change

  • Bug fix (type/bug)
  • New feature (type/feature)
  • Enhancement to existing behavior (type/enhancement)
  • Refactor, no behavior change (type/refactor)
  • Performance (type/performance)
  • Documentation (type/documentation)
  • Chore / maintenance (type/chore)

Breaking changes

None

How this was tested

I got rate limit from one of the finders, from the amount of tests that I did.

Checklist

  • I read CONTRIBUTING.md
  • The branch is named <type>/<short-description> and commits follow
    Conventional Commits
  • Documentation (README, doc comments) is updated where it applies

Summary by CodeRabbit

  • New Features

    • Added the scan command for discovering subdomains and running DNS and HTTP checks.
    • Added live, concurrency-safe progress logging and structured scan result rendering.
    • Added HackerTarget subdomain discovery with deduplication and domain filtering.
    • Added --install and --uninstall options for managing external modules.
  • Bug Fixes

    • Unresolved subdomains are now skipped safely.
    • HTTP checks avoid duplicate requests and enforce time limits during subdomain discovery.
    • The application now cleans up correctly after termination signals.

Scan enumerates the target's subdomains and runs every installed module
against each one, module by module, so a module can rely on its
dependencies having reported before it runs.
@IdanKoblik IdanKoblik added this to the 2.0.0 milestone Aug 1, 2026
@IdanKoblik IdanKoblik self-assigned this Aug 1, 2026
@IdanKoblik IdanKoblik added type/feature New features or enhancements type/enhancement General improvements type/refactor Code refactoring area/cli cli-related labels Aug 1, 2026
@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR adds the scan command and connects it to concurrent subdomain discovery, DNS resolution, module execution, progress logging, JSON result rendering, and timeout handling. It also adds HackerTarget discovery and removes automatic nginx installation.

Changes

Scan feature

Layer / File(s) Summary
Scan command entrypoint
cmd/main.go, internal/cmd/*, CHANGELOG.md
Registers the scan command, documents external-module flags, cleans runner state before the command loop, and updates the changelog.
Scan pipeline and result model
internal/scanning/scanner.go
Normalizes targets, discovers and filters subdomains, resolves hosts concurrently, runs modules with bounded concurrency, and serializes results.
Network discovery and module execution
internal/dns/dns.go, internal/net/subdomain/finder.go, internal/module/*
Adds timeout-bounded DNS resolution, HackerTarget discovery, domain validation, centralized module execution, progress logging, and single-fetch HTTP processing.
Progress logging and result rendering
internal/logging/log.go, internal/scanning/render.go, internal/style/style.go, pkg/records/http.go
Adds synchronized styled logging, recursive JSON rendering, CRLF normalization, and comment cleanup.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ScanCommand
  participant scanning.Scan
  participant Finders
  participant dns.Resolve
  participant module.RunModule
  participant scanning.Render
  ScanCommand->>scanning.Scan: start scan
  scanning.Scan->>Finders: discover subdomains
  scanning.Scan->>dns.Resolve: resolve candidate hosts
  scanning.Scan->>module.RunModule: run modules for live hosts
  module.RunModule-->>scanning.Scan: return module data
  scanning.Scan->>scanning.Render: render serialized results
  scanning.Render-->>ScanCommand: return formatted output
Loading
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Scanning Module Oslo Accords' is vague and uses metaphorical language that does not clearly describe the main changes. Revise the title to directly describe the primary change, such as 'Add full-target scanning with live progress output' or 'Implement scan command with subdomain enumeration and module execution'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed The PR adds a scan command that enumerates subdomains and runs modules against each subdomain, which aligns with splitting scan as an internal module per issue #25.
Out of Scope Changes check ✅ Passed All changes directly support the scanning feature: new scan command, logging package, DNS/HTTP module enhancements, subdomain discovery, result rendering, and runner refactoring.
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/scanning

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

@sonarqubecloud

sonarqubecloud Bot commented Aug 1, 2026

Copy link
Copy Markdown

Quality Gate Passed Quality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
0.0% Duplication on New Code

See analysis details on SonarQube Cloud

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 11

🧹 Nitpick comments (9)
internal/logging/log.go (1)

30-38: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Unchecked fmt.Fprint return value.

Static analysis (errcheck) flags Line 37: the error from fmt.Fprint(out, s+"\r\n") is discarded. Since out can be replaced via SetOutput with an arbitrary io.Writer, a write failure there is silently swallowed.

Check the error, or explicitly discard it to satisfy the linter and document the intent.

🔧 Proposed fix
 func line(s string) {
 	mu.Lock()
 	defer mu.Unlock()
 
 	if !enabled {
 		return
 	}
-	fmt.Fprint(out, s+"\r\n")
+	_, _ = fmt.Fprint(out, s+"\r\n")
 }
🤖 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/logging/log.go` around lines 30 - 38, Handle the return value of
fmt.Fprint in line, either checking and handling the write error or explicitly
discarding it to document the intentional behavior and satisfy errcheck. Keep
the existing locking, enabled check, and output formatting unchanged.

Source: Linters/SAST tools

internal/scanning/render.go (1)

26-156: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Recommend adding unit tests for the recursive renderer.

This file implements non-trivial recursive JSON-to-text rendering with several distinct branches: top-level scalar vs. object vs. array, empty arrays (Line 114-116), arrays mixing scalar and nested elements (Line 78-112), and empty-string field values (Line 130-137, where val == "" renders as a bare label: with no visible value). No test file accompanies this change.

Since this renders the final scan output shown to end users, add table-driven tests covering these branches to lock in the intended formatting and catch regressions.

Do you want me to draft a starter test file covering these cases?

🤖 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/scanning/render.go` around lines 26 - 156, Add table-driven unit
tests for the recursive renderer centered on value, covering top-level scalars,
objects, arrays, empty arrays, arrays mixing scalar and nested elements, and
empty-string field values. Assert the complete rendered output, including
indentation, headings, bullets, line endings, and bare label formatting, while
reusing the existing rendering entry point and style setup.
CHANGELOG.md (1)

18-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Document the new HackerTarget subdomain source.

This PR registers a third finder, hackertarget, in internal/net/subdomain/finder.go. The changelog does not mention it. Users see new subdomain sources and a new failure source in scan output, so add an entry.

📝 Proposed changelog entry
 - Scans skip subdomains that no longer resolve, so dead names left behind in
   certificate transparency logs no longer cost a timeout per module.
+- HackerTarget as an additional subdomain source, alongside crt.sh and
+  CertSpotter.
🤖 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 `@CHANGELOG.md` around lines 18 - 26, Add a CHANGELOG.md entry documenting the
newly registered HackerTarget subdomain finder (`hackertarget`) alongside the
existing scan and subdomain-source changes, including that it appears as an
additional source and may produce a corresponding failure source in scan output.
internal/scanning/scanner.go (3)

66-77: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Reduce the cognitive complexity of Scan.

SonarCloud fails the build with cognitive complexity 18 against a limit of 15. Extract the per-module fan-out at lines 115-149 into a helper, for example runAcrossHosts(result *Result, mi int, m string, manager *module.Manager, reporter *module.Reporter, sem chan struct{}). That removes the nested loop and the goroutine body from Scan and keeps the reported complexity under the limit.

🤖 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/scanning/scanner.go` around lines 66 - 77, Reduce Scan’s cognitive
complexity by extracting the per-module host fan-out and goroutine logic from
its module-processing loop into a helper such as runAcrossHosts(result *Result,
mi int, m string, manager *module.Manager, reporter *module.Reporter, sem chan
struct{}). Update Scan to invoke the helper while preserving existing
concurrency, reporting, and result behavior.

Source: Linters/SAST tools


218-223: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Extract the column width in pad.

The literal 38 appears three times. Name it once so the alignment cannot drift.

♻️ Proposed refactor
+const nameColumnWidth = 38
+
 func pad(name string) string {
-	if len(name) >= 38 {
+	if len(name) >= nameColumnWidth {
 		return style.White(name)
 	}
-	return style.White(name) + strings.Repeat(" ", 38-len(name))
+	return style.White(name) + strings.Repeat(" ", nameColumnWidth-len(name))
 }
🤖 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/scanning/scanner.go` around lines 218 - 223, Update the pad function
to define the column width once and reuse that named value in the length
comparison, padding calculation, and strings.Repeat call, replacing all repeated
38 literals while preserving the current alignment behavior.

115-149: 🩺 Stability & Availability | 🔵 Trivial | 🏗️ Heavy lift

A running scan cannot be cancelled.

Scan creates its own contexts and never accepts one. The module loop runs to completion for every module against every host. cmd/main.go sets interrupted on SIGINT, but Exec blocks in Scan and nothing observes the signal. On a target with many live hosts, the operator must wait for the whole run or kill the process.

Accept a context.Context parameter in Scan, derive the enumeration and resolution contexts from it, and check ctx.Err() before each module iteration. Pass the same context into module.RunModule so external module execution stops as well.

🤖 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/scanning/scanner.go` around lines 115 - 149, Update Scan to accept a
context.Context, derive enumeration and resolution contexts from it, and check
ctx.Err() before each module iteration to stop promptly on cancellation. Pass
the same context into module.RunModule so external module execution is
cancelled, while preserving existing scan behavior when the context remains
active.
internal/cmd/help.go (1)

46-66: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Flag descriptions are misaligned because the padding is hardcoded.

The block uses fixed spaces per entry. --uninstall is two characters longer than --version and --install, so its description starts two columns further right. The command list above already computes padding from the longest name. Apply the same approach to the flag list.

♻️ Proposed refactor to align flag descriptions
 	b.WriteString("\r\n" + style.Bold("Flags") + "\r\n")
-	b.WriteString(fmt.Sprintf("  %s   %s\r\n",
-		style.Cyan("--target"),
-		style.Dim("Determines the site that goscouter will target (requires http/https prefix)."),
-	))
-
-	b.WriteString(fmt.Sprintf("  %s  %s\r\n",
-		style.Cyan("--version"),
-		style.Dim("Returns goscouter cli version"),
-	))
-
-	b.WriteString(fmt.Sprintf("  %s  %s\r\n",
-		style.Cyan("--install"),
-		style.Dim("Installs an external module"),
-	))
-
-	b.WriteString(fmt.Sprintf("  %s  %s\r\n",
-		style.Cyan("--uninstall"),
-		style.Dim("Uninstalls an external module"),
-	))
+	flags := []struct{ name, desc string }{
+		{"--target", "Determines the site that goscouter will target (requires http/https prefix)."},
+		{"--version", "Returns goscouter cli version"},
+		{"--install", "Installs an external module"},
+		{"--uninstall", "Uninstalls an external module"},
+	}
+
+	flagWidth := 0
+	for _, f := range flags {
+		if len(f.name) > flagWidth {
+			flagWidth = len(f.name)
+		}
+	}
+
+	for _, f := range flags {
+		pad := strings.Repeat(" ", flagWidth-len(f.name))
+		b.WriteString(fmt.Sprintf("  %s%s   %s\r\n",
+			style.Cyan(f.name), pad, style.Dim(f.desc)))
+	}
🤖 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/cmd/help.go` around lines 46 - 66, Update the flag-list formatting
in the help-generation function to compute padding from the longest flag name,
matching the existing command-list alignment approach. Use that calculated width
for --target, --version, --install, and --uninstall so every description starts
at the same column, rather than relying on differing hardcoded spaces.
internal/cmd/scan.go (1)

22-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Exec ignores args.

The scan command accepts any arguments and discards them. An operator who types scan example.com gets a scan of the manager target with no notice. Reject unexpected arguments, or document the flags that scan accepts.

♻️ Proposed change to reject unexpected arguments
 func (cmd *ScanCommand) Exec(args []string) error {
+	if len(args) > 0 {
+		return fmt.Errorf("scan takes no arguments, got %q", strings.Join(args, " "))
+	}
+
 	output, err := scanning.Scan(cmd.CmdManager.Target, cmd.ModuleManager)

Add "strings" to the import block.

🤖 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/cmd/scan.go` around lines 22 - 26, Update ScanCommand.Exec to
validate args before calling scanning.Scan, rejecting unexpected positional
arguments instead of silently ignoring them; use the existing command
error-handling conventions and add the required strings import if needed for the
validation. Preserve scanning.Scan behavior when no arguments are supplied.
internal/dns/dns.go (1)

16-28: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Distinguish a lookup timeout from a real resolution failure.

Resolve returns a single error for both cases. internal/scanning/scanner.go line 201 then logs "%s does not resolve" and drops the host from the scan. With RESOLVE_TIMEOUT at two seconds and 64 concurrent lookups, a slow or rate-limited resolver produces timeouts, and live hosts silently disappear from the report.

Wrap the timeout case so callers can report it correctly.

♻️ Proposed refactor
 	addrs, err := net.DefaultResolver.LookupHost(ctx, host)
 	if err != nil {
+		if errors.Is(err, context.DeadlineExceeded) {
+			return nil, fmt.Errorf("lookup %s timed out after %s: %w", host, RESOLVE_TIMEOUT, err)
+		}
 		return nil, err
 	}

Add "errors" to the import block.

🤖 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/dns/dns.go` around lines 16 - 28, Update Resolve to distinguish
context deadline timeouts from other lookup failures: when
net.DefaultResolver.LookupHost returns a timeout caused by the function’s
context, wrap that error with a recognizable timeout context while preserving
the original error for inspection via errors.Is; leave non-timeout resolution
errors and successful results unchanged.
🤖 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/module/dns.go`:
- Around line 29-36: Allow DNS lookups for any valid hostname by removing the
target-versus-eTLD+1 rejection in the DNS module while retaining appropriate
invalid-domain handling; update internal/module/dns.go lines 29-36 around
EffectiveTLDPlusOne. Include the apex host as a scanner candidate in
internal/scanning/scanner.go lines 156-171 by removing the logic that skips it,
ensuring the target domain can appear in Found, Live, and Hosts.
- Around line 38-43: Update the target normalization in the DNS lookup flow
around parsed and records so scheme-prefixed URLs use parsed.Hostname() rather
than parsed.Path, while preserving bare-hostname handling. Reuse the existing
scanner host normalization helper, such as hostOf, or extract a shared helper
for both scanner and DNS modules; adjust the EffectiveTLDPlusOne guard as needed
so valid scheme-prefixed targets reach dns.Lookup.

In `@internal/module/http.go`:
- Around line 57-64: The module functions should remain silent because the
scanner owns progress logging. In internal/module/http.go lines 57-64, remove
the logging.Failed and logging.Found calls while preserving return of records
and err; apply the same removal to internal/module/dns.go lines 45-50, leaving
any record-count detail to the scanner log or Render.

In `@internal/module/runner.go`:
- Around line 251-271: The module execution path does not propagate cancellation
from the shell to running scans. In internal/module/runner.go lines 251-271, add
a context.Context parameter to RunModule, pass it to m.Scout, and update
RunInOrder to forward its context; in internal/scanning/scanner.go lines
115-149, accept the context in Scan, derive enumeration and resolution contexts
from it, check ctx.Err() before each module iteration, and pass it to
module.RunModule; in internal/cmd/scan.go lines 22-26, create a cancellable
context in Exec, cancel it when the interrupt signal arrives, and pass it to
scanning.Scan.
- Around line 273-287: Update the RunModule flow and its scanner caller so scans
return only the module data without invoking m.Render(data); preserve rendering
for non-scan callers by adding a distinct scan path or equivalent option around
RunModule.

In `@internal/net/subdomain/finder.go`:
- Around line 159-167: Update the response cleanup in the HTTP request flow
around http.DefaultClient.Do so the return value from resp.Body.Close is
explicitly discarded, satisfying errcheck while preserving the existing status
handling and error propagation.
- Around line 174-195: Update the HackerTarget response parsing around the
scanner loop and latest collection: detect plain-text non-CSV quota/error
responses before processing, and skip individual lines without a comma instead
of returning an error. Preserve already collected hosts and continue scanning
valid CSV lines, while still propagating scanner.Err().

In `@internal/scanning/scanner.go`:
- Around line 156-171: Update candidates so the apex host is retained rather
than skipped when name equals host, while continuing to exclude empty names and
deduplicate repeated names. Ensure the resulting scan includes a HostResult for
the target domain and remains compatible with the effective-registrable-domain
filtering in internal/module/dns.go.
- Around line 79-92: Update the subdomain enumeration call in the scanner flow
to pass the bare-domain variable host to subdomain.FindAll instead of target,
while preserving the existing context, error handling, and candidate resolution
behavior.
- Line 130: Normalize scan targets at the RunModule boundary so every module
receives the canonical bare-host/domain form, while preserving interactive
callers’ raw-target behavior through the same contract. Update RunModule’s
documentation to state the canonical target format, and adjust the scanning call
near module.RunModule so it no longer supplies an inconsistently normalized
value; ensure DnsModule and HttpModule both continue receiving compatible
targets.

In `@internal/style/style.go`:
- Around line 65-71: Normalize embedded newlines for the missing Failure, Found,
and Info style helpers by applying rawLines to their message output, matching
Error and ensuring Failuref, Foundf, and Infof receive CRLF-normalized content.
If normalization is intended for direct style callers as well, update the
corresponding style helpers rather than relying only on logging.line().

---

Nitpick comments:
In `@CHANGELOG.md`:
- Around line 18-26: Add a CHANGELOG.md entry documenting the newly registered
HackerTarget subdomain finder (`hackertarget`) alongside the existing scan and
subdomain-source changes, including that it appears as an additional source and
may produce a corresponding failure source in scan output.

In `@internal/cmd/help.go`:
- Around line 46-66: Update the flag-list formatting in the help-generation
function to compute padding from the longest flag name, matching the existing
command-list alignment approach. Use that calculated width for --target,
--version, --install, and --uninstall so every description starts at the same
column, rather than relying on differing hardcoded spaces.

In `@internal/cmd/scan.go`:
- Around line 22-26: Update ScanCommand.Exec to validate args before calling
scanning.Scan, rejecting unexpected positional arguments instead of silently
ignoring them; use the existing command error-handling conventions and add the
required strings import if needed for the validation. Preserve scanning.Scan
behavior when no arguments are supplied.

In `@internal/dns/dns.go`:
- Around line 16-28: Update Resolve to distinguish context deadline timeouts
from other lookup failures: when net.DefaultResolver.LookupHost returns a
timeout caused by the function’s context, wrap that error with a recognizable
timeout context while preserving the original error for inspection via
errors.Is; leave non-timeout resolution errors and successful results unchanged.

In `@internal/logging/log.go`:
- Around line 30-38: Handle the return value of fmt.Fprint in line, either
checking and handling the write error or explicitly discarding it to document
the intentional behavior and satisfy errcheck. Keep the existing locking,
enabled check, and output formatting unchanged.

In `@internal/scanning/render.go`:
- Around line 26-156: Add table-driven unit tests for the recursive renderer
centered on value, covering top-level scalars, objects, arrays, empty arrays,
arrays mixing scalar and nested elements, and empty-string field values. Assert
the complete rendered output, including indentation, headings, bullets, line
endings, and bare label formatting, while reusing the existing rendering entry
point and style setup.

In `@internal/scanning/scanner.go`:
- Around line 66-77: Reduce Scan’s cognitive complexity by extracting the
per-module host fan-out and goroutine logic from its module-processing loop into
a helper such as runAcrossHosts(result *Result, mi int, m string, manager
*module.Manager, reporter *module.Reporter, sem chan struct{}). Update Scan to
invoke the helper while preserving existing concurrency, reporting, and result
behavior.
- Around line 218-223: Update the pad function to define the column width once
and reuse that named value in the length comparison, padding calculation, and
strings.Repeat call, replacing all repeated 38 literals while preserving the
current alignment behavior.
- Around line 115-149: Update Scan to accept a context.Context, derive
enumeration and resolution contexts from it, and check ctx.Err() before each
module iteration to stop promptly on cancellation. Pass the same context into
module.RunModule so external module execution is cancelled, while preserving
existing scan behavior when the context remains active.
🪄 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 Plus

Run ID: a182375a-26a9-495b-91da-eca77dbeac2e

📥 Commits

Reviewing files that changed from the base of the PR and between 4abcae5 and b88d355.

📒 Files selected for processing (15)
  • CHANGELOG.md
  • cmd/main.go
  • internal/cmd/command.go
  • internal/cmd/help.go
  • internal/cmd/scan.go
  • internal/dns/dns.go
  • internal/logging/log.go
  • internal/module/dns.go
  • internal/module/http.go
  • internal/module/runner.go
  • internal/net/subdomain/finder.go
  • internal/scanning/render.go
  • internal/scanning/scanner.go
  • internal/style/style.go
  • pkg/records/http.go
💤 Files with no reviewable changes (1)
  • pkg/records/http.go

Comment thread internal/module/dns.go
Comment thread internal/module/dns.go
Comment thread internal/module/http.go
Comment thread internal/module/runner.go
Comment thread internal/module/runner.go
Comment thread internal/net/subdomain/finder.go
Comment thread internal/scanning/scanner.go
Comment thread internal/scanning/scanner.go
Comment thread internal/scanning/scanner.go
Comment thread internal/style/style.go
@IdanKoblik
IdanKoblik merged commit b88d355 into main Aug 1, 2026
7 of 8 checks passed
@IdanKoblik
IdanKoblik deleted the feature/scanning branch August 1, 2026 16:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/cli cli-related type/enhancement General improvements type/feature New features or enhancements type/refactor Code refactoring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Split scan internal module

1 participant