Skip to content

feat: tag filters in the Explorer, list/search and memory.list_archived; all dimension filters on list/search - #709

Merged
dash0-dev[bot] merged 9 commits into
mainfrom
feat/tag-filters
Oct 20, 2026
Merged

dash0-dev[bot] merged 9 commits into
mainfrom
feat/tag-filters

Conversation

@dash0-dev

@dash0-dev dash0-dev Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Tag filtering was missing or hard to find in three places. This adds it everywhere it was absent, and gives lorekit list/search all eight dimension filters the policy/groom commands take, with the hosted list's semantics.

Changes

  • Explorer filter menu: the tags dimension is shown as Tag instead of "Label", and typing tag, tags, label or labels finds it. The field id stays label, so existing ?filters= links keep working.
  • CLI list / search: --tags a,b [--tags-mode any|all|none] plus --kind, --host, --trigger, --source-agent, --origin-repo, --origin-branch, --origin-pr, each with --<dim>-mode in|nin. Before, --tags was accepted and silently ignored, and search had no dimension filters at all.
  • CLI semantics: one parser (parseReadFilters, the policy/groom dimension table) and one predicate (entryFilter) for both stores and --all. nin excludes rows without the field, as the server does. --origin-pr takes PR numbers only (the server drops anything else and then filters nothing). Tags are matched after the two local tiers merge, so a shadowed home copy can't surface. A bare flag or orphan mode is a usage error. --json entries now carry source_agent, trigger and origin_*.
  • MCP memory.list_archived: accepts tags (ANY, like memory.list); catalog, edge mirror, generated surfaces, llms.txt and a live smoke check updated.
  • Docs: tags.mdx, docs/cli.md, docs/mcp-tools.md, the llms.txt template, CLI help and shell completions.

Verification

  • CLI: list/search/store/show/diff/stats/tree/lint/dedupe/unit/hooks/completion/source-hygiene/groom/policy suites pass locally (incl. a two-tier regression test that fails on the pre-fix code); web filter specs and tsc --noEmit clean; schemas and mcp-core edge guards pass; deno check 0 errors.
  • The new memory.list_archived smoke check runs on /preview or on deploy, not in PR CI.

mthines and others added 4 commits October 20, 2026 13:01
- Explorer: show the label dimension as "Tag" (field id unchanged so
  ?filters= links keep working) and match "tags"/"label" when typed
- CLI: add --tags/--tags-mode to list and search; previously --tags was
  accepted (known for write) and silently ignored
- local store honours tags_mode; remote store forwards it

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
Matches memory.list's semantics (ANY of the tags). Adds a live smoke check.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
…egenerate llms.txt

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
…handlers

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

The dashboard preview for this PR — redeployed on each push that changes the web app.

Project Deployment Actions Updated
lorekit Ready Ready Preview Oct 20, 2026 3:12pm UTC

Preview always points at this PR's latest commit; Deployment is the immutable build of 8409289. · Comment /web-preview to force a redeploy. · Workflow logs

mthines and others added 2 commits October 20, 2026 14:03
…/--host to search

parseReadFilters replaces parseTagsFilter and parses tags, kind and host
with their modes from the shared DIMENSIONS table. The local post-filter
follows lorekit_match_text: nin requires a set value. RemoteStore.list
forwards kind_mode/host_mode.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
@dash0-dev dash0-dev Bot changed the title feat: filter by tags in the Explorer menu, lorekit list/search and memory.list_archived feat: tag filters in the Explorer, list/search and memory.list_archived; kind/host modes on list/search Oct 20, 2026
mthines and others added 2 commits October 20, 2026 15:09
…* filters

parseReadFilters now covers all eight policy/groom dimensions, each with
an in|nin mode. --origin-pr accepts PR numbers only (a leading # is
stripped, 007 reads as 7): the hosted route drops a non-numeric value and
then applies no PR filter. normalizeEntry carries source_agent, trigger
and origin_* so the shared entryFilter can match them on both stores and
in list --all; RemoteStore.list forwards every dimension.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
@dash0-dev

dash0-dev Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ No issues found

No new commits since aa533d2. The edited PR body now lists all eight CLI filters and the new --json fields, clearing the prior description warning. Code unchanged, so the below-bar --link advisory (search.mjs:56) stands.

Checked: 0 of 23 dependent files traced

Progress: open review threads 1 → 0 → 0 across the last 3 reviews

What this change reaches — 17 changed exports · 23 dependent files · 0 checked · 23 not checked · 6 changed files imported by 25 files
flowchart LR
  subgraph pr["Changed in this PR"]
    s1["matchesQuery<br/>body changed"]:::changed
    s2["normalizeEntry<br/>body changed"]:::changed
    s3["parseDimensionConditions<br/>body changed"]:::changed
    s4["rootSuggestions<br/>body changed"]:::changed
    s5["clusterByKeyPattern<br/>body changed"]:::changed
    s6["MCP_TOOL_DEFS<br/>body changed"]:::changed
    smore["+11 more changed exports<br/>listed below"]:::changed
    m1["packages/cli/src/store/local.mjs<br/>file changed"]:::changed
    m2["packages/cli/src/store/remote.mjs<br/>file changed"]:::changed
    m3["packages/web/src/components/lore/FilterMenu.tsx<br/>file changed"]:::changed
    m4["packages/cli/src/shared/completions.mjs<br/>file changed"]:::changed
    mmore["+2 more changed files<br/>listed below"]:::changed
  end
  s1c1["packages/cli/src/core/lessons.mjs<br/>? not checked"]:::unknown
  s1c2["packages/cli/src/shared/lessons-view.mjs<br/>? not checked"]:::unknown
  s1c3["packages/cli/test/hooks.test.mjs<br/>? not checked"]:::unknown
  s2c1["packages/cli/src/commands/ · 2 files<br/>? not checked"]:::unknown
  s2c2["packages/cli/test/list.test.mjs<br/>? not checked"]:::unknown
  s3c1["packages/cli/src/commands/ · 2 files<br/>? not checked"]:::unknown
  s3c2["packages/cli/test/policy.test.mjs<br/>? not checked"]:::unknown
  s4c1["packages/web/src/lib/ · 2 files<br/>? not checked"]:::unknown
  s4c2["packages/web/src/components/lore/FilterMenu.tsx<br/>? not checked"]:::unknown
  s5c1["packages/cli/src/commands/dedupe.mjs<br/>? not checked"]:::unknown
  s5c2["packages/cli/test/dedupe.test.mjs<br/>? not checked"]:::unknown
  s6c1["packages/cli/src/commands/mcp-server.mjs<br/>? not checked"]:::unknown
  s6c2["scripts/smoke/smoke-mcp-tools.mjs<br/>? not checked"]:::unknown
  m1i1["packages/cli/test/ · 6 files<br/>import this file"]:::imports
  m1i2["packages/cli/src/store/index.mjs<br/>imports this file"]:::imports
  m2i1["packages/cli/test/ · 4 files<br/>import this file"]:::imports
  m2i2["packages/cli/src/commands/ · 2 files<br/>import this file"]:::imports
  m2i3["packages/cli/src/store/index.mjs<br/>imports this file"]:::imports
  m3i1["packages/web/src/components/lore/ · 5 files<br/>import this file"]:::imports
  m4i1["packages/cli/src/commands/ · 3 files<br/>import this file"]:::imports
  m4i2["packages/cli/test/completion.test.mjs<br/>imports this file"]:::imports
  s1 -.-> s1c1
  s1 -.-> s1c2
  s1 -.-> s1c3
  s2 -.-> s2c1
  s2 -.-> s2c2
  s3 -.-> s3c1
  s3 -.-> s3c2
  s4 -.-> s4c1
  s4 -.-> s4c2
  s5 -.-> s5c1
  s5 -.-> s5c2
  s6 -.-> s6c1
  s6 -.-> s6c2
  m1 -.-> m1i1
  m1 -.-> m1i2
  m2 -.-> m2i1
  m2 -.-> m2i2
  m2 -.-> m2i3
  m3 -.-> m3i1
  m4 -.-> m4i1
  m4 -.-> m4i2
  classDef changed fill:#eef2ff,stroke:#6366f1,color:#1e1b4b
  classDef ok fill:#e7f6ec,stroke:#16a34a,color:#14532d
  classDef partial fill:#fef9c3,stroke:#ca8a04,color:#713f12
  classDef unknown fill:#f3f4f6,stroke:#9ca3af,stroke-dasharray:4 3,color:#374151
  classDef bad fill:#fde8e8,stroke:#dc2626,color:#7f1d1d
  classDef warn fill:#fff4e5,stroke:#d97706,color:#78350f
  classDef imports fill:#f8fafc,stroke:#64748b,stroke-dasharray:4 3,color:#1e293b
Loading
  • matchesQuery (packages/cli/src/shared/lessons-pure.mjs) — body change · 3 consumer files · 3 not traced
  • normalizeEntry (packages/cli/src/shared/lessons-view.mjs) — body change · 3 consumer files · 3 not traced
  • parseDimensionConditions (packages/cli/src/shared/flags.mjs) — body change · 3 consumer files · 3 not traced
  • rootSuggestions (packages/web/src/lib/filters.ts) — body change · 3 consumer files · 3 not traced
  • clusterByKeyPattern (packages/cli/src/shared/lessons-view.mjs) — body change · 2 consumer files · 2 not traced
  • MCP_TOOL_DEFS (packages/cli/src/surfaces.generated.mjs) — body change · 2 consumer files · 2 not traced
  • MCP_TOOLS (packages/schemas/src/shared/tool-catalog.ts) — body change · 2 consumer files · 2 not traced
  • list (packages/cli/src/commands/list.mjs) — body change · 1 consumer file · 1 not traced
  • search (packages/cli/src/commands/search.mjs) — body change · 1 consumer file · 1 not traced
  • toolListArchived (supabase/functions/mcp/tools.ts) — body change · 1 consumer file · 1 not traced
  • parseReadFilters (packages/cli/src/shared/flags.mjs) — added change · 3 consumer files · 3 not traced
  • entryFilter (packages/cli/src/shared/lessons-view.mjs) — added change · 2 consumer files · 2 not traced
  • matchesTags (packages/cli/src/shared/lessons-pure.mjs) — added change · 2 consumer files · 2 not traced
  • canonicalPrNumber (packages/cli/src/shared/flags.mjs) — added change · 1 consumer file · 1 not traced
  • DEFAULT_TAGS_MODE (packages/cli/src/shared/lessons-pure.mjs) — added change · 1 consumer file · 1 not traced
  • matchesScalar (packages/cli/src/shared/lessons-view.mjs) — added change · 1 consumer file · 1 not traced
  • TAGS_MODES (packages/cli/src/shared/lessons-pure.mjs) — added change · 1 consumer file · 1 not traced
  • packages/cli/src/store/local.mjs — changed file · imported by 7 files, not traced
  • packages/cli/src/store/remote.mjs — changed file · imported by 7 files, not traced
  • packages/web/src/components/lore/FilterMenu.tsx — changed file · imported by 5 files, not traced
  • packages/cli/src/shared/completions.mjs — changed file · imported by 4 files, not traced
  • packages/web/src/lib/tag-filter.ts — changed file · imported by 3 files, not traced
  • supabase/functions/_shared/schemas/tool-catalog.ts — changed file · imported by 3 files, not traced
Review details
Gate Status Details
Description vs. code ✅ Edited body now names all eight list/search filters, the new --json fields and list_archived tags
Prior review feedback ✅ Earlier review comments are resolved.
Documentation ✅ Body, code comments, CLI help, completions, docs/cli.md, tags.mdx and mcp-tools.md cover the change
Self-review signals ✅ No debug logs, leftover TODOs, or unreviewed stubs.
Code review ✅ The multi-lens review found no blocking issues.

Found

Quality — produced 0 → posted inline 0 · cleared 0 · carried forward 0 · deferred 0 · below-bar 0

Run

incremental · 0 lines in delta · tier deep · depth checkout
Integrations — none
Memories — skipped (zero-delta fast path)

Nothing to report — standards (skipped), optimality (skipped), measurability (skipped), severity, 0 files skipped.

pr-reviewer · commit aa533d2 · no code changes since aa533d2, gate checks only · how these findings are produced · updated Oct 20, 2026 3:54pm UTC

Comment thread packages/cli/src/store/local.mjs Outdated
address review comment: filter tags after mergeByKey so a project copy that
fails the filter can no longer let its shadowed home copy through

Addresses the pr-reviewer bot's comment: #709 (comment)

Refs: #709
Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
@dash0-dev dash0-dev Bot changed the title feat: tag filters in the Explorer, list/search and memory.list_archived; kind/host modes on list/search feat: tag filters in the Explorer, list/search and memory.list_archived; all dimension filters on list/search Oct 20, 2026
@dash0-dev
dash0-dev Bot marked this pull request as ready for review October 20, 2026 15:56
@dash0-dev
dash0-dev Bot requested a review from mthines as a code owner October 20, 2026 15:56
@dash0-dev
dash0-dev Bot merged commit 4492e98 into main Oct 20, 2026
19 checks passed
@lorekitbot lorekitbot Bot mentioned this pull request Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant