Conversation
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>
This was referenced Jul 13, 2026
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
19 tasks
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
This was referenced Sep 7, 2026
31 tasks
…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>
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>
Claude-Session: https://claude.ai/code/session_01FRGLfJrbbmoByCo3Srfsgb 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>
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 0 of the "directory as library" plan — see
PLAN.mdon thedirectory-as-librarybranch. 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:okAnalogies
Like honey, the shared
HayagrivaMappingis 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
jablib/src/test/resources/org/jabref/logic/importer/fileformat/basic.yml) via File > Import into new library.HayagrivaRoundTripTest(field-exact round trips for writer-authored entries plus a stability check over the upstream Hayagriva test fixture) andHayagrivaEntryWriterTest(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
== null/!= nullchecks — JSpecify annotations used instead. (Exception:JsonNode.get(...)returns nullable nodes by API design; those checks match the existing, merged importer code.)Objects.requireNonNull(...).@NullMarked.Optionalconsumed withifPresent/ifPresentOrElse/map— noisPresent()+get()blocks.StringUtil.isBlank(...)— no null-or-blank checks needed.Exceptions
catch (Exception e)— onlyJacksonExceptionis caught.throw new RuntimeException(...)/IllegalStateException(...)—JacksonExceptionis wrapped intoIOException.Style and idioms
BibEntryobjects built with withers in tests.List.of(),Map.ofEntries(),SequencedMap, text blocks in tests.Patternconstants (TYPE_LINE_PATTERN, unchanged).///) with Markdown syntax.User-facing text
Security
Tests
org.jabref.logiccovered:HayagrivaExporterTest(golden output),HayagrivaEntryWriterTest(read-modify-write),HayagrivaRoundTripTest(symmetry),HayagrivaImporterTestkept green (now round-tripping through the programmatic exporter).@DisplayName, exceptions propagate,@TempDirused.2. Verification commands
./gradlew :jablib:check./gradlew :jablib:checkstyleMain :jablib:checkstyleTest :jablib:checkstyleJmh./gradlew :jablib:modernizer./gradlew --no-configuration-cache :rewriteDryRunreports no changes../gradlew :jablib:javadocnpx markdownlint-cli2on the changed Markdown (CHANGELOG.md).rewriteRun+ checkstyle are clean, CI format job is the backstop.3. Documentation
CHANGELOG.mdentry added (TODOplaceholder replaced with this PR's link after creation).4. Pull request
.github/PULL_REQUEST_TEMPLATE.md, every section filled.gh api, because a same-owner cross-repo head requires thehead_repoparameter thatgh pr createdoes not expose).CHANGELOG.mdTODOplaceholder replaced with the real PR link after creation, committed and pushed.Checklist
jabkit convert --output-format hayagrivayaml, which exercises the sameExporterFactoryregistration as the GUI export dialog)CHANGELOG.mddescribing the change from the user's point of view (if the change is visible to the user)🤖 Generated with Claude Code