Repository navigation
Conversation
searchlist wraps the admin document browser API (/api/admin/searchlist):
search, get, create, update, delete and delete-by-query (confirms unless
--yes). update reads the stored document first and sends back the url,
title, role and boost the server requires on every update.
documents bulk wraps /api/admin/documents/bulk and reads a JSON array,
{"documents": [...]} or NDJSON from a file or stdin. A partial failure
prints every item and exits with the server status.
send_request now passes a JSON body on DELETE (delete-by-query binds its
query from the body). Both APIs exist in Fess 14.19.2 through 15.9.0.
…-searchlist-documents-commands # Conflicts: # skills/fessctl/SKILL.md # src/fessctl/api/client.py # src/fessctl/cli.py
marevol
changed the base branch from
main
to
feat/add-general-plugin-storage-commands
October 16, 2026 13:03
This was referenced Oct 16, 2026
…-searchlist-documents-commands
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.
Summary
Adds two commands for admin APIs fessctl did not wrap yet.
fessctl searchlist(/api/admin/searchlist):search,get,create,update,delete,delete-by-query(asks for confirmation unless--yes).fessctl documents bulk(/api/admin/documents/bulk): index many documents from a file or stdin (-); the input may be a JSON array,{"documents": [...]}or NDJSON.Notes on the API shape, all taken from the Fess source and checked live:
doc_id; the index_id(reported by bulk) is a different value.url,title,roleandbooston every create and update request, even though update merges into the stored document.updatetherefore fetches the document first and sends those four back unchanged together with the requested changes. PlainPUTsemantics would otherwise force the caller to resend them.searchpages with--start(0-based offset) and--size; this API'sSearchBodyhas nopage. The server caps size at 100.delete-by-querybinds its query from a JSON body on a DELETE request, sosend_requestnow sends a body on DELETE whenjson_datais given (other DELETE calls are unchanged).Versions
Both APIs exist in Fess 14.19.2, 15.6.1, 15.7.0, 15.8.0 and 15.9.0. 14.x uses PUT for create and POST for edit and bulk;
send_requestalready maps that (bulk goes throughAction.EDIT). The request bodies are identical in all versions. Behaviour differences: 15.9.0 reports "not found" whendeletematches nothing (earlier versions answer success); 15.8.0+ refuses content changes of chunked documents.Verified live
Against Fess 15.9.0 (OpenSearch 3.9.0), by CLI: create (incl. validation errors, labels, extra fields), search (query, size, start, sort, lang, no-match, bad sort, offset beyond window), get (text/json/yaml, not found), update (title/boost/role/label/url moves the
_idwithout duplicates, missing doc, no changes, bad value, document without a title), delete (found, unknown id), delete-by-query (confirmation declined/accepted,--yes, no match, blank query), bulk (array, wrapper, NDJSON, stdin, partial failure with exit code 9, validation failure, empty, unreadable input).The new integration tests (13) were run against live stacks of 14.19.2, 15.6.1, 15.7.0, 15.8.0 and 15.9.0 through a throwaway conftest that points at those stacks (the repository fixture starts fixed-name containers): 12 passed and 1 skipped (the 15.9-only delete-not-found check) on each of the four older versions, 13 passed on 15.9.0. They use unique tokens and remove everything they create (delete-by-query plus a poll until the index refresh shows zero hits).
uv run pytest tests/unit: 208 passed.Not verified
tests/commandssuite through the repository compose fixture (to be run with the multi-version suite).Stacked PRs (merge from the bottom; each PR's base is the branch below it, so no conflicts remain):
main← #45 theme timeout (+ CI runs for stacked PRs) ← #46 typer ← #43 ops commands ← #44 dict ← #41 general/plugin/storage ← #42 searchlist/documents.After a PR is squash-merged GitHub retargets the next one to
main.