Skip to content

Programmatic Hayagriva writer (directory-as-library, phase 0) - #736

Open
koppor wants to merge 72 commits into
mainfrom
hayagriva-writer
Open

koppor wants to merge 72 commits into
mainfrom
hayagriva-writer

Conversation

@koppor

@koppor koppor commented Jul 13, 2026 •

Copy link
Copy Markdown
Member

📚 Directory-as-library stack — bottom → top, each builds on the one below:

  1. Programmatic Hayagriva writer (directory-as-library, phase 0) #736 · Hayagriva YAML writer ← this PR
  2. Open folder as library (directory as library, phase 1) #737 · Open folder as library
  3. Live inbound sync for directory libraries (phase 2) #738 · Inbound file sync
  4. Write-back to Hayagriva sidecars (directory as library, phase 3) #739 · Write-back to sidecars
  5. Groups panel mirrors the directory structure (phase 4, #10930) #740 · Directory-structure groups
  6. Pattern-driven pair renames for directory libraries (phase 5a) #741 · Pattern-driven pair renames
  7. Mirror directory libraries into a .bib with git-sync merge-back #743 · .bib mirror + merge-back
  8. Convert .bib libraries into directory libraries #744 · Convert .bib → directory
  9. Make directory libraries reachable through the REST API #745 · REST API support
  10. Split DirectoryLibrarySynchronizer into collaborators #760 · Split the synchronizer

Related issues and pull requests

Phase 0 of the "directory as library" plan — see PLAN.md on the directory-as-library branch. Groundwork for the sidecar write-back (phase 3) and, transitively, for JabRef#10930. No issue is closed by this PR.

Implements the idea of #121 in another way.

PR Description

🤖 JabRef's Hayagriva YAML export is rewritten so that exporting an entry and importing it back returns the same data, including structured titles, author details, and any hand-written keys JabRef does not recognise. Only the fields that actually changed are rewritten, so the rest of a file is left untouched. This is the persistence groundwork the directory-as-library feature needs to update sidecar files without losing manual edits.

jabref-contrib-policy:4.2:reviewed​:ok

Analogies

Like honey, the shared HayagrivaMapping is slow-poured but keeps importer and exporter sweetly in sync long after this branch is forgotten. Like chocolate, the read-modify-write merge is layered: bite into a sidecar file and the structure underneath stays intact. And like the moon, the exporter shows the user the same familiar face while quietly pulling the tide for the directory-as-library feature behind it.

Steps to test

  1. Import a Hayagriva file (e.g. jablib/src/test/resources/org/jabref/logic/importer/fileformat/basic.yml) via File > Import into new library.
  2. Export it with File > Export > Hayagriva YAML and re-import the result: all entries come back identical.
  3. Round-trip guarantees are covered by the new HayagrivaRoundTripTest (field-exact round trips for writer-authored entries plus a stability check over the upstream Hayagriva test fixture) and HayagrivaEntryWriterTest (read-modify-write preservation).

No visible UI change, hence no screenshot.

AI usage

Claude Code (model claude-fable-5).

AI CHECKLIST.md walkthrough

1. Code self-review

Nullability and control flow
  • No == null / != null checks — JSpecify annotations used instead. (Exception: JsonNode.get(...) returns nullable nodes by API design; those checks match the existing, merged importer code.)
  • No Objects.requireNonNull(...).
  • New classes annotated with @NullMarked.
  • Optional consumed with ifPresent / ifPresentOrElse / map — no isPresent() + get() blocks.
  • [/] StringUtil.isBlank(...) — no null-or-blank checks needed.
Exceptions
  • No catch (Exception e) — only JacksonException is caught.
  • No throw new RuntimeException(...) / IllegalStateException(...) — JacksonException is wrapped into IOException.
  • [/] Logged exceptions — no logging added.
Style and idioms
  • New BibEntry objects built with withers in tests.
  • Modern Java: List.of(), Map.ofEntries(), SequencedMap, text blocks in tests.
  • Regexes use precompiled Pattern constants (TYPE_LINE_PATTERN, unchanged).
  • [/] Background work — none.
  • No commented-out code, no trivial comments, no AI-disclosure comments.
  • Markdown Javadoc (///) with Markdown syntax.
User-facing text
  • [/] No new user-facing strings (exporter display name follows the existing unlocalized exporter-name convention).
  • [/] Sentence case — no new labels.
  • [/] Placeholders — no new localized strings.
Security
  • [/] No HTML output.
Tests
  • Behavior changes in org.jabref.logic covered: HayagrivaExporterTest (golden output), HayagrivaEntryWriterTest (read-modify-write), HayagrivaRoundTripTest (symmetry), HayagrivaImporterTest kept green (now round-tripping through the programmatic exporter).
  • Tests assert object contents with plain JUnit asserts, no @DisplayName, exceptions propagate, @TempDir used.

2. Verification commands

  • ./gradlew :jablib:check
  • ./gradlew :jablib:checkstyleMain :jablib:checkstyleTest :jablib:checkstyleJmh
  • ./gradlew :jablib:modernizer
  • ./gradlew --no-configuration-cache :rewriteDryRun reports no changes.
  • ./gradlew :jablib:javadoc
  • npx markdownlint-cli2 on the changed Markdown (CHANGELOG.md).
  • [/] IntelliJ-format docker image — not runnable on this machine (no docker group membership); rewriteRun + checkstyle are clean, CI format job is the backstop.

3. Documentation

  • CHANGELOG.md entry added (TODO placeholder replaced with this PR's link after creation).
  • Searched jabref and jabref-koppor issues for related issues — none matched confidently; nothing closed.
  • [/] Requirements doc — internal exporter reimplementation, no new user-facing feature.
  • [/] Developer docs — no architecture change.

4. Pull request

  • PR body built from .github/PULL_REQUEST_TEMPLATE.md, every section filled.
  • All checklist items kept and marked.
  • All HTML comments removed.
  • PR created from a body file (via gh api, because a same-owner cross-repo head requires the head_repo parameter that gh pr create does not expose).
  • CHANGELOG.md TODO placeholder replaced with the real PR link after creation, committed and pushed.

Checklist

  • I own the copyright of the code submitted and I license it under the MIT license
  • If AI tools were used, I disclosed them in the "AI usage" section and reviewed, understood, and take full ownership of all AI-generated code
  • I manually tested my changes in running JabRef (via jabkit convert --output-format hayagrivayaml, which exercises the same ExporterFactory registration as the GUI export dialog)
  • I added JUnit tests for changes (if applicable)
  • [/] I added screenshots in the PR description (if change is visible to the user)
  • [/] I added a screenshot in the PR description showing a library with a single entry with me as author and as title the issue number
  • I added one sentence (max 20 words) to CHANGELOG.md describing the change from the user's point of view (if the change is visible to the user)
  • [/] I checked the user documentation for up to dateness and submitted a pull request to our user documentation repository

🤖 Generated with Claude Code

koppor and others added 5 commits July 13, 2026 17:44
Extract the importer's field mapping into HayagrivaMapping and add
HayagrivaEntryWriter, whose read-modify-write merge only rewrites the
YAML paths whose value actually changed, so structured titles, person
details, foreign serial-number schemes, and unknown keys survive a
rewrite. Register the new HayagrivaExporter instead of the layout
template and drop the hayagrivayaml layout files and the HayagrivaType
layout formatter.

Groundwork for directory-as-library (PLAN.md on branch
directory-as-library), which will persist per-PDF Hayagriva sidecars.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Hayagriva writer's public API in exported packages now carries
JsonNode/ObjectNode types, so consumers of jablib need readability of
tools.jackson.databind (flagged by checkModuleDirectivesScope).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
JabRef's Comment field and the per-user comment fields were silently
dropped on export because they have no Hayagriva key; they are now
written as comment/comment-<name> extension keys, which the Hayagriva
parser ignores, so the files stay loadable by Typst. Entries carrying
only the BibTeX year/month fields lost their date entirely; the writer
now resolves date through the field aliases.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q5Y5GTihE9rZxKrvPqnHV4
koppor and others added 7 commits July 23, 2026 20:11
Resync the bottom of the directory-as-library stack with ~2 months of
upstream. Conflicts were in the Hayagriva exporter area upstream evolved
in parallel (the #16514 null->"" TemplateExporter refactor): kept this
branch's programmatic HayagrivaExporter over the layout template in
ExporterFactory and HayagrivaImporterTest, and kept the deletion of the
obsolete layout-based HayagrivaYamlExporterTest (replaced here by
HayagrivaExporterTest/HayagrivaEntryWriterTest/HayagrivaRoundTripTest).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
A merge of an unchanged entry dropped a top-level volume next to a periodical parent, and clearing the journal lost the volume/issue it carried; number-looking strings were written unquoted and read back as numbers; a series next to a booktitle did not survive a re-import. The node-level API and the transitive Jackson requirement are no longer exposed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vr3E1Gg5DRU4LQDDVnhPys
Fixes the CI format check after the upstream resync merge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
Resync #736 with upstream and fix the module-directive scope check.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
koppor and others added 4 commits September 16, 2026 09:15
…rkflow (#17182)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* New translations jabref_en.properties for (French)

* New translations jabref_en.properties for (Spanish)

* New translations jabref_en.properties for (German)

* New translations jabref_en.properties for (Finnish)

* New translations jabref_en.properties for (Italian)

* New translations jabref_en.properties for (Russian)

* New translations jabref_en.properties for (Chinese Simplified)

* New translations jabref_en.properties for (Portuguese, Brazilian)
Bumps [jablib/src/main/resources/csl-styles](https://github.com/citation-style-language/styles) from `5ad4733` to `90e657c`.
- [Release notes](https://github.com/citation-style-language/styles/releases)
- [Commits](citation-style-language/styles@5ad4733...90e657c)

---
updated-dependencies:
- dependency-name: jablib/src/main/resources/csl-styles
  dependency-version: 90e657c8622ec1c6f27788e041b355efac659397
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [jablib/src/main/resources/csl-locales](https://github.com/citation-style-language/locales) from `9ded661` to `a89adec`.
- [Release notes](https://github.com/citation-style-language/locales/releases)
- [Commits](citation-style-language/locales@9ded661...a89adec)

---
updated-dependencies:
- dependency-name: jablib/src/main/resources/csl-locales
  dependency-version: a89adece41013402236e2c9020972d7e931fbab8
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dependabot Bot and others added 28 commits September 21, 2026 21:07
Bumps [org.hisp.dhis:json-tree](https://github.com/dhis2/json-tree) from 1.9.4 to 1.9.5.
- [Release notes](https://github.com/dhis2/json-tree/releases)
- [Changelog](https://github.com/dhis2/json-tree/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dhis2/json-tree/commits)

---
updated-dependencies:
- dependency-name: org.hisp.dhis:json-tree
  dependency-version: 1.9.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* Keep library close working when cleanup throws an Error

The cleanup steps in LibraryTab#onClosed only guarded against
RuntimeException, so an Error escaped into the JavaFX event handler,
aborted the close and popped the uncaught-exception dialog again on
every further attempt to quit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WCr1LbJXj8TdVSPSJSpeJz

* Use TODO placeholder for changelog link

* Link changelog entry to PR

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WCr1LbJXj8TdVSPSJSpeJz

* Catch LinkageError instead of Throwable during library cleanup

Fatal errors (VirtualMachineError, ThreadDeath) must not be swallowed;
the detached-classpath failure this guards against is a LinkageError.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WCr1LbJXj8TdVSPSJSpeJz

* Drop CHANGELOG.md changes from this PR

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WCr1LbJXj8TdVSPSJSpeJz

* Catch Throwable during library cleanup

Closing a library must always succeed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WCr1LbJXj8TdVSPSJSpeJz

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Rebasing re-added stale unreleased entries and dropped empty section headings after a release.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* Add jabkit git merge-driver for semantic .bib merges

Exposes JabRef's three-way semantic merge (SemanticMergeAnalyzer +
GitMergeApplier) as a Git merge driver: `jabkit git merge-driver
BASE CURRENT OTHER` writes current + (other - base) into CURRENT,
exits 0 on a clean merge and 1 when semantic conflicts remain.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UpFy4JVhKFAFugkbTemRoA

* Link PR in CHANGELOG

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UpFy4JVhKFAFugkbTemRoA

* Reject merges that would silently drop content

The semantic merge plan only covers entries with a citation key, so entry
type changes, @string definitions, preamble, epilogue, metadata and keyless
entries from OTHER never reached CURRENT while the driver reported success.
Type changes are now applied; the rest makes the driver report a conflict.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Merge entry types three-way, compare persisted metadata

Entry types were only propagated when CURRENT kept BASE's type, so
divergent type changes, a type change against a deletion, and additions of
the same key with different types passed as clean merges. They are now
reported as conflicts. Metadata is compared in its serialized form, since
MetaData.equals ignores unknown metadata items.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Keep merging around conflicting entries, fix dependency scope

Entries with a type conflict are removed from the merge plan instead of
discarding it, so safe changes of the other entries still reach CURRENT.
GitFileWriter aborts the atomic write when the encoding cannot represent
the content, which otherwise replaced the file with lossy content. jabkit
requires org.jspecify directly, and the merge-driver smoke test now checks
that the driver stays silent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Register EventBus subscriber for the native image

Applying the merge plan sets fields on entries that belong to a database,
which dispatches a FieldChangedEvent to BibDatabase via Guava's EventBus.
Its subscriber is invoked reflectively and thus failed in the native image.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Register KeyChangeListener subscribers for the native image

Same reflective EventBus dispatch as the previous commit: applying the
merge plan reaches the listener that keeps cross-references in sync.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Move the merge driver setup to the user documentation

The developer documentation keeps the contract and the limits of the
driver and links to the user documentation for the Git configuration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Preserve custom entry types, refuse unparseable input

Rewriting CURRENT dropped its custom entry type definitions, because the
writer got a fresh BibEntryTypesManager; it now gets the types parsed from
CURRENT. A file the parser reported a warning for (a duplicate @string name,
for instance) cannot be written back without loss and is refused, and the
mergeability check covers custom entry types and the comments of @Strings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Link the section instead of the not-yet-published page

The user documentation page is still in review, so its deep link 404s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Escape the Git placeholders in the merge-driver help

picocli formats the help text, so %O %A %B made it warn about an unknown
conversion instead of printing the setup command.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Merge entry comments, guard the file prolog

The comment written above an entry took part in neither the merge plan nor
the conflict detection, so a comment changed in OTHER alone was dropped
while the merge reported success; it is now merged like the entry type.
The shared database ID and the encoding are compared as well, and a comment
in front of an @comment block makes the driver refuse the merge, because
JabRef's parser drops it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Harden the comment handling of the merge driver

A deletion on one side now conflicts with a comment change on the other,
the guard for comments an @comment block swallows reads the file in its own
encoding instead of assuming UTF-8, and it matches the entry type the way
the parser does: case-insensitively, indentation allowed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Assert the conflict output, drop restating comments

The conflict tests compare the complete stderr output instead of looking
for a citation key somewhere in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Trace the merge driver as a feature

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Return the clean merge at the end of the driver

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Refuse custom entry types no entry uses

The writer emits the definition of a custom entry type only for types an
entry uses, so a standalone definition disappeared on rewrite. The aborted
write on an encoding problem gets a regression test.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xQwRqLx2R27m7xFYPfAdK

* Move the merge logic of the Git merge driver into jablib

The jabkit command now only maps Git's driver contract to exit codes and messages. BibFileMerger does the work and reports a sealed MergeOutcome, MergePreconditions names every reason a merge is refused, and EntryPropertyMerge applies the three-way rules to entry type and comment. Refuses two more lossy cases: an empty entry and a comment in front of @Preamble.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G5wUZVmQHA3aUjgNPTNaTG

* Keep only the implementation view in the code-howto

The user-visible merge behavior moves to the user documentation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G5wUZVmQHA3aUjgNPTNaTG

* Declare jspecify as compile-time-only module dependency of jabkit

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G5wUZVmQHA3aUjgNPTNaTG

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Wanling <164749591+wanling0000@users.noreply.github.com>
#17235)

* Link the CHANGELOG.md diff in the merge-main run summary

Merge commits from main are large; the link jumps straight to the changelog changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Write the commit summary in the merge action, so conflict auto-merges get it too

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Drop trailing blank line

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
It moves an increment into the for update clause even when a continue
skips it, which changes behavior.

Triggered by openrewrite/rewrite-static-analysis#1061

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Fix adding "dev: into-stable" for a newly linked bug

The label step failed because the machine token may not read organization data.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Clarify comment

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* Restore AI chat scroll position when switching back to an entry

Switching entries and back jumped the chat to the bottom. The scroll pane now remembers the position per chat history and restores it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Link PR in CHANGELOG.md

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Guard deferred scroll restore against a list switch

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Use weak identity keys for saved scroll positions

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Fix issues using OpenRewrite

* Use plain if for the saved scroll position

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Update html-to-node to 0.3.0

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Update JavaFX to 27

html-to-node 0.3.0 calls rich-text incubator APIs that exist only in JavaFX 27.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Use JavaFX 27 in journal list generators

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Link selected auto-found file on "+" in the File field

Pressing "+" with an automatically found, not yet linked file selected now links that file directly instead of opening the "Add file link" dialog.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5ibD7MmLqVmjTFkqipStf

* Link PR in changelog

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5ibD7MmLqVmjTFkqipStf

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…17239)

* Label new issues "status: needs-triage" and block /assign-me on them

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Fix YAML syntax of decline step

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* Make case-sensitive search work in linked files

The Lucene index for linked files only kept the lowercased, stemmed text,
so `=!`, `==!` and `=~!` silently matched every spelling. Contents and
annotations are now additionally indexed case-preserving, and case-sensitive
comparisons are routed to those fields.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Fix formatting

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Say casing in CHANGELOG entry

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Stop re-exporting Lucene highlighter

SearchResult no longer exposes a Highlighter in its API.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Update SqlBasedLibrarySearcherWithBibFilesTest.java

* Update InMemoryLuceneSearchBackendTest.java

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com>
* New translations jabref_en.properties for (French)

* New translations jabref_en.properties for (Spanish)

* New translations jabref_en.properties for (Arabic)

* New translations jabref_en.properties for (Danish)

* New translations jabref_en.properties for (German)

* New translations jabref_en.properties for (Greek)

* New translations jabref_en.properties for (Finnish)

* New translations jabref_en.properties for (Italian)

* New translations jabref_en.properties for (Japanese)

* New translations jabref_en.properties for (Korean)

* New translations jabref_en.properties for (Dutch)

* New translations jabref_en.properties for (Norwegian)

* New translations jabref_en.properties for (Polish)

* New translations jabref_en.properties for (Portuguese)

* New translations jabref_en.properties for (Russian)

* New translations jabref_en.properties for (Swedish)

* New translations jabref_en.properties for (Turkish)

* New translations jabref_en.properties for (Ukrainian)

* New translations jabref_en.properties for (Chinese Simplified)

* New translations jabref_en.properties for (Chinese Traditional)

* New translations jabref_en.properties for (Vietnamese)

* New translations jabref_en.properties for (Portuguese, Brazilian)

* New translations jabref_en.properties for (Indonesian)

* New translations jabref_en.properties for (Persian)

* New translations jabref_en.properties for (Tagalog)
…-specobject (#17248)

Bumps [org.itsallcode.openfasttrace:openfasttrace-exporter-specobject](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-exporter-specobject
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

Bumps [org.itsallcode.openfasttrace:openfasttrace-api](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-api
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [org.itsallcode.openfasttrace:openfasttrace](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…-specobject (#17245)

Bumps [org.itsallcode.openfasttrace:openfasttrace-exporter-specobject](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-exporter-specobject
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

Bumps [org.itsallcode.openfasttrace:openfasttrace-api](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-api
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [org.itsallcode.openfasttrace:openfasttrace](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…7246)

Bumps [org.itsallcode.openfasttrace:openfasttrace-core](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-core
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [org.hibernate.validator:hibernate-validator](https://github.com/hibernate/hibernate-validator) from 9.1.3.Final to 9.1.4.Final.
- [Release notes](https://github.com/hibernate/hibernate-validator/releases)
- [Changelog](https://github.com/hibernate/hibernate-validator/blob/9.1.4.Final/changelog.md)
- [Commits](hibernate/hibernate-validator@9.1.3.Final...9.1.4.Final)

---
updated-dependencies:
- dependency-name: org.hibernate.validator:hibernate-validator
  dependency-version: 9.1.4.Final
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
….3.0 in /build-logic (#17250)

* Chore(deps): Bump org.itsallcode:openfasttrace-gradle in /build-logic

Bumps org.itsallcode:openfasttrace-gradle from 3.2.0 to 3.3.0.

---
updated-dependencies:
- dependency-name: org.itsallcode:openfasttrace-gradle
  dependency-version: 3.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* remove workaround for openfassttrace

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Christoph <siedlerkiller@gmail.com>
* Update Grobid url from http to https

* fix test

* fix(preferences): migrate Grobid URL

Migrate the legacy endpoint during GUI and JabKit startup without changing custom URLs.

* public no longer needed in main

* changelog

* restore public

* Apply suggestion from @subhramit

---------

Co-authored-by: Subhramit Basu <subhramit.bb@live.in>
* Clarify requirements documentation

* Apply batched suggestions from code review

Co-authored-by: InAnYan <ruslanpopov1512@gmail.com>

---------

Co-authored-by: Ruslan <ruslan@example.com>
Co-authored-by: Oliver Kopp <kopp.dev@gmail.com>
…moved entry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@koppor koppor added this to the 1 - soon-upstream milestone Sep 23, 2026
koppor pushed a commit that referenced this pull request Sep 23, 2026
JabRef:hayagriva-writer (#736)
JabRef:help-background-tasks (#771)
JabRef:directory-split (#760)

This branch has not been deployed

No deployments
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.

6 participants