Skip to content

Releases: Semantic-Infrastructure-Lab/reveal

v0.103.0

Choose a tag to compare

@scottsen scottsen released this 02 Jul 04:21

Release v0.103.0

Added

  • help://quick derived from the adapter registry instead of hand-maintained (BACK-391 M4) — the top command block used to be a static list skewed toward infra adapters (6 of 10 entries were ssl/domain/nginx/cpanel/check) and could never include project-local plugins. New _get_quick_commands() (adapters/help.py) iterates the live adapter registry, pulling each adapter's own get_help() description + first example URI, so the block can't drift from reality and automatically surfaces plugins. A _QUICK_RANK dict controls priority only (not content) to keep code/session/quality adapters ahead of the infra niche. This was the strategy doc's last open item — the M1–M4 onboarding sprint is complete. +4 tests.
  • Breadcrumbs teach the outline≠content mental model, not just mechanics (BACK-389 M1)reveal doc.md now frames its "Next:" hint honestly (Outline only — headings show where, not what.) and suggests --section '<first heading>' with the real heading name, the doc equivalent of the Class.method hint code files already get (_suggest_doc_section_extraction, reveal/utils/breadcrumbs.py). The once-per-install stderr nudge (_show_breadcrumb_hint_once) now leads with New here? reveal --agent-help instead of only advertising how to disable breadcrumbs — this is the one channel with ~100% agent exposure, so it's the best place to land the orientation lesson at first use. +7 tests.

Fixed

  • --agent-help / help://agent now obey progressive disclosure (BACK-389)_FULL_ONLY_TOPICS no longer exempts agent, so help://agent truncates to a ~500-token preview + help://agent/full footer like every other guide. The CLI flag --agent-help was a second, separate implementation that bypassed HelpAdapter entirely (direct file read); rewired to go through the same code path so both doors behave identically. --help epilog now points to help://quick/--agent-help (previously zero pointer). Stale ~40K tokens descriptions corrected across AGENT_HELP.md, README.md, QUICK_START.md, HELP_SYSTEM_GUIDE.md, DUPLICATE_DETECTION_GUIDE.md.

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.102.0

Choose a tag to compare

@scottsen scottsen released this 01 Jul 06:55

Release v0.102.0

Added

  • ElementRenderMode registry replaces render-mode if/elif chain (BACK-360)_render_element in reveal/cli/routing/uri.py dispatched --outline/--links/--frontmatter through an 87-line if/elif chain; replaced with an _ELEMENT_RENDER_MODES registry of _handle_*_mode(result, args, text_field, label) -> bool handlers and a 5-line dispatch loop. No behavior change.
  • Heading-aware markdown outline collapse in default text mode (BACK-387) — markdown heading outlines now indent by level (H2/H3 visually distinct, was flush-left) and auto-collapse past 25 headings to the shallowest discriminating level with (+N subheadings) counts, deterministic via _discriminating_level(). --depth N doubles as an explicit collapse override. New _format_markdown_headings()/_discriminating_level() in display/formatting.py. Verified against 9 real docs (e.g. AGENT_HELP.md 107→24 lines); JSON and --outline modes unaffected. +9 tests.

Fixed

  • E501 false-flags data/doc files (BACK-386) — long-line rule now skips data/doc file categories via category-aware BaseRule.skip_categories.
  • Doc/help counts corrected across 13 docs + 3 code files — README and friends claimed "305+ languages"; a passing integrity test enforced it, but reveal only routes/analyzes 84 languages by extension (305 is the underlying tree-sitter-language-pack grammar count, mostly unmapped). Corrected adapter count (22/23/24 → 25), language count (35/37/50/80/185/305 → 84), and AGENT_HELP token-cost estimate (~12K → ~40K) everywhere they were hardcoded, including CLI --help and help:// output. Rewrote test_registry_integrity.py::test_language_count_in_readme_is_accurate to assert against reveal --languages (the real gate) instead of the raw tree-sitter pack, with floor semantics (actual >= claimed) to tolerate benign registry-pollution leaks from test ordering. Filed BACK-388 to generate/lint these counts from the live registry instead of hand-typing them.

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.101.0

Choose a tag to compare

@scottsen scottsen released this 30 Jun 08:01

Release v0.101.0

Added

  • surface --source-only flag (BACK-380) — excludes test files and directories from the surface scan so DD / security reads see only production surface. Prunes test dirs (names starting with test/spec, plus __tests__) and test files (test_*.py, *_test.py, conftest.py, *.test.ts, *.spec.ts, *.test.tsx, *.spec.tsx) during file collection. Single-file invocations are unaffected; _meta.known_limits records the exclusion. Dogfood: 2242 → 286 surface entries on reveal's own tree. +11 tests.
  • git://<path>?type=ownership — commit-share ownership query (BACK-383) — aggregates git-log authorship over a file, directory, or whole repo, returning the primary author, per-author commit-share %, contributor count, and last-touch date. Works uniformly for files and directories (a directory resolves to a subtree oid, so one parent-vs-commit comparison detects any change beneath it). Merge commits are excluded by default (?merges=1 to include); ?limit=N caps the history walk. This is straight commit-log aggregation (commit-share, not surviving-line ownership — use ?type=blame for that); the consumer applies the bus-factor / key-person judgment. Carries the BACK-379 shallow_clone warning. New get_ownership() + commit_touches_path() in adapters/git/files.py; git_ownership renderer. +10 tests.

Fixed

  • surface Python: mock.patch / mocker.patch / unittest.mock.patch decorators misclassified as HTTP PATCH routes (BACK-377) — Python sibling of BACK-375 (TS supertest). _is_http_route() in nav_surface.py now short-circuits via new _is_mock_patch_decorator() helper when the decorator is any known mock-patch form (mock.patch(, mocker.patch(, patch(, unittest.mock.patch(). Real app.patch('/endpoint') routes are unaffected. Repro: reveal surface saleor/payment was reporting 22 PATCH routes all pointing at test files; now 0 false positives. +10 tests.
  • architecture / overview / imports:// flood on repos with committed venv/ or site-packages/ (BACK-378)ImportsAdapter._build_graph() used bare rglob('*') with no directory filtering. On a repo with a committed venv/, this pulled in all of scipy/joblib/sklearn — producing 239 false entry points and 49 false circular groups, and timing out overview at 90s. Replaced rglob with os.walk + SKIP_DIRECTORIES filter (the same canonical set from reveal.defaults already used by surface, analysis.py, etc.). No behavior change on normal repos; vendor-heavy repos now return clean structural analysis instantly.
  • git://?type=blame silently degraded on shallow clones (BACK-379) — Blame on a --depth 1 clone produced empty or limited attribution with no indication of why. get_file_blame() now checks repo.is_shallow (pygit2 native attr) and propagates shallow_clone: true to the result; the renderer prints a one-line warning before the blame output: ⚠ Shallow clone detected — blame attribution is limited to the fetched history. Run git fetch --unshallow for complete bus-factor / key-person data.

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.100.2

Choose a tag to compare

@scottsen scottsen released this 26 Jun 19:59

Release v0.100.2

Added

  • Confidence/limitation metadata on inference-heavy outputs (BACK-330)calls://?uncalled, depends://, and surface now carry explicit confidence caveats. ?uncalled text output gains a "⚠ Static only — runtime dispatch may create hidden callers" line; depends:// adds a _meta dict (analysis_kind, confidence, known_limits) and bumps contract_version to 1.1; surface adds _meta to JSON + a text caveat. AGENT_HELP "Interpreting absence of evidence" notes added.
  • contracts for TypeScript (BACK-372)reveal contracts now classifies TypeScript files: interface → contract (Protocol/ABC analog), abstract class → abstract class analog, type alias → TypedDict analog, class … implements I → implementation edge. Upstream analyzer fixes reusable by all consumers: _extract_class_bases reads class_heritageextends_clause + implements_clause; abstract_class_declaration added to CLASS_NODE_TYPES; interface extends captured via extends_type_clause. TS-flavored group labels in renderer. Dogfood: 94 contracts found in tia-chess. +11 tests.
  • surface for TypeScript (BACK-373)reveal surface now scans .ts/.tsx files for hidden dependencies. New nav_surface_ts.py tree-sitter walker detects 8 categories: network (axios/fetch/got/…), db (pg/prisma/knex/…), sdk (@anthropic-ai/sdk/openai/stripe/…), env (process.env.), fs (fs.writeFile/Bun.write/Deno.writeTextFile), http (express/fastify/koa route registrations), subprocess (child_process.*/execa — new category), cli (yargs/commander .command()/.option()). Python and TS results merged into one report. Dogfood: 116 surface entries on tia-chess. +23 tests.
  • patches:// for Jest/Vitest (BACK-374)patches:// and the testability patch-pressure signal now work on TypeScript. New scan_patches_ts() detects jest.mock/vi.mock (module path), jest.spyOn/vi.spyOn (object+method), jest.fn/vi.fn, and jest.replaceProperty/vi.replaceProperty. iter_python_test_files generalized to iter_test_files (dispatches by extension; backward-compat alias preserved). Dogfood: 31 vi.fn uses detected in tia-chess. +8 tests.

Fixed

  • surface TypeScript supertest false positives (BACK-375) — HTTP-route detection no longer counts supertest request(app).get(...) calls as routes. New _callee_obj_is_call() helper in nav_surface_ts.py skips nodes whose callee object is itself a call expression. tia-chess: 39 → 29 HTTP routes (10 false positives removed). +1 test.
  • letsencrypt:// false "certs will expire" on snap-installed certbot (BACK-376)_check_renewal_timer() previously probed a fixed 5-path list that missed snap's unit (/etc/systemd/system/snap.certbot.renew.timer); since snap is certbot's official install method, this false-alarmed on most modern hosts. Replaced the fixed list with a glob scan of the standard systemd unit dirs (*certbot*.timer) and cron dirs (*certbot*) — catches snap (labelled kind: snap), apt (certbot.timer), and the certbot-renew.timer variant, still no-subprocess. Warning reworded to clarify it reflects a renewal file's presence, not active state. +5 tests.

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.100.1

Choose a tag to compare

@scottsen scottsen released this 20 Jun 06:07

Release v0.100.1

Fixed

  • TypeScript class methods not extractable by namereveal file.ts methodName always failed with "Element not found" for class methods. _get_node_name didn't include property_identifier in its direct-child name lookup; TypeScript method_definition nodes use property_identifier for the method name (vs plain identifier for standalone functions). One-word fix; method_definition was already in FUNCTION_NODE_TYPES. +2 tests (TS + TSX).

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.100.0

Choose a tag to compare

@scottsen scottsen released this 19 Jun 05:28

Release v0.100.0

Added

  • D005: cross-file hardcoded literal cluster detection — New duplication rule catching the same list/set/tuple literal duplicated across multiple files — the pattern M104 (per-file) structurally cannot see. On first check per project it scans all .py files under the project root, indexes each literal by its order-independent value set, and flags clusters spanning 3+ distinct files (thresholds: literal ≥5 items, ≥3 files; stable names like __all__/*_format/fixtures exempt). Reuses I002's scan-once-cache-per-root strategy. Dogfooding reveal's own tree surfaced a real 3-file _SECRET_PATTERNS duplication that turned out to be dead code (see Refactored). +21 tests.
  • --with-stats for session listing (BACK-348)reveal claude:// --with-stats reads each displayed session's JSONL (the displayed set only, ≤20) and adds MSGS and DUR columns showing total message count and elapsed duration (1h30m, 45m). Default listing is unchanged; a --with-stats hint appears in the count line. Also fixed a BACK-349 CLI gap: --until was missing from parser.py and defaults.py so the CLI flag had no effect (only ?until= query param worked). +13 tests.
  • ?until=DATE date range filtering for claude:// session listings (BACK-349)?since=2026-06-10&until=2026-06-12 now scopes session listing results. ?until=today normalizes to today's date. +2 tests.
  • Sub-agent navigation from parent sessions (BACK-347)reveal claude://session/<name>/agents now resolves sub-agent JSOLs: shows step/status/type/duration/tokens/prompt and a → reveal <path> navigation hint for each Agent tool invocation. +4 tests.

Fixed

  • Help guides no longer leak YAML front matter — Every help://<topic> guide rendered its raw --- front-matter block (title, help_topic, help_category, help_token_estimate, help_description) ahead of the actual content, in both the default and /full views — noise for every human and agent. _load_static_help now strips the leading front-matter fence before section/truncation, so all render paths are clean; a bare doc or one merely using a --- horizontal rule is untouched. +5 tests.
  • D005 wasted ~23s before bailing on oversized trees — The file-count ceiling was checked only after rglob materialized the entire .py list, so a too-large root (e.g. a marker-less parent aggregating many projects) walked and parsed everything before skipping. Collection now aborts the moment the count crosses the ceiling (no materialization, no parsing) — an over-ceiling root bails in ~0s. The 5,000-file ceiling is now overridable via REVEAL_D005_MAX_FILES (mirrors I002's env var). +5 tests.
  • "No structure available" dead end now shows fallback hints (BACK-336) — All three sites in display/structure.py that print "No structure available" now follow up with Hint: reveal <path> --grep 'pattern' | reveal <path> --show-ast so users have a clear next step instead of a dead end. +3 test assertions.
  • claude:// ?summary renderer reordered for usefulness (BACK-343) — Files-changed list and final assistant snippet now lead the summary; tool success rates and message sizes are secondary. Renderer-only change.
  • --until today was a silent no-op; microsecond boundary excluded valid files (BACK-364)--until today now normalizes to today's ISO date before comparison (was appending T23:59:59 to the literal string 'today', making every file pass). Boundary changed from T23:59:59 to T23:59:59.999999 so files modified in the last second of the day are included. Fixed in both adapter.py and sessions.py. +7 tests.
  • tree-sitter Node finalized off-thread no longer emits noise (BACK-368) — A tree-sitter Node (a PyO3 unsendable object) created on the main thread could be swept by a cyclic-GC pass that fired on a ThreadPoolExecutor worker (L002 link checks, claude post-process stats), finalizing it off-thread and printing RuntimeError: ... is unsendable, but is being dropped on another thread. New utils.threadsafe.main_thread_gc keeps cyclic collection on the main thread for the duration of those pools (root-cause fix, not a warning filter). Full test suite now emits zero warnings. +4 tests.

Changed

  • M104 detects set/tuple/frozenset collections (BACK-366) — The hardcoded-list rule previously walked only ast.List, missing set/frozenset/tuple-based extension and skip-dir lists (the common de-duped form) — including reveal's own code_exts set. It now resolves list/set/tuple literals plus frozenset()/set()/tuple()/list() call-wrappers, counts set/tuple values in lookup-table dicts, and adds a DIRECTORIES classification so skip-dir lists no longer mislabel as FILE_EXTENSIONS. +8 tests.
  • --with-stats JSONL reads parallelized (BACK-362) — Session stats are now fetched concurrently via ThreadPoolExecutor(max_workers=min(8, N)) instead of sequentially, improving reveal claude:// --with-stats speed on large session corpora.

Refactored

  • Removed dead _mask_secrets duplication in claude adapter (D005 finding) — D005 flagged _SECRET_PATTERNS duplicated across 3 files; 2 of the 3 copies were dead (claude/adapter.py's method is only self-recursive with no entry point; claude/handlers/system.py's copy is never called by any handler). Git history confirms claude config masking was never wired up — the original _get_config never called it, and the BACK-241 handler split copied the dead code forward. No security regression: claude _get_config returns a curated summary (project paths, MCP names, allowed-tools, flag allowlist), not raw values; only codex (which dumps full parsed TOML) needs masking and keeps its single live copy. Replaced a fossil test (which exercised the dead helper in isolation) with one asserting the real no-leak property of _get_config().
  • Registry-derived is_code_file — CATEGORY attribute on analyzers (BACK-369) — Added CATEGORY='code'|'data'|'doc'|'config' to every registered analyzer via @register() (default 'code'); 25 non-code extensions explicitly marked (JSON/YAML/XML/CSV/TOML → data; Markdown/HTML/office docs → doc; INI/TOML/HCL → config). New registry.get_code_extensions() (frozenset, lru_cache) replaces the 35-entry hardcoded set in is_code_file(). Side effects: drops ~12 un-analyzable extensions (.cr, .glsl, .jl, .nim etc) that were listed but had no analyzer; adds ~20 that were missing but are fully supported (.mjs, .cjs, .bat, .m, .mm, .r, .sv, .svh etc). +9 tests.
  • Directory skip-list centralized into reveal.defaults (BACK-367) — The set of directories to skip during directory walks was redefined, with drifting contents, in 9 modules (ast/stats/surface/grep/pack/file_checker/patches/nav_*); one walker skipped .ruff_cache/htmlcov while another descended into it. A single canonical SKIP_DIRECTORIES superset now lives in reveal.defaults and every site aliases to it; M104 (BACK-366) guards against reintroducing a scattered literal. Net behavior change: narrower sites (notably --grep) now uniformly skip the full dependency/build/cache set.
  • claude/adapter.py split into focused modules (BACK-363) — Extracted schema.py (all _SCHEMA_* constants, 261 lines) and handlers/post_process.py (all _post_process_* functions + _slice_list, 157 lines). adapter.py reduced from 1,383 → 1,011 lines (−27%).
  • get_file_blame helpers extracted (BACK-361) — Five sub-concerns extracted from a 137-line cx:30 zero-coverage function into independently testable helpers: _resolve_blame_commit, _read_blob_lines, _format_blame_hunks, _read_blame_ignore_revs, _detect_noise_commits. +17 tests.

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.99.0

Choose a tag to compare

@scottsen scottsen released this 15 Jun 02:36

Release v0.99.0

Added

  • claude://session/<name>/prompts — human-typed prompts only (BACK-340)/user encodes tool-result turns as role: user, so a session with ~15 real prompts shows ~170 "user" messages. The new /prompts resource filters to messages with at least one type: text block, excluding pure tool_result wrappers. New get_human_prompts() in analysis/messages.py, dedicated _render_claude_user_prompts renderer, claude_user_prompts output type in the schema. /user is unchanged for backward compatibility. (risen-scepter-0614)
  • ?snippet=N for cross-session search context (BACK-342)reveal 'claude://sessions/?search=term&snippet=300' controls the characters of context around each match (default 120, clamped 60–500). Threaded window_chars through search_sessions()search_sessions_for_term()_extract_first_snippet()_collect_block_matches()_search_block()_find_excerpt(). Removed the hard 200-char cap in the cross-session renderer (within-session search renderer cap unchanged). (risen-scepter-0614)
  • claude://session/<name>/timeline renderer (BACK-344)/timeline was routing correctly to get_timeline() data (events with timestamps, tool names, content previews) but had no renderer — every call fell back to a key/value dump of the list. New _render_claude_timeline shows [idx] LABEL msg=N HH:MM preview per event with distinct formatting for tool_call (shows tool name), tool_result (shows tool name + ok/err status + preview), thinking (shows token estimate), assistant_message/user_message (shows content preview). (prairie-squall-0614)

Fixed

  • claude:// session titles: skip harness XML and single-word acks (BACK-341) — UUID-named sessions (Windows / multi-user, no session badge) showed titles like <local-command-caveat>... or aye. _parse_jsonl_line_for_title now skips candidates matching ^<[a-z] (harness-injected XML tags: <local-command-caveat>, <command-name>, <bash-input>, <bash-stdout>) and candidates shorter than 5 chars (aye, ok). A < mid-sentence (Is x < y?) is preserved. Additionally, _scan_jsonl_for_title now scans assistant Bash calls for session badge "..." and returns it when present — the listing path is now badge-aware, matching the detail view. (risen-scepter-0614)
  • claude:// /thinking emitted noise for encrypted sessions (BACK-345) — Recent Claude Code versions write thinking blocks with an empty thinking: field (content redacted client-side before JSONL). A 173-turn session produced 141 lines of empty dividers. Fix: if all blocks have empty content, emit one summary line ("N thinking blocks — content unavailable (encrypted)"). If some blocks have content (older pre-encryption sessions), render only non-empty blocks silently skipping empty ones. (prairie-squall-0614)
  • claude:// /messages undiscoverable — missing from schema elements and help (BACK-346)/messages is the best resource for reading narrative turns (assistant text only, strips tool-call-only messages) but was absent from _SCHEMA_ELEMENTS, _SCHEMA_EXAMPLE_QUERIES, and _get_help_examples. Added messages and prompts to _SCHEMA_ELEMENTS with descriptions; added /messages example entry to both query lists. (prairie-squall-0614)

Tests

  • +30 tests in tests/test_claude_adapter_gaps.pyTestGetHumanPrompts (7), TestPromptsRoute (3), TestParseJsonlLineForTitleXmlSkip (6), TestParseJsonlLineForTitleMinLength (5), TestScanJsonlForTitleBadge (4), TestSnippetWindowParam (5). Full suite: 8951 passed, 22 skipped. (risen-scepter-0614)
  • +18 testsTestBack344TimelineRenderer (8), TestBack345ThinkingEmptyBlocks (5), TestBack346MessagesDiscoverable (5). Full suite: 8969 passed, 22 skipped. (prairie-squall-0614)

Known gaps (filed, not yet fixed)

  • BACK-347 no sub-agent session navigation. BACK-348 listing lacks duration/message-count columns. BACK-349 no ?until=DATE range filter. See internal-docs/feedback/CLAUDE_ADAPTER_RESOURCE_AUDIT_2026-06-14.md.

Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.98.0

Choose a tag to compare

@scottsen scottsen released this 14 Jun 07:35

Release v0.98.0

Fixed

  • Zig: doubled function names in display_build_function_signature returned "sin(value)" but the display layer renders f"{name}{signature}", producing sinsin(value). Changed to return params only: "(value)" or "" for zero-param functions. (hehacapo-0613)
  • Zig: named extraction failingreveal file.zig funcname raised an error because base extract_element searches Python/Go/Rust node type names, none of which match Zig's Decl/FnProto tree. Added ZigAnalyzer.extract_element override walking Decl nodes. Verified against /opt/zig/lib/std/math.zig. (hehacapo-0613)
  • reveal check/hotspots hang on non-Python projects — BACK-338 — Three layered defects in I002's _find_project_root caused the import-graph build to scan the entire filesystem when a stray ancestor __init__.py existed above a non-Python project. (A) Pass-2 __init__.py walk rewritten to only ascend a contiguous chain rooted at the target's own dir — a non-package directory never ascends. (B) Pass-1 now checks _PROJECT_MARKERS (pyproject.toml, setup.py, package.json, go.mod, Cargo.toml) before falling back to the init-chain walk. (C) _i002_preload was unconditional — now skips the import-graph build when I002 is not in the effective rule set (e.g. --select C901). Hardening: _collect_raw_imports aborts to an empty graph + logged WARNING past REVEAL_I002_MAX_FILES (default 20 000) — future mis-detection degrades to a logged skip, never a hang. (bright-singularity-0613 filed, hehacapo-0613 fixed)

Tests

  • +27 testsTestI002ProjectRootBACK338 (8 tests) in test_rules.py; Defect C + preload-signature tests in test_file_checker.py; Zig display and named-extraction tests in test_zig_analyzer.py. Full suite: 8921 passed, 22 skipped. (hehacapo-0613)


Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.97.0

Choose a tag to compare

@scottsen scottsen released this 25 May 07:02

Release v0.97.0

Added

  • codex:// adapter — full Claude Code session explorer — Phase 1+2+3 complete. reveal codex:// lists all sessions with token counts and summaries; reveal 'codex://SESSION' shows full overview (goal, memories, pipeline, config, rules); reveal 'codex://SESSION/messages' browses conversation with role/token/tool breakdowns; reveal 'codex://SESSION/tools' summarizes tool calls with success/failure counts; reveal 'codex://SESSION/shell' shows all bash commands run; reveal 'codex://SESSION/errors' surfaces failures and retries; reveal 'codex://SESSION/workflow' traces task creation and completion; reveal 'codex://SESSION/timeline' shows conversation arc with phase detection; reveal 'codex://SESSION/?goal' extracts session goal; ?search=TERM filters to sessions containing a term with contextual snippets. Adapts to Claude Code's JSONL format with graceful handling of all message types (user, assistant, tool_result, tool_use). (onyx-spectrum-0524)
  • Agent discoverability — Sprint 1-3claude:// schema gains ?params, ?last, ?tool, ?turns, ?since query parameters; help:// decision_tree and recipes entries guide agents to the right resource for common tasks; MCP_SETUP.md cross-resource workflow examples; README.md AI agents section; AGENT_HELP.md codex row added. 17 new tests across claude adapter schema parity and help registry. (roaring-tide-0524)

Fixed

  • codex:// Path(None) crashdict.get('key', default) returns None (not default) when the key is present with a NULL SQLite value; rollout_path column is sometimes NULL, causing Path(None) TypeError. Fixed with explicit None check. (roaring-tide-0524)
  • help:// cli_flags renderer dropping descriptions — Sprint 1-3 changed cli_flags from list to dict; _render_schema_cli_flags was iterating dict keys, silently dropping all flag descriptions. Fixed by iterating .items(). (roaring-tide-0524)
  • codex:// grand_total tokens using per-request deltagrand_total was reading last-turn per-request usage delta instead of cumulative session total. Added get_grand_total_tokens() to analysis/messages.py. (roaring-tide-0524)
  • codex:// tokens_used == 0 falsy guardtokens_used or jsonl_total silently replaced a legitimate 0 with the JSONL total. Changed to is not None guard. (roaring-tide-0524)
  • codex:// content search false positives — sessions where the search term appeared only in tool payloads (not user/agent turns) were included in results with empty snippet lists. Fixed by only appending sessions with at least one snippet. (roaring-tide-0524)

Chore

  • 7 mypy errors fixed in new codex adapter code: str() casts in overview.py, messages.py, timeline.py; explicit last typing in _parse_token_usage; Callable annotation on dynamic dispatch in adapter.py; removed dead # type: ignore in handlers/system.py. (roaring-tide-0524)

Tests

  • 13 regression tests added in tests/adapters/test_codex_adapter.py: TestRegressionNullRolloutPath, TestRegressionContentSearchFalsePositive, TestRegressionGrandTotalCumulative, TestRegressionTokensUsedZero, TestRegressionCliFlags, and 8 more covering schema parity and edge cases. (roaring-tide-0524)


Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md

v0.96.1

Choose a tag to compare

@scottsen scottsen released this 25 May 03:09

Release v0.96.1

Fixed

  • --type <filetype> on a directory now filters files instead of silently returning zero results (crackling-current-0524) — reveal . --type markdown (and --type python, --type yaml, etc.) routed to the AST query handler (ast://.?type=markdown), which found no AST nodes of that name and returned 0 results with no error. Root cause: _handle_directory_path in routing/file.py unconditionally treated --type as an AST node-type filter even when the value was a file-format name. Fix: known file-type names (markdown.md,.markdown, python.py, yaml.yaml,.yml, etc.) are translated to extension filters and applied to the directory display. Unknown values (AST node types like class, function) still route to the AST handler as before. Combination --name Foo --type function also continues to work — --name presence always triggers AST routing.


Install/Upgrade:

pip install --upgrade reveal-cli

Documentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md