6.2 KiB
Logseq CLI Query Output Piping Implementation Plan
Goal: Remove the space-to-comma transformation in CLI query human output while preserving EDN output and ensuring logseq show --id accepts ids both via argument and stdin pipelines.
Architecture: Keep human formatting for query results as EDN output (no line-oriented transformation) and update tests to validate pipeline usage with intact EDN. Architecture: Extend logseq show --id to read ids from stdin when present, whether or not an id argument is provided, and update integration tests to validate both xargs and direct stdin pipelines.
Tech Stack: ClojureScript, Logseq CLI, db-worker-node, Node-based integration tests.
Related: Relates to docs/agent-guide/025-logseq-cli-builtin-status-priority-queries.md.
Testing Plan
I will add an integration test that ensures a human-output query can be piped into xargs and then into logseq show --id for multiple ids, with the query output preserved as EDN. I will add an integration test that ensures a human-output query can be piped directly into logseq show --id via stdin, with or without an explicit id argument. I will update the existing integration test that currently pipes human query output directly into logseq show so it asserts EDN preservation and stdin ingestion. I will add a focused unit test for format-query-results that covers EDN output for scalar collections, non-scalar collections, and nil results. I will add a unit test for show id parsing that covers stdin provided, stdin blank, and explicit id values.
NOTE: I will write all tests before I add any implementation behavior.
Problem statement
The CLI currently replaces spaces with commas in format-query-results, which is a lossy transformation that makes output less readable. We need to remove the space-to-comma logic while preserving EDN output (including spaces) for query results. Pipelines should remain usable by allowing logseq show --id to accept ids from stdin and from explicit arguments interchangeably.
Plan
- Read the existing formatting logic in /Users/rcmerci/gh-repos/logseq/src/main/logseq/cli/format.cljs and document current behavior in a quick note.
- Read the show command option parsing in /Users/rcmerci/gh-repos/logseq/src/main/logseq/cli/command/show.cljs and /Users/rcmerci/gh-repos/logseq/src/main/logseq/cli/command/id.cljs to understand current id validation.
- Locate the current integration test that verifies human query output piping in /Users/rcmerci/gh-repos/logseq/src/test/logseq/cli/integration_test.cljs and map the required changes.
- Define the new output rule for format-query-results as a comment in the plan: always return EDN output unchanged (including spaces), and remove space-to-comma logic.
- Define the new show --id stdin rule as a comment in the plan: when stdin is non-empty, parse it as the id or id vector string and use it regardless of whether an id argument is provided.
- Write the failing unit tests for format-query-results in a new test namespace under /Users/rcmerci/gh-repos/logseq/src/test/logseq/cli/format_test.cljs that covers nil, scalar-id sequences, and nested maps, all preserved as EDN strings.
- Write failing unit tests for show id parsing in /Users/rcmerci/gh-repos/logseq/src/test/logseq/cli/command/show_test.cljs that cover stdin provided (overriding or complementing args), stdin blank, and explicit id values.
- Run the unit tests to confirm the failure before implementation using bb dev:test with the new namespaces.
- Write a failing integration test that uses the exact pipeline command from the request by invoking a shell command from the test harness in /Users/rcmerci/gh-repos/logseq/src/test/logseq/cli/integration_test.cljs for xargs usage.
- Write a failing integration test that uses the exact pipeline command from the request for direct stdin piping into logseq show --id with or without an argument.
- Run the integration tests to confirm the failure before implementation using bb dev:test with the specific test names.
- Implement the new format-query-results behavior in /Users/rcmerci/gh-repos/logseq/src/main/logseq/cli/format.cljs by removing the space-to-comma logic and preserving EDN output.
- Implement stdin ingestion for show --id in /Users/rcmerci/gh-repos/logseq/src/main/logseq/cli/command/show.cljs, using a helper to read from stdin when non-empty regardless of whether an id argument is provided.
- Update the existing human-output pipeline integration test to align with the EDN-preserving output and assert both xargs and direct stdin usage.
- Re-run the unit tests and the integration tests to validate the new behavior.
- Update deps/cli/README.md examples if they reference comma-transformed output, and add a short note describing the new xargs-friendly and stdin-friendly behavior for id lists.
Testing Details
The unit tests will exercise behavior by calling format-query-results with representative results and asserting the exact emitted EDN string for id lists and non-id data. The integration tests will execute logseq query with a task-search or custom datalog query, pipe the EDN output through xargs into logseq show --id, and pipe directly into logseq show --id via stdin. The show stdin behavior test will assert that missing --id input without stdin returns a clear error and that stdin is parsed the same as an explicit id argument.
Implementation Details
- Preserve the existing safe-read-string validation to avoid changing behavior for invalid EDN strings.
- Keep non-scalar results as their original EDN string output.
- Maintain nil handling so that "nil" still prints as "nil".
- Remove the space-to-comma transformation while keeping EDN output intact, including spaces.
- Add stdin reading to show --id when stdin is non-empty, even if an id argument is provided.
- Parse stdin through the same id parsing function used for explicit --id values.
- Keep existing errors when --id is missing and stdin is empty or whitespace.
- Update integration tests to use the exact pipeline command from the requirement.
- Use @test-driven-development for all implementation steps.
Question
Query results remain in EDN form (e.g., [1 2 3]) with no line-oriented transformation.
Logseq show --id accepts ids via explicit argument and via stdin pipelines (stdin takes precedence when provided).