Files
logseq/docs/agent-guide/logseq-cli/002-list-node-code-truncation.md

166 lines
6.0 KiB
Markdown

# Plan: Limit All `list` Command Table Output to Three Lines
## Background
A bug was reported in Logseq CLI list rendering:
- In the `list` command, displayed content should not exceed three lines.
- For `list node` entries tagged as code, long code blocks should be truncated to a maximum of three lines.
- This is a **temporary rule**.
Repro step:
- `logseq list node --tags code`
(Reporter wrote `-tags`; current CLI syntax is `--tags`.)
## Current Behavior (Implementation-Aligned)
From current CLI implementation:
- `list node` fetches items in `src/main/logseq/cli/command/list.cljs` (`execute-list-node`), and other list commands follow the same list-command execution pattern.
- Human rendering for all list commands is handled in `src/main/logseq/cli/format.cljs` through shared table formatting helpers.
- Table rendering already supports multi-line cells and title width truncation by display width.
- There is currently **no line-count truncation** for multi-line title/content in list output.
Therefore, long multi-line content (including code blocks in `:block/title`) can expand to many rendered lines in human output across list commands.
## Goal
For human output of `list` family commands, enforce a temporary UI rule:
1. Any displayed multi-line content in list table cells should be limited to **max 3 lines**.
2. Explicitly satisfy the bug scenario for `list node --tags code` where code block titles are long multi-line text.
## Non-Goals
- Do not change structured outputs (`--output json`, `--output edn`).
- Do not alter worker query/filter semantics for any `list` command.
- Do not introduce permanent content-format policy yet; this is temporary.
## Proposed Design
### 1) Apply truncation at human formatting layer
Implement the behavior in `src/main/logseq/cli/format.cljs` because:
- This is a display concern.
- It avoids modifying DB/query payloads.
- It keeps JSON/EDN behavior unchanged.
### 2) Add line-count limiter for list cells
Add a helper that:
- Splits text by `\n`.
- Keeps at most first 3 lines.
- If truncated, append an ellipsis marker to the third line (or as a final marker line), preserving table readability.
Apply this helper before table rendering for list cells where content can be multiline (notably `TITLE` fields).
### 3) Preserve existing display-width truncation behavior
The existing title width truncation (`:list-title-max-display-width`) should remain active.
Recommended order:
1. Apply line-count truncation (max 3 lines).
2. Apply per-line display-width truncation (existing behavior).
This ensures both vertical and horizontal bounds.
### 4) Scope for temporary rule
**Mandatory scope (this plan):**
- All `list-*` human outputs must enforce the max-3-lines rule, including:
- `:list-page`
- `:list-tag`
- `:list-property`
- `:list-task`
- `:list-node`
- `:list-asset`
This is not a `:list-node`-only change. The behavior should be consistent across all list command tables.
## Files to Update
1. `src/main/logseq/cli/format.cljs`
- Introduce max-lines constant for list content (value `3`).
- Add helper to truncate multiline text by line count.
- Integrate helper into list table cell formatting path for all `list-*` commands (at minimum all `TITLE` columns; ideally all multiline-capable list table cells).
2. `src/test/logseq/cli/format_test.cljs`
Add/adjust tests:
- New tests for each list command (`list page/tag/property/task/node/asset`): title/content with 5+ lines renders only first 3 lines in human output.
- Assert output still includes `Count: N` for each command.
- Assert JSON/EDN output keeps full original title/content unchanged.
- Add at least one alignment regression test with multiline truncation enabled to ensure table columns stay aligned.
## Test Plan
### Unit Tests
Run focused tests first:
- `bb dev:test -v logseq.cli.format-test/test-human-output-list-page`
- `bb dev:test -v logseq.cli.format-test/test-human-output-list-tag-property`
- `bb dev:test -v logseq.cli.format-test/test-human-output-list-task`
- `bb dev:test -v logseq.cli.format-test/test-human-output-list-node`
- `bb dev:test -v logseq.cli.format-test/test-human-output-list-asset`
- Add and run dedicated 3-line truncation test cases covering all list commands.
Then run broader CLI tests:
- `bb dev:test -v logseq.cli.format-test`
### Regression Checks
- Verify existing title-width truncation tests still pass.
- Verify multiline table alignment remains correct after truncation.
- Verify non-human outputs remain unchanged.
## Acceptance Criteria
1. Every `list-*` command human output (`list page/tag/property/task/node/asset`) never shows more than 3 rendered lines for any single multiline list table cell.
2. `logseq list node --tags code` specifically reproduces the bug fix: long code block titles are truncated to max 3 lines.
3. Output remains a valid table with readable alignment and `Count` footer.
4. JSON/EDN outputs are unchanged (no content truncation).
5. Existing list formatting tests pass, with new cross-command truncation test coverage.
## Risks and Mitigations
Risk:
- Applying truncation too broadly may hide meaningful multiline content unexpectedly.
Mitigation:
- Keep change localized to list human formatter.
- Document as temporary rule.
- Enforce one shared truncation path used by all `list-*` formatters to avoid divergence.
Risk:
- Interaction between line-limit and width-limit may produce awkward ellipsis placement.
Mitigation:
- Centralize truncation helpers and add explicit tests for both multi-line and width truncation together.
## Rollback Strategy
Since change is formatter-only:
- Revert modifications in `format.cljs` and corresponding tests.
- No data migration or worker contract rollback needed.
## Follow-up (After Temporary Rule)
When temporary rule is revisited:
- Decide whether 3-line cap should become configurable (e.g., `cli.edn` option).
- Decide if behavior should apply uniformly across all list/search/show human outputs.
- Consider richer code-block preview strategy for CLI (language-aware header + fixed snippet).