Conversation
An open directory library installs a DirectoryStructureGroup (issue 10930): like the other automatic groups it materializes its subgroups from the entries — one DirectoryPathGroup per subdirectory, matching every entry whose source file lives in that directory or below. The lookup reads the live catalog, and the synchronizer invalidates the groups view after structural changes, so the tree follows external renames and additions. The directory groups are read-only in the UI; serialization support keeps "Save as" working (parsed back without a library, the group simply stays empty). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
19 tasks
# Conflicts: # jablib/src/main/java/org/jabref/logic/directorylibrary/DirectoryLibraryScanner.java
Resync layer 5 of the stack (no conflicts). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
…asses The groups panel rebuilds the directory subgroups when the synchronizer invalidates the groups binding; the group classes are null-marked, drop the redundant equality override, and build the subgroup chain without null tracking. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vr3E1Gg5DRU4LQDDVnhPys
# Conflicts: # jablib/src/main/java/org/jabref/logic/directorylibrary/DirectoryLibrarySynchronizer.java # jablib/src/test/java/org/jabref/logic/directorylibrary/DirectoryLibraryScannerTest.java
Fixes the CI format check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
Resync with upstream (no conflicts). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
Upstream added a 0071 ADR after this stack claimed the number, so the MADR duplicate-ID check failed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This was referenced Sep 7, 2026
# Conflicts: # jabgui/src/main/java/org/jabref/gui/groups/GroupNodeViewModel.java
31 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Related issues and pull requests
Phase 4 of the "directory as library" plan (
PLAN.md), stacked on #739 (base branchdirectory-write-back). Implements the directory-library part of JabRef#10930 (dynamic groups mirroring the file system) — not closing it, since the issue also covers plain.biblibraries.PR Description
🤖 The groups panel of a directory library now mirrors its folder tree: each subdirectory appears as a group holding the entries whose files live there, nested folders included. The groups are read-only and follow external file changes as they happen. Saving the library as a
.bibstill works — parsed back outside a directory library, the groups are simply empty.jabref-contrib-policy:4.2:reviewed:okAnalogies
Like honey stored cell by cell, every entry sits visibly in the comb it came from — the folder becomes the group. Like a chocolate bar's grooves, the directory tree gives natural break lines that the groups panel simply traces. And like the moon mirrored on water, the panel is a live reflection: move the folder underneath, and the image follows without anyone redrawing it.
Steps to test
.ymlin a subdirectory externally — the tree and counts follow.Guarded by
DirectoryStructureGroupTest(chain building, tree merging, containment semantics, serialize/parse round trip) and a scanner test asserting the installed groups tree.AI usage
Claude Code (model claude-fable-5).
AI CHECKLIST.md walkthrough
1. Code self-review
Optionalchains for the lookup; noObjects.requireNonNull.RuntimeException/IllegalStateExceptionthrown.GroupsFactory's localized name.@DisplayName.2. Verification commands
./gradlew :jablib:check— only the known environmentalRemote*Testport-conflict failures on this machine (green on CI)../gradlew :jablib:checkstyleMain :jablib:checkstyleTest :jabgui:checkstyleMain../gradlew :jablib:modernizer,./gradlew traceRequirements(newreq~directory-library.groups~1covered),./gradlew :rewriteRunclean.npx markdownlint-cli2on changed Markdown.3. Documentation
CHANGELOG.mdentry (TODO replaced with this PR's link after creation).req~directory-library.groups~1added with impl marker.4. Pull request
gh api(stacked cross-repo).Checklist
CHANGELOG.mddescribing the change from the user's point of view (if the change is visible to the user)🤖 Generated with Claude Code