Skip to content

Comments

Enhance Context Extraction, Fix Javadoc Rendering, and Update Installation Procedures#14

Merged
jher235 merged 5 commits intodevelopfrom
refactor/context-extraction-depth
Feb 23, 2026
Merged

Enhance Context Extraction, Fix Javadoc Rendering, and Update Installation Procedures#14
jher235 merged 5 commits intodevelopfrom
refactor/context-extraction-depth

Conversation

@jher235
Copy link
Owner

@jher235 jher235 commented Feb 23, 2026

📝 Description

This Pull Request introduces significant improvements to the j-focus tool, focusing on optimizing context extraction, enhancing output quality, and streamlining the installation process. The primary goal is to provide more efficient and accurate code context for LLM prompting, while also ensuring a smoother and more secure user experience during setup.

✨ What does this PR do?

  • Optimized Context Extraction Depth:
    • The default analysis depth for the ContextExtractor has been limited to 1 (direct calls only). This change aims to reduce token usage for common LLM prompting scenarios, making the tool more efficient.
    • Full recursive analysis is now enabled when the --verbose (-v) flag is provided, allowing users to retrieve comprehensive call chain context when needed.
    • The ContextExtractor has been updated to accept the verbose parameter for controlling analysis depth.
  • Fixed Javadoc Rendering in Markdown Export:
    • Addressed a bug in the MarkdownExporter where Javadocs were incorrectly rendered as raw JavaParser object strings.
    • The rendering logic has been updated to use toText(), ensuring Javadoc content is displayed correctly and legibly in the generated Markdown.
  • Updated Installation Scripts and Documentation:
    • The download URLs for install.sh and install.ps1 in both README.md and README.ko.md have been updated to point to the develop branch. This ensures users always download the latest versions of the installation scripts.
    • The SHA256 checksums in scripts/install.sh and scripts/install.ps1 have been updated to reflect the latest j-focus JAR, enhancing the security and integrity verification during the installation process.

Summary by CodeRabbit

  • Documentation

    • Installation instructions updated to fetch installer scripts from the develop branch.
  • New Features

    • Added a verbose option to control shallow vs. deep context extraction.
  • Updates

    • Installer integrity checksums refreshed.
    • Documentation export now produces cleaner, more readable JavaDoc text.
  • Bug Fixes

    • Improved recursion handling to avoid repeated traversal and potential cycles.

- Default analysis depth is now limited to 1 (direct calls only) to reduce token usage.
- Enabled full recursive analysis when the `--verbose` (`-v`) flag is provided.
- Fixed a bug in MarkdownExporter where Javadocs were rendered as raw JavaParser object strings by switching to `toText()`.
- Updated ContextExtractor to support depth control via `verbose` parameter.
- Update download URLs for install.sh and install.ps1 in README.md
- Update download URLs for install.sh and install.ps1 in README.ko.md
- Point to the 'develop' branch instead of 'main' for latest script updates
- Rebuild j-focus-1.0.0-all.jar using Gradle
- Update EXPECTED_SHA256 in install.sh and install.ps1 to match the latest build
- Hash: 64d38039c8731215635e8bc609ff95b9e0bc7c7309fb13361e27a7605cbed923
@jher235 jher235 self-assigned this Feb 23, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 23, 2026

📝 Walkthrough

Walkthrough

Updated installer URLs to the develop branch and adjusted installer SHA256s; refactored the CLI annotation and propagated a verbose flag into context extraction; added a new extractContext overload to toggle shallow vs deep traversal; changed non-verbose JavaDoc export to use clean text.

Changes

Cohort / File(s) Summary
Installation & Documentation
README.md, README.ko.md, scripts/install.sh, scripts/install.ps1
Install instructions now fetch scripts from the develop branch; scripts/install.* expected SHA256 updated to 64d38039c8731215635e8b501af9963b3721dfeebfac609ff95b9e0bc7c7309f.
CLI
src/main/java/com/jher235/jfocus/cli/JFocusCli.java
Collapsed @Command annotation into a single line and pass the verbose flag into ContextExtractor.extractContext(...).
Context Extraction
src/main/java/com/jher235/jfocus/core/ContextExtractor.java
Added extractContext(MethodDeclaration, boolean verbose) overload; default delegating overload preserved; recursive traversal accepts and respects verbose (shallow vs deep) and tracks visited nodes to avoid cycles.
Markdown Export
src/main/java/com/jher235/jfocus/core/MarkdownExporter.java
In non-verbose mode, external method JavaDoc is rendered via toText() (clean text) instead of toString().

Sequence Diagram

sequenceDiagram
    participant User as User/CLI
    participant JFocusCli as JFocusCli
    participant ContextExtractor as ContextExtractor
    participant MarkdownExporter as MarkdownExporter

    User->>JFocusCli: run command (may include --verbose)
    JFocusCli->>ContextExtractor: extractContext(targetMethod, verbose)
    alt verbose = true
        ContextExtractor->>ContextExtractor: extractRecursive(target, verbose=true)
        Note over ContextExtractor: deep recursion (follow dependencies)
    else verbose = false
        ContextExtractor->>ContextExtractor: extractRecursive(target, verbose=false)
        Note over ContextExtractor: shallow traversal (direct dependencies only)
    end
    ContextExtractor-->>JFocusCli: ContextResult
    JFocusCli->>MarkdownExporter: format ContextResult (pass verbose)
    alt verbose = true
        MarkdownExporter->>MarkdownExporter: include JavaDoc via toString()
    else verbose = false
        MarkdownExporter->>MarkdownExporter: include JavaDoc via toText()
    end
    MarkdownExporter-->>User: output markdown
Loading

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly Related PRs

Poem

🐰 I hopped to develop, small and spry,
fetching scripts beneath the sky.
Verbose whispers trace calls deep,
shallow hops for quicker peep,
JavaDoc now reads clean and dry. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title comprehensively covers all three primary changes: context extraction depth control, Javadoc rendering fixes, and installation procedure updates.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/context-extraction-depth

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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/main/java/com/jher235/jfocus/core/ContextExtractor.java (1)

26-42: ⚠️ Potential issue | 🟡 Minor

Stale and incomplete Javadoc on the two extractContext overloads.

Two issues:

  1. Line 27: The no-arg overload's Javadoc still says "recursively", but its default behavior is now shallow (verbose=false). The description should reflect the shallow-by-default semantics.
  2. Lines 37–42: The new overload's Javadoc documents @param verbose but is missing @param targetMethod and @return.
📝 Suggested Javadoc fix
-    /**
-     * Extracts the full context for the given target method recursively.
-     *
-     * `@param` targetMethod The method to analyze
-     * `@return` Categorized context (target + internal + external + fields)
-     */
-    // Backward-compatible default: non-verbose (shallow)
+    /**
+     * Extracts the shallow context for the given target method (direct calls only).
+     * Equivalent to {`@code` extractContext(targetMethod, false)}.
+     *
+     * `@param` targetMethod The method to analyze
+     * `@return` Categorized context (target + internal + external + fields)
+     */
     public ContextResult extractContext(MethodDeclaration targetMethod) {
         return extractContext(targetMethod, false);
     }

-    /**
-     * `@param` verbose if true, recursively traverses internal methods to collect
-     *                their external calls as well (deep mode).
-     *                if false, only collects direct (1-depth) calls of the target
-     *                method (shallow mode).
-     */
+    /**
+     * Extracts the context for the given target method.
+     *
+     * `@param` targetMethod The method to analyze
+     * `@param` verbose if true, recursively traverses all dependencies (deep mode);
+     *                if false, only collects direct (1-depth) calls (shallow mode).
+     * `@return` Categorized context (target + internal + external + fields)
+     */
     public ContextResult extractContext(MethodDeclaration targetMethod, boolean verbose) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/com/jher235/jfocus/core/ContextExtractor.java` around lines 26
- 42, Update the Javadoc for both extractContext overloads: for
extractContext(MethodDeclaration) change the description to state it returns a
shallow (non-recursive) context by default and remove the word "recursively";
for extractContext(MethodDeclaration, boolean) add missing `@param` targetMethod
and `@return` tags and clarify `@param` verbose semantics (true = deep/recursive
traversal collecting internal methods' external calls, false = shallow/1-depth
direct calls only). Ensure the method signatures referenced
(extractContext(MethodDeclaration) and extractContext(MethodDeclaration,
boolean)) are mentioned in the comments so the docs accurately reflect behavior.
scripts/install.ps1 (1)

1-5: ⚠️ Potential issue | 🟡 Minor

Consider adding a UTF-8 BOM for cross-environment safety.

PSScriptAnalyzer reports PSUseBOMForUnicodeEncodedFile because the file contains non-ASCII characters (emojis). While iwr ... | iex works on modern PowerShell (5.1+/7+), saving this script locally and executing it in older or non-default console configurations can result in garbled emoji output. Adding a UTF-8 BOM ensures the encoding is unambiguous across all execution contexts.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/install.ps1` around lines 1 - 5, The script contains non-ASCII
characters (emojis) and triggers PSUseBOMForUnicodeEncodedFile; update the
install script header (the top of the file where $ErrorActionPreference is set)
to be saved as UTF-8 with a BOM so PowerShell reliably recognizes the encoding
across environments—re-save the file as "UTF-8 with BOM" (or configure the
repository CI/editor to write a BOM for this file) so the emojis and output are
not garbled when executed on older/non-default consoles.
🧹 Nitpick comments (1)
src/main/java/com/jher235/jfocus/core/ContextExtractor.java (1)

53-54: Optional: replace shallow = !verbose inversion with direct verbose threading.

The !verbose negation at the call site and the inverse semantics of shallow in extractRecursive create a mental context-switch. Renaming shallow to verbose and flipping the guard condition would make the two methods read consistently.

♻️ Proposed optional refactor
-        // shallow = !verbose: in shallow mode, stop recursing after the first level
-        extractRecursive(targetMethod, targetMethod, result, visited, !verbose);
+        extractRecursive(targetMethod, targetMethod, result, visited, verbose);
-    private void extractRecursive(MethodDeclaration rootTarget,
-            MethodDeclaration currentMethod,
-            ContextResult result,
-            Set<String> visited,
-            boolean shallow) {
+    private void extractRecursive(MethodDeclaration rootTarget,
+            MethodDeclaration currentMethod,
+            ContextResult result,
+            Set<String> visited,
+            boolean verbose) {
 
         ...
 
-            // In shallow mode, do not recurse further beyond the first level
-            if (!shallow) {
-                extractRecursive(rootTarget, dep, result, visited, shallow);
-            }
+            // In verbose (deep) mode, continue recursion beyond the first level
+            if (verbose) {
+                extractRecursive(rootTarget, dep, result, visited, verbose);
+            }

Also applies to: 68-72, 99-102

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/com/jher235/jfocus/core/ContextExtractor.java` around lines 53
- 54, The code passes !verbose into extractRecursive as the shallow flag which
inverts semantics and forces cognitive flips; rename the extractRecursive
parameter from shallow to verbose (or add an overload) and invert its internal
guard so the parameter now means "verbose", then update all call sites
(including the calls from ContextExtractor that currently pass !verbose at the
lines around the existing extractRecursive invocation(s)) to pass verbose
directly; ensure you update the parameter name in the method signature
(extractRecursive) and any internal checks that used shallow to use the new
verbose meaning so logic remains equivalent but more readable.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@README.ko.md`:
- Line 142: The README curl line currently references the unstable 'develop'
branch ("curl -sL
https://raw.githubusercontent.com/jher235/j-focus/develop/scripts/install.sh |
bash"); update this to point to a stable branch or tag (for example replace
'develop' with 'main' or a specific release tag) and make the same change for
the other occurrence noted (same command at the other line). Ensure both
README.ko.md and README.md use the identical stable branch/tag string so the
install command is consistent across both files.

In `@README.md`:
- Line 142: The README uses a one-liner that curls the install script from the
mutable "develop" branch which is unsafe; update the two occurrences of the curl
command string ("curl -sL
https://raw.githubusercontent.com/jher235/j-focus/develop/scripts/install.sh |
bash") to reference an immutable ref such as the v1.0.0 tag
(https://raw.githubusercontent.com/jher235/j-focus/v1.0.0/scripts/install.sh) or
the stable main branch, and document the chosen immutable ref in the README so
users run a pinned, auditable installer.

---

Outside diff comments:
In `@scripts/install.ps1`:
- Around line 1-5: The script contains non-ASCII characters (emojis) and
triggers PSUseBOMForUnicodeEncodedFile; update the install script header (the
top of the file where $ErrorActionPreference is set) to be saved as UTF-8 with a
BOM so PowerShell reliably recognizes the encoding across environments—re-save
the file as "UTF-8 with BOM" (or configure the repository CI/editor to write a
BOM for this file) so the emojis and output are not garbled when executed on
older/non-default consoles.

In `@src/main/java/com/jher235/jfocus/core/ContextExtractor.java`:
- Around line 26-42: Update the Javadoc for both extractContext overloads: for
extractContext(MethodDeclaration) change the description to state it returns a
shallow (non-recursive) context by default and remove the word "recursively";
for extractContext(MethodDeclaration, boolean) add missing `@param` targetMethod
and `@return` tags and clarify `@param` verbose semantics (true = deep/recursive
traversal collecting internal methods' external calls, false = shallow/1-depth
direct calls only). Ensure the method signatures referenced
(extractContext(MethodDeclaration) and extractContext(MethodDeclaration,
boolean)) are mentioned in the comments so the docs accurately reflect behavior.

---

Nitpick comments:
In `@src/main/java/com/jher235/jfocus/core/ContextExtractor.java`:
- Around line 53-54: The code passes !verbose into extractRecursive as the
shallow flag which inverts semantics and forces cognitive flips; rename the
extractRecursive parameter from shallow to verbose (or add an overload) and
invert its internal guard so the parameter now means "verbose", then update all
call sites (including the calls from ContextExtractor that currently pass
!verbose at the lines around the existing extractRecursive invocation(s)) to
pass verbose directly; ensure you update the parameter name in the method
signature (extractRecursive) and any internal checks that used shallow to use
the new verbose meaning so logic remains equivalent but more readable.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f6ff0b2 and d1a25e8.

📒 Files selected for processing (7)
  • README.ko.md
  • README.md
  • scripts/install.ps1
  • scripts/install.sh
  • src/main/java/com/jher235/jfocus/cli/JFocusCli.java
  • src/main/java/com/jher235/jfocus/core/ContextExtractor.java
  • src/main/java/com/jher235/jfocus/core/MarkdownExporter.java

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

> [!CAUTION]

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
scripts/install.ps1 (1)

1-70: ⚠️ Potential issue | 🟡 Minor

PSScriptAnalyzer: add UTF-8 BOM to prevent emoji corruption on Windows PowerShell 5.x.

The file uses emoji characters (🚀, 📂, ⬇️, etc.) throughout Write-Host calls. Without a UTF-8 BOM, Windows PowerShell 5.x may misinterpret the multi-byte sequences, garbling or breaking the output. PowerShell 7+ handles BOM-less UTF-8 correctly, but the install audience is likely broad.

Save the file as UTF-8 with BOM (e.g., UTF-8-BOM in VS Code, or Out-File -Encoding utf8BOM in PowerShell).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/install.ps1` around lines 1 - 70, The script contains emoji in
several Write-Host calls (e.g., the "🚀 Starting J-Focus installation..." and
other Write-Host lines) which can be garbled on Windows PowerShell 5.x if the
file has no BOM; fix by saving scripts/install.ps1 with UTF-8 BOM encoding (use
your editor's "UTF-8 with BOM" option or re-save the file using PowerShell's
UTF-8-BOM save option) so $ErrorActionPreference and all Write-Host output
render correctly across PowerShell versions.
🧹 Nitpick comments (1)
scripts/install.ps1 (1)

30-30: Prefer enabling TLS 1.2 and 1.3 rather than locking to TLS 1.2 only.

Pinning to Tls12 exclusively prevents Invoke-WebRequest from negotiating TLS 1.3 even when both the client and GitHub's servers support it. The original intent was to work around .NET Framework ≤4.5 defaulting to TLS 1.0/1.1, but this also caps the ceiling.

🔒 Proposed fix
-    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/install.ps1` at line 30, The current assignment to
[Net.ServicePointManager]::SecurityProtocol forces TLS 1.2 only; change it so
the SecurityProtocol value includes both TLS 1.2 and TLS 1.3 (use a bitwise OR
of the SecurityProtocolType flags) so Invoke-WebRequest can negotiate TLS 1.3
when available; update the assignment to set
[Net.ServicePointManager]::SecurityProtocol to include both
[Net.SecurityProtocolType]::Tls12 and [Net.SecurityProtocolType]::Tls13 (using
-bor) in the scripts/install.ps1 code path where
[Net.ServicePointManager]::SecurityProtocol is set.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@scripts/install.ps1`:
- Around line 1-70: The script contains emoji in several Write-Host calls (e.g.,
the "🚀 Starting J-Focus installation..." and other Write-Host lines) which can
be garbled on Windows PowerShell 5.x if the file has no BOM; fix by saving
scripts/install.ps1 with UTF-8 BOM encoding (use your editor's "UTF-8 with BOM"
option or re-save the file using PowerShell's UTF-8-BOM save option) so
$ErrorActionPreference and all Write-Host output render correctly across
PowerShell versions.

---

Nitpick comments:
In `@scripts/install.ps1`:
- Line 30: The current assignment to [Net.ServicePointManager]::SecurityProtocol
forces TLS 1.2 only; change it so the SecurityProtocol value includes both TLS
1.2 and TLS 1.3 (use a bitwise OR of the SecurityProtocolType flags) so
Invoke-WebRequest can negotiate TLS 1.3 when available; update the assignment to
set [Net.ServicePointManager]::SecurityProtocol to include both
[Net.SecurityProtocolType]::Tls12 and [Net.SecurityProtocolType]::Tls13 (using
-bor) in the scripts/install.ps1 code path where
[Net.ServicePointManager]::SecurityProtocol is set.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d1a25e8 and 884b9c8.

📒 Files selected for processing (2)
  • scripts/install.ps1
  • scripts/install.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/install.sh

- Rename confusing 'shallow' parameter to 'verbose' in extractRecursive
- Invert recursion logic to align with verbose naming convention
- Update Javadoc for extractContext methods to accurately reflect behavior
- Simplify method calls by removing unnecessary boolean negation
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/main/java/com/jher235/jfocus/core/ContextExtractor.java (1)

72-107: rootClass is recomputed on every recursive invocation despite being invariant.

rootTarget never changes throughout the recursion, so rootTarget.findAncestor(ClassOrInterfaceDeclaration.class) at line 80 always produces the same result. In verbose (deep) mode with large call graphs, this is redundant AST traversal on every frame.

Consider computing it once in extractContext and threading it through as a parameter:

♻️ Proposed refactor
 public ContextResult extractContext(MethodDeclaration targetMethod, boolean verbose) {
     ContextResult result = new ContextResult(targetMethod);
     result.setUsedFields(dependencyResolver.resolveFields(targetMethod));
     Set<String> visited = new HashSet<>();
     visited.add(AstUtils.createMethodId(targetMethod));
-    extractRecursive(targetMethod, targetMethod, result, visited, verbose);
+    ClassOrInterfaceDeclaration rootClass = targetMethod
+            .findAncestor(ClassOrInterfaceDeclaration.class)
+            .orElse(null);
+    extractRecursive(rootClass, targetMethod, result, visited, verbose);
     return result;
 }

 private void extractRecursive(
-        MethodDeclaration rootTarget,
+        ClassOrInterfaceDeclaration rootClass,
         MethodDeclaration currentMethod,
         ContextResult result,
         Set<String> visited,
         boolean verbose) {

     List<MethodDeclaration> dependencies = dependencyResolver.resolveMethods(currentMethod);

-    ClassOrInterfaceDeclaration rootClass = rootTarget.findAncestor(ClassOrInterfaceDeclaration.class)
-            .orElse(null);

     for (MethodDeclaration dep : dependencies) {
         ...
         if (verbose) {
-            extractRecursive(rootTarget, dep, result, visited, verbose);
+            extractRecursive(rootClass, dep, result, visited, verbose);
         }
     }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/com/jher235/jfocus/core/ContextExtractor.java` around lines 72
- 107, The method extractRecursive repeatedly computes rootClass via
rootTarget.findAncestor(...) even though rootTarget is invariant; compute
rootClass once in extractContext and pass it into extractRecursive as an extra
parameter (e.g., add ClassOrInterfaceDeclaration rootClassParam to
extractRecursive signature), update all calls (including recursive calls inside
extractRecursive) to use this parameter instead of recomputing, and remove the
local recomputation and related null handling inside extractRecursive.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/main/java/com/jher235/jfocus/core/ContextExtractor.java`:
- Around line 72-107: The method extractRecursive repeatedly computes rootClass
via rootTarget.findAncestor(...) even though rootTarget is invariant; compute
rootClass once in extractContext and pass it into extractRecursive as an extra
parameter (e.g., add ClassOrInterfaceDeclaration rootClassParam to
extractRecursive signature), update all calls (including recursive calls inside
extractRecursive) to use this parameter instead of recomputing, and remove the
local recomputation and related null handling inside extractRecursive.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 884b9c8 and 30504a9.

📒 Files selected for processing (1)
  • src/main/java/com/jher235/jfocus/core/ContextExtractor.java

@jher235 jher235 merged commit d45e1c0 into develop Feb 23, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant