Skip to content

Add Agent Skills for JabKit usage and JabRef development - #16162

Merged
calixtus merged 4 commits into
mainfrom
add-agent-skills
Jul 5, 2026
Merged

Add Agent Skills for JabKit usage and JabRef development#16162
calixtus merged 4 commits into
mainfrom
add-agent-skills

Conversation

@koppor

@koppor koppor commented Jul 5, 2026

Copy link
Copy Markdown
Member

TL;DR: With this, we are listed at https://www.skills.sh/


Related issues and pull requests

None — searched jabref/issues and jabref-koppor/issues for related issues on agent skills; no match found.

PR Description

Adds Agent Skills (SKILL.md files) to the repository so AI agents such as Claude Code can discover how to use jabkit and how to work on the JabRef codebase. Skills are grouped into skills/users/ (pdf-to-bibtex, bibtex-library-management, jabkit) and skills/developers/ (jabref-contributor) — a two-level catalog layout supported by the skills CLI, which also makes them installable via npx skills add JabRef/jabref and discoverable on skills.sh for searches such as "bibtex", "biblatex", "papers", and "jabref". All command examples were written against the current jabkit picocli command classes (e.g. citationkeys generate, --input-format "*" for auto-detection), not against possibly stale docs.

Analogies

Like honey, this PR is the product of many small foraging trips (through the picocli command classes) concentrated into something that keeps. Like chocolate, it is best consumed one square at a time - one skill per task. And like the moon, it emits no light of its own: it only reflects what jabkit already does.

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

Steps to test

  1. Run npx skills add JabRef/jabref@add-agent-skills (or point the CLI at a local checkout) and confirm all four skills are discovered, including the category subdirectories.

  2. Spot-check the command examples in the skill files against jabkit --help output, e.g.:

    jbang --fresh jabkit@jabref convert --input paper.pdf --input-format pdfMerged
    jbang --fresh jabkit@jabref citationkeys generate library.bib --output library.bib
  3. npx markdownlint-cli2 "skills/**/*.md" — passes with 0 errors.

AI usage

Claude Code (models claude-sonnet-5 and claude-fable-5). The skill contents were derived from the jabkit source code, AGENTS.md, CHECKLIST.md, and docs/ and reviewed by the contributor.

AI CHECKLIST.md walkthrough

This change adds Markdown files only (new skills/ directory; no Java, no build files, no application behavior change), so code and Gradle items are marked not applicable. Markdown was verified with npx markdownlint-cli2 "skills/**/*.md" (0 errors; the new files are outside the default globs).

1. Code self-review

Read your own diff once, top to bottom, and confirm each point.

Nullability and control flow

  • [/] No == null / != null checks — JSpecify annotations (@NullMarked, @Nullable, @NonNull) used instead.
  • [/] No Objects.requireNonNull(...) — nullability expressed via JSpecify annotations.
  • [/] New classes annotated with @NullMarked (org.jspecify.annotations.NullMarked).
  • [/] Optional consumed with ifPresent / ifPresentOrElse / map / orElseThrow — never orElse(unusedValue) nor an isPresent() + get() block.
  • [/] StringUtil.isBlank(...) used instead of s == null || s.isBlank().

Exceptions

  • [/] No catch (Exception e) — only specific exceptions are caught.
  • [/] No throw new RuntimeException(...) / IllegalStateException(...) — these tear down the whole application.
  • [/] Logged exceptions are passed as the last logger argument (LOGGER.info("...", e)), not concatenated into the message string.

Style and idioms

  • [/] New BibEntry objects built with withers (withField, not setField).
  • [/] Modern Java used: List.of() / Map.of() / Set.of(), Path.of(), SequencedCollection / SequencedSet, text blocks.
  • [/] Regexes use a precompiled Pattern.compile(...) constant, not String.matches(...).
  • [/] Background work uses org.jabref.logic.util.BackgroundTask, not new Thread().
  • No commented-out code, no trivial comments restating the code, no AI-disclosure comments in source.
  • [/] Markdown Javadoc (///) uses Markdown syntax, not JavaDoc inline tags: `code` instead of {@code}, [ClassName] instead of {@link}.

User-facing text

  • [/] All user-facing text localized (Localization.lang in Java, % prefix in FXML).
  • [/] Sentence case (not Title Case); no trailing !; labels do not end with :.
  • [/] Variance expressed with placeholders ("...: %0"), not string concatenation.

Security

  • [/] User-controlled data (request params, entry fields, file contents) is HTML-escaped before being written into any text/html response — including exception/error messages, not just the success body (XSS).

Tests

  • [/] Behavior changes in org.jabref.model / org.jabref.logic have added or updated tests.
  • [/] Tests assert object contents (assertEquals), use plain JUnit asserts (not AssertJ), have no @DisplayName, do not catch exceptions (let them propagate so JUnit reports setup/teardown failures directly), and use @TempDir instead of manual temp directories.

2. Verification commands

Run in this order — cheapest first. Each must pass.

  • [/] ./gradlew :jablib:check (or ./gradlew check for all modules).
  • [/] ./gradlew checkstyleMain checkstyleTest checkstyleJmh.
  • [/] ./gradlew modernizer.
  • [/] ./gradlew --no-configuration-cache :rewriteDryRun reports no changes (run ./gradlew rewriteRun to fix).
  • [/] ./gradlew javadoc.
  • npx markdownlint-cli2 "docs/**/*.md" "*.md" (only if Markdown changed).
  • [/] Only if formatting is still off after rewriteRun: docker run -v $(pwd):/github/workspace ghcr.io/leventebajczi/intellij-format:master "*.java" "" ".idea/codeStyles/Project.xml".

3. Documentation

  • [/] CHANGELOG.md entry added if the change is visible to the user (end-user wording, no extra blank lines). Use TODO as the issue/PR reference placeholder when no issue is known and the PR is not yet created — never a fake number.
  • Searched jabref/issues and jabref-koppor/issues for a related issue; linked only on a confident match, otherwise kept TODO (no closes/fixes for merely-similar issues).
  • [/] Requirement added to docs/requirements/<area>.md if the change is a new feature or significant bug fix (skip for refactors, minor fixes, and internal changes).
  • [/] Developer documentation under docs/ updated if behavior or architecture changed.

4. Pull request

  • PR body built from .github/PULL_REQUEST_TEMPLATE.md, every section filled.
  • All checklist items kept and marked [x], [ ], or [/].
  • All HTML comments removed from the PR body.
  • PR created with gh pr create --body-file <file> (not --body).
  • [/] If CHANGELOG.md used a TODO placeholder, it was replaced with the real PR-number link after PR creation, then 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 (always required) — no application change; verified via markdownlint and against jabkit command sources instead
  • [/] 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 described the change in CHANGELOG.md in a way that can be understood by the average user (if 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

Provides SKILL.md files discoverable by AI agents and the skills.sh registry, grouped into users/ (pdf-to-bibtex, bibtex-library-management, jabkit) and developers/ (jabref-contributor).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Add Agent Skills (SKILL.md) for jabkit usage and JabRef contribution workflow

📝 Documentation ✨ Enhancement 🕐 10-20 Minutes

Grey Divider

AI Description

• Add a skills/ catalog with install instructions for the skills CLI.
• Document jabkit workflows: PDF→BibTeX, library validation/cleanup, and CLI command reference.
• Add a contributor skill capturing JabRef build, module layout, and pre-PR conventions.
Diagram

graph TD
  A(["AI agent"]) --> B{{"skills CLI / skills.sh"}} --> C[/"skills/README.md"/]
  C --> D[/"users/*/SKILL.md"/] --> F(["jabkit CLI"])
  C --> E[/"developers/*/SKILL.md"/] --> G(["JabRef dev workflow"])

  subgraph Legend
    direction LR
    _agent(["Agent/Tool"]) ~~~ _doc[/"Skill file"/] ~~~ _ext{{"Registry/CLI"}}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Keep guidance only in existing docs (AGENTS.md / CONTRIBUTING.md / docs/)
  • ➕ Single canonical documentation location
  • ➕ No new convention/tooling surface area
  • ➖ Not discoverable/instalable by agent tools via skills CLI
  • ➖ Harder for agents to pick task-specific instructions (no per-skill scoping)
2. Publish skills in a dedicated repo (e.g., JabRef/agent-skills)
  • ➕ Decouples skill iteration from main codebase churn
  • ➕ Can version/release skills independently
  • ➖ Risk of drift from jabkit/JabRef reality
  • ➖ Adds another repo for contributors and reviewers to maintain

Recommendation: Keep the current in-repo skills/ approach: it maximizes discoverability on skills.sh while staying close to the source of truth (jabkit commands and JabRef contribution rules). The main follow-up to consider is adding a lightweight ownership/check process to keep examples current as jabkit subcommands evolve.

Files changed (5) +367 / -0

Documentation (5) +367 / -0
README.mdAdd skills catalog README with install/contribution guidance +26/-0

Add skills catalog README with install/contribution guidance

• Introduces a top-level README describing the Agent Skills concept, the users/developers taxonomy, and 'npx skills add' installation commands. Adds guidance on keeping skill instructions aligned with jabkit command implementations.

skills/README.md

SKILL.mdAdd contributor skill for JabRef build, modules, and conventions +58/-0

Add contributor skill for JabRef build, modules, and conventions

• Adds a developer-oriented skill describing JabRef module boundaries, key source paths, and standard build/test commands. Captures contribution conventions (terminology, tests, localization, minimal diffs) and links to mandatory contributor docs and checklist.

skills/developers/jabref-contributor/SKILL.md

SKILL.mdAdd user skill for BibTeX/biblatex library maintenance via jabkit +97/-0

Add user skill for BibTeX/biblatex library maintenance via jabkit

• Documents jabkit setup via JBang and common maintenance workflows: consistency/integrity checks, citation key generation, search, format conversion, and pseudonymization. Includes practical flags and output-format notes for CI/script usage.

skills/users/bibtex-library-management/SKILL.md

SKILL.mdAdd jabkit CLI reference skill with command overview and examples +91/-0

Add jabkit CLI reference skill with command overview and examples

• Provides installation guidance and a compact command table for key jabkit subcommands. Adds examples for common tasks (DOI fetch, provider fetch, PDF convert, CI checks, key generation, PDF metadata updates).

skills/users/jabkit/SKILL.md

SKILL.mdAdd user skill for extracting BibTeX entries from PDFs via jabkit +95/-0

Add user skill for extracting BibTeX entries from PDFs via jabkit

• Documents a recommended workflow for PDF-to-BibTeX conversion using 'convert' with 'pdfMerged', plus follow-up validation and DOI enrichment. Lists supported PDF importer '--input-format' strategies and includes a batch conversion snippet.

skills/users/pdf-to-bibtex/SKILL.md

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (4) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Porcelain/debug flags mispositioned 🐞 Bug ≡ Correctness
Description
The skills instruct placing -p/--porcelain and -d/--debug before the subcommand (e.g. `jabkit -p
check ...), but jabkit mixes SharedOptions` into each subcommand and the subcommands read their
own sharedOptions, so flags placed before the subcommand are parsed on the root command and won’t
enable porcelain output for the executed subcommand. Additionally, early logging initialization only
detects the long forms --porcelain/--debug, so the documented short flags -p/-d don’t affect
logging setup.
Code

skills/users/jabkit/SKILL.md[R25-32]

+## Global flags
+
+Place before the subcommand:
+
+- `-p`, `--porcelain` — script-friendly output (no banners/progress)
+- `-d`, `--debug` — debug logging
+- `-v`, `--version` — version info
+
Evidence
Root jabkit defines -p/--porcelain and -d/--debug, but each subcommand also defines its own
SharedOptions and uses that instance’s porcelain field to suppress output; therefore, placing
flags before the subcommand sets the root instance, not the subcommand instance. The jabkit test
suite enables porcelain by passing --porcelain after the subcommand, and early logging setup only
checks for the long --porcelain / --debug strings.

jabkit/src/main/java/org/jabref/toolkit/commands/JabKit.java[11-63]
jabkit/src/main/java/org/jabref/toolkit/commands/Convert.java[22-55]
jabkit/src/test/java/org/jabref/toolkit/commands/JabKitTest.java[47-76]
jabkit/src/main/java/org/jabref/toolkit/JabKitLauncher.java[163-178]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new skills docs tell users/agents to pass `-p/--porcelain` and `-d/--debug` before the subcommand, and several examples use `jabkit -p ...`. With the current picocli command structure, that invocation style does not enable porcelain output for subcommands, and the short flags are not detected by early logging initialization.
## Issue Context
- Each jabkit subcommand mixes in its own `JabKit.SharedOptions` and checks its own `sharedOptions.porcelain` when printing output.
- `JabKitLauncher.initLogging` configures logging *before* picocli parsing and only scans for literal `--porcelain` / `--debug`.
## Fix Focus Areas
- skills/users/jabkit/SKILL.md[25-32]
- skills/users/jabkit/SKILL.md[64-66]
- skills/users/bibtex-library-management/SKILL.md[17-18]
- skills/users/pdf-to-bibtex/SKILL.md[31-35]
## What to change
- Update wording from “Global flags (place before the subcommand)” to reflect actual working invocations (place after the subcommand), e.g.:
- `jabkit check consistency library.bib --porcelain`
- `jabkit convert --input paper.pdf --input-format pdfMerged --porcelain`
- Prefer `--porcelain` / `--debug` (long form) in examples so `initLogging` detects them.
- Update any examples currently using `jabkit -p ...` to a working form (e.g. `jabkit check ... --porcelain`).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. URL input claim incorrect 🐞 Bug ≡ Correctness
Description
The jabkit skill claims jabkit convert --input https://... accepts URLs, but convert reads input
as a filesystem Path and calls ImportService.importFile(Path, ...), which does not download
HTTP(S) resources. Following the example will fail because the URL is treated as a local path.
Code

skills/users/jabkit/SKILL.md[R79-81]

+- Always use `-p`/`--porcelain` when parsing output programmatically.
+- `fetch --provider` matches JabRef's web-search fetcher names case-insensitively; on an unknown name, jabkit reports `Could not find fetcher`.
+- URLs are accepted as input: `jabkit convert --input https://example.org/refs.ris --input-format ris`.
Evidence
convert obtains its input via InputOption.getInputFile(), which is a Path, and then calls
ImportService.importFile(Path, ...) that directly imports from the local file system. The
URL-downloading logic exists only in a separate ImportService.importFile(String, ...) overload and
is not used by convert.

jabkit/src/main/java/org/jabref/toolkit/commands/Convert.java[31-55]
jabkit/src/main/java/org/jabref/toolkit/commands/InputOption.java[23-45]
jabkit/src/main/java/org/jabref/toolkit/service/ImportService.java[51-83]
jabkit/src/main/java/org/jabref/toolkit/service/ImportService.java[98-126]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The skill documentation states that `jabkit convert` accepts URLs via `--input https://...`, but the current `convert` command only supports local filesystem paths.
## Issue Context
- `convert` uses `InputOption`, which parses input into a `Path`.
- `ImportService.importFile(Path, ...)` imports from a local file and does not perform URL downloading.
## Fix Focus Areas
- skills/users/jabkit/SKILL.md[79-81]
## What to change
- Either remove the URL claim entirely or replace it with a correct statement, e.g. “`convert` expects a local file path; download remote files first.”
- If URL input is intended behavior, implement it in code (not required for this docs-only PR): change `convert` to accept a `String` input and route through the URL-capable `ImportService.importFile(String, ...)` overload.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Convert example missing input-format 🐞 Bug ≡ Correctness ⭐ New
Description
The bibtex-library-management skill shows jabkit convert without --input-format, but the
convert command passes a null input format into ImportService.importFile(...), which then fails
with an unknown import format. Copy/pasting the example can therefore error instead of converting
the .bib file.
Code

skills/users/bibtex-library-management/SKILL.md[R71-75]

+```bash
+jabkit convert --input library.bib --output library.html --output-format html
+```
+
+`--output-format` defaults to `bibtex`. Use `--input-format "*"` to auto-detect the input. Apply field formatters during conversion with `--field-formatters`.
Evidence
The skill’s example omits --input-format. In code, Convert forwards the (nullable) inputFormat
into ImportService.importFile(Path, ...); when the format is not "*", the importer lookup
requires a concrete format id and throws for unknown/null formats.

skills/users/bibtex-library-management/SKILL.md[69-75]
jabkit/src/main/java/org/jabref/toolkit/commands/Convert.java[34-50]
jabkit/src/main/java/org/jabref/toolkit/service/ImportService.java[65-83]
jablib/src/main/java/org/jabref/logic/importer/ImportFormatReader.java[127-133]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`jabkit convert` requires an explicit import format (or `"*"` for auto-detection). The skill’s conversion example omits `--input-format`, which can cause an “Unknown import format” error.

## Issue Context
In the CLI implementation, `Convert` forwards the `--input-format` value directly into `ImportService.importFile(Path, format, ...)`. When the option is not supplied, the value is `null`, and the import layer cannot resolve an importer.

## Fix Focus Areas
- skills/users/bibtex-library-management/SKILL.md[69-76]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. --input claim wrong for check 🐞 Bug ≡ Correctness ⭐ New
Description
The jabkit skill claims input files can be passed positionally or via --input equivalently, but
the top-level check command only defines a positional FILE parameter and no --input option.
Following the documented pattern jabkit check --input library.bib will fail with an unknown
option.
Code

skills/users/jabkit/SKILL.md[60]

+Input files are passed positionally or via `--input`; both forms are equivalent. `--input-format "*"` auto-detects the input format.
Evidence
skills/users/jabkit/SKILL.md states --input is equivalent to positional input. However, Check
defines only a positional FILE parameter and no --input option, while --input exists only in
the separate InputOption mixin used by other subcommands.

skills/users/jabkit/SKILL.md[60-60]
jabkit/src/main/java/org/jabref/toolkit/commands/Check.java[36-44]
jabkit/src/main/java/org/jabref/toolkit/commands/InputOption.java[35-45]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The skill text over-generalizes `--input` support. `jabkit check` (without subcommand) accepts only a positional `FILE`, not `--input`.

## Issue Context
Other commands use the shared `InputOption` mixin to support `--input`, but `Check` uses its own positional parameter instead.

## Fix Focus Areas
- skills/users/jabkit/SKILL.md[60-60]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Previous review results

Review updated until commit 3aa6a9d

Results up to commit f29c678


🐞 Bugs (2) 📘 Rule violations (0) 📜 Skill insights (0)


Action required
1. Porcelain/debug flags mispositioned 🐞 Bug ≡ Correctness
Description
The skills instruct placing -p/--porcelain and -d/--debug before the subcommand (e.g. `jabkit -p
check ...), but jabkit mixes SharedOptions` into each subcommand and the subcommands read their
own sharedOptions, so flags placed before the subcommand are parsed on the root command and won’t
enable porcelain output for the executed subcommand. Additionally, early logging initialization only
detects the long forms --porcelain/--debug, so the documented short flags -p/-d don’t affect
logging setup.
Code

skills/users/jabkit/SKILL.md[R25-32]

+## Global flags
+
+Place before the subcommand:
+
+- `-p`, `--porcelain` — script-friendly output (no banners/progress)
+- `-d`, `--debug` — debug logging
+- `-v`, `--version` — version info
+
Evidence
Root jabkit defines -p/--porcelain and -d/--debug, but each subcommand also defines its own
SharedOptions and uses that instance’s porcelain field to suppress output; therefore, placing
flags before the subcommand sets the root instance, not the subcommand instance. The jabkit test
suite enables porcelain by passing --porcelain after the subcommand, and early logging setup only
checks for the long --porcelain / --debug strings.

jabkit/src/main/java/org/jabref/toolkit/commands/JabKit.java[11-63]
jabkit/src/main/java/org/jabref/toolkit/commands/Convert.java[22-55]
jabkit/src/test/java/org/jabref/toolkit/commands/JabKitTest.java[47-76]
jabkit/src/main/java/org/jabref/toolkit/JabKitLauncher.java[163-178]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new skills docs tell users/agents to pass `-p/--porcelain` and `-d/--debug` before the subcommand, and several examples use `jabkit -p ...`. With the current picocli command structure, that invocation style does not enable porcelain output for subcommands, and the short flags are not detected by early logging initialization.

## Issue Context
- Each jabkit subcommand mixes in its own `JabKit.SharedOptions` and checks its own `sharedOptions.porcelain` when printing output.
- `JabKitLauncher.initLogging` configures logging *before* picocli parsing and only scans for literal `--porcelain` / `--debug`.

## Fix Focus Areas
- skills/users/jabkit/SKILL.md[25-32]
- skills/users/jabkit/SKILL.md[64-66]
- skills/users/bibtex-library-management/SKILL.md[17-18]
- skills/users/pdf-to-bibtex/SKILL.md[31-35]

## What to change
- Update wording from “Global flags (place before the subcommand)” to reflect actual working invocations (place after the subcommand), e.g.:
 - `jabkit check consistency library.bib --porcelain`
 - `jabkit convert --input paper.pdf --input-format pdfMerged --porcelain`
- Prefer `--porcelain` / `--debug` (long form) in examples so `initLogging` detects them.
- Update any examples currently using `jabkit -p ...` to a working form (e.g. `jabkit check ... --porcelain`).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. URL input claim incorrect 🐞 Bug ≡ Correctness
Description
The jabkit skill claims jabkit convert --input https://... accepts URLs, but convert reads input
as a filesystem Path and calls ImportService.importFile(Path, ...), which does not download
HTTP(S) resources. Following the example will fail because the URL is treated as a local path.
Code

skills/users/jabkit/SKILL.md[R79-81]

+- Always use `-p`/`--porcelain` when parsing output programmatically.
+- `fetch --provider` matches JabRef's web-search fetcher names case-insensitively; on an unknown name, jabkit reports `Could not find fetcher`.
+- URLs are accepted as input: `jabkit convert --input https://example.org/refs.ris --input-format ris`.
Evidence
convert obtains its input via InputOption.getInputFile(), which is a Path, and then calls
ImportService.importFile(Path, ...) that directly imports from the local file system. The
URL-downloading logic exists only in a separate ImportService.importFile(String, ...) overload and
is not used by convert.

jabkit/src/main/java/org/jabref/toolkit/commands/Convert.java[31-55]
jabkit/src/main/java/org/jabref/toolkit/commands/InputOption.java[23-45]
jabkit/src/main/java/org/jabref/toolkit/service/ImportService.java[51-83]
jabkit/src/main/java/org/jabref/toolkit/service/ImportService.java[98-126]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The skill documentation states that `jabkit convert` accepts URLs via `--input https://...`, but the current `convert` command only supports local filesystem paths.

## Issue Context
- `convert` uses `InputOption`, which parses input into a `Path`.
- `ImportService.importFile(Path, ...)` imports from a local file and does not perform URL downloading.

## Fix Focus Areas
- skills/users/jabkit/SKILL.md[79-81]

## What to change
- Either remove the URL claim entirely or replace it with a correct statement, e.g. “`convert` expects a local file path; download remote files first.”
- If URL input is intended behavior, implement it in code (not required for this docs-only PR): change `convert` to accept a `String` input and route through the URL-capable `ImportService.importFile(String, ...)` overload.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Qodo Logo

Comment thread skills/users/jabkit/SKILL.md
Comment thread skills/users/jabkit/SKILL.md
koppor and others added 2 commits July 5, 2026 09:18
Bare filenames do not resolve once the skill is installed outside a JabRef checkout; use full GitHub URLs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@koppor koppor added the status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers label Jul 5, 2026
@koppor
koppor marked this pull request as draft July 5, 2026 07:34
Each skill can be installed standalone, so each carries the same self-contained bootstrap: JBang universal one-liners (Linux/macOS and Windows) followed by jbang app install.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comment on lines +71 to +75
```bash
jabkit convert --input library.bib --output library.html --output-format html
```

`--output-format` defaults to `bibtex`. Use `--input-format "*"` to auto-detect the input. Apply field formatters during conversion with `--field-formatters`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Remediation recommended

1. Convert example missing input-format 🐞 Bug ≡ Correctness

The bibtex-library-management skill shows jabkit convert without --input-format, but the
convert command passes a null input format into ImportService.importFile(...), which then fails
with an unknown import format. Copy/pasting the example can therefore error instead of converting
the .bib file.
Agent Prompt
## Issue description
`jabkit convert` requires an explicit import format (or `"*"` for auto-detection). The skill’s conversion example omits `--input-format`, which can cause an “Unknown import format” error.

## Issue Context
In the CLI implementation, `Convert` forwards the `--input-format` value directly into `ImportService.importFile(Path, format, ...)`. When the option is not supplied, the value is `null`, and the import layer cannot resolve an importer.

## Fix Focus Areas
- skills/users/bibtex-library-management/SKILL.md[69-76]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

| `pseudonymize` | Replace identifying data in a library (writes a key file for reversal) |
| `search` | Search in a library using JabRef's search syntax |

Input files are passed positionally or via `--input`; both forms are equivalent. `--input-format "*"` auto-detects the input format.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Remediation recommended

2. --input claim wrong for check 🐞 Bug ≡ Correctness

The jabkit skill claims input files can be passed positionally or via --input equivalently, but
the top-level check command only defines a positional FILE parameter and no --input option.
Following the documented pattern jabkit check --input library.bib will fail with an unknown
option.
Agent Prompt
## Issue description
The skill text over-generalizes `--input` support. `jabkit check` (without subcommand) accepts only a positional `FILE`, not `--input`.

## Issue Context
Other commands use the shared `InputOption` mixin to support `--input`, but `Check` uses its own positional parameter instead.

## Fix Focus Areas
- skills/users/jabkit/SKILL.md[60-60]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 3aa6a9d

@calixtus
calixtus added this pull request to the merge queue Jul 5, 2026
@github-actions github-actions Bot added the status: to-be-merged PRs which are accepted and should go into the merge-queue. label Jul 5, 2026
Merged via the queue into main with commit 3f016b9 Jul 5, 2026
76 checks passed
@calixtus
calixtus deleted the add-agent-skills branch July 5, 2026 20:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers status: to-be-merged PRs which are accepted and should go into the merge-queue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants