Releases: Semantic-Infrastructure-Lab/reveal
Release list
v0.103.0
Release v0.103.0
Added
help://quickderived 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 ownget_help()description + first example URI, so the block can't drift from reality and automatically surfaces plugins. A_QUICK_RANKdict 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.mdnow 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 theClass.methodhint code files already get (_suggest_doc_section_extraction,reveal/utils/breadcrumbs.py). The once-per-install stderr nudge (_show_breadcrumb_hint_once) now leads withNew here? reveal --agent-helpinstead 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://agentnow obey progressive disclosure (BACK-389) —_FULL_ONLY_TOPICSno longer exemptsagent, sohelp://agenttruncates to a ~500-token preview +help://agent/fullfooter like every other guide. The CLI flag--agent-helpwas a second, separate implementation that bypassedHelpAdapterentirely (direct file read); rewired to go through the same code path so both doors behave identically.--helpepilog now points tohelp://quick/--agent-help(previously zero pointer). Stale~40K tokensdescriptions corrected acrossAGENT_HELP.md,README.md,QUICK_START.md,HELP_SYSTEM_GUIDE.md,DUPLICATE_DETECTION_GUIDE.md.
Install/Upgrade:
pip install --upgrade reveal-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.102.0
Release v0.102.0
Added
ElementRenderModeregistry replaces render-mode if/elif chain (BACK-360) —_render_elementinreveal/cli/routing/uri.pydispatched--outline/--links/--frontmatterthrough an 87-line if/elif chain; replaced with an_ELEMENT_RENDER_MODESregistry of_handle_*_mode(result, args, text_field, label) -> boolhandlers 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 Ndoubles as an explicit collapse override. New_format_markdown_headings()/_discriminating_level()indisplay/formatting.py. Verified against 9 real docs (e.g.AGENT_HELP.md107→24 lines); JSON and--outlinemodes 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
--helpandhelp://output. Rewrotetest_registry_integrity.py::test_language_count_in_readme_is_accurateto assert againstreveal --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-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.101.0
Release v0.101.0
Added
surface --source-onlyflag (BACK-380) — excludes test files and directories from the surface scan so DD / security reads see only production surface. Prunes test dirs (names starting withtest/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_limitsrecords 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=1to include);?limit=Ncaps the history walk. This is straight commit-log aggregation (commit-share, not surviving-line ownership — use?type=blamefor that); the consumer applies the bus-factor / key-person judgment. Carries the BACK-379shallow_clonewarning. Newget_ownership()+commit_touches_path()inadapters/git/files.py;git_ownershiprenderer. +10 tests.
Fixed
surfacePython:mock.patch/mocker.patch/unittest.mock.patchdecorators misclassified as HTTP PATCH routes (BACK-377) — Python sibling of BACK-375 (TS supertest)._is_http_route()innav_surface.pynow 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(). Realapp.patch('/endpoint')routes are unaffected. Repro:reveal surface saleor/paymentwas reporting 22 PATCH routes all pointing at test files; now 0 false positives. +10 tests.architecture/overview/imports://flood on repos with committedvenv/orsite-packages/(BACK-378) —ImportsAdapter._build_graph()used barerglob('*')with no directory filtering. On a repo with a committedvenv/, this pulled in all of scipy/joblib/sklearn — producing 239 false entry points and 49 false circular groups, and timing outoverviewat 90s. Replacedrglobwithos.walk+SKIP_DIRECTORIESfilter (the same canonical set fromreveal.defaultsalready used bysurface,analysis.py, etc.). No behavior change on normal repos; vendor-heavy repos now return clean structural analysis instantly.git://?type=blamesilently degraded on shallow clones (BACK-379) — Blame on a--depth 1clone produced empty or limited attribution with no indication of why.get_file_blame()now checksrepo.is_shallow(pygit2 native attr) and propagatesshallow_clone: trueto 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-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.100.2
Release v0.100.2
Added
- Confidence/limitation metadata on inference-heavy outputs (BACK-330) —
calls://?uncalled,depends://, andsurfacenow carry explicit confidence caveats.?uncalledtext output gains a "⚠ Static only — runtime dispatch may create hidden callers" line;depends://adds a_metadict (analysis_kind,confidence,known_limits) and bumpscontract_versionto1.1;surfaceadds_metato JSON + a text caveat. AGENT_HELP "Interpreting absence of evidence" notes added. contractsfor TypeScript (BACK-372) —reveal contractsnow classifies TypeScript files:interface→ contract (Protocol/ABC analog),abstract class→ abstract class analog,typealias → TypedDict analog,class … implements I→ implementation edge. Upstream analyzer fixes reusable by all consumers:_extract_class_basesreadsclass_heritage→extends_clause+implements_clause;abstract_class_declarationadded toCLASS_NODE_TYPES; interfaceextendscaptured viaextends_type_clause. TS-flavored group labels in renderer. Dogfood: 94 contracts found in tia-chess. +11 tests.surfacefor TypeScript (BACK-373) —reveal surfacenow scans.ts/.tsxfiles for hidden dependencies. Newnav_surface_ts.pytree-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. Newscan_patches_ts()detectsjest.mock/vi.mock(module path),jest.spyOn/vi.spyOn(object+method),jest.fn/vi.fn, andjest.replaceProperty/vi.replaceProperty.iter_python_test_filesgeneralized toiter_test_files(dispatches by extension; backward-compat alias preserved). Dogfood: 31 vi.fn uses detected in tia-chess. +8 tests.
Fixed
surfaceTypeScript supertest false positives (BACK-375) — HTTP-route detection no longer counts supertestrequest(app).get(...)calls as routes. New_callee_obj_is_call()helper innav_surface_ts.pyskips 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 (labelledkind: snap), apt (certbot.timer), and thecertbot-renew.timervariant, 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-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.100.1
Release v0.100.1
Fixed
- TypeScript class methods not extractable by name —
reveal file.ts methodNamealways failed with "Element not found" for class methods._get_node_namedidn't includeproperty_identifierin its direct-child name lookup; TypeScriptmethod_definitionnodes useproperty_identifierfor the method name (vs plainidentifierfor standalone functions). One-word fix;method_definitionwas already inFUNCTION_NODE_TYPES. +2 tests (TS + TSX).
Install/Upgrade:
pip install --upgrade reveal-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.100.0
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
.pyfiles 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_PATTERNSduplication that turned out to be dead code (see Refactored). +21 tests. --with-statsfor session listing (BACK-348) —reveal claude:// --with-statsreads 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-statshint appears in the count line. Also fixed a BACK-349 CLI gap:--untilwas missing fromparser.pyanddefaults.pyso the CLI flag had no effect (only?until=query param worked). +13 tests.?until=DATEdate range filtering forclaude://session listings (BACK-349) —?since=2026-06-10&until=2026-06-12now scopes session listing results.?until=todaynormalizes to today's date. +2 tests.- Sub-agent navigation from parent sessions (BACK-347) —
reveal claude://session/<name>/agentsnow 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/fullviews — noise for every human and agent._load_static_helpnow 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
rglobmaterialized the entire.pylist, 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 viaREVEAL_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.pythat print "No structure available" now follow up withHint: reveal <path> --grep 'pattern' | reveal <path> --show-astso users have a clear next step instead of a dead end. +3 test assertions. claude://?summaryrenderer 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 todaywas a silent no-op; microsecond boundary excluded valid files (BACK-364) —--until todaynow normalizes to today's ISO date before comparison (was appendingT23:59:59to the literal string'today', making every file pass). Boundary changed fromT23:59:59toT23:59:59.999999so files modified in the last second of the day are included. Fixed in bothadapter.pyandsessions.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 aThreadPoolExecutorworker (L002 link checks, claude post-process stats), finalizing it off-thread and printingRuntimeError: ... is unsendable, but is being dropped on another thread. Newutils.threadsafe.main_thread_gckeeps 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 owncode_extsset. It now resolves list/set/tuple literals plusfrozenset()/set()/tuple()/list()call-wrappers, counts set/tuple values in lookup-table dicts, and adds aDIRECTORIESclassification so skip-dir lists no longer mislabel asFILE_EXTENSIONS. +8 tests. --with-statsJSONL reads parallelized (BACK-362) — Session stats are now fetched concurrently viaThreadPoolExecutor(max_workers=min(8, N))instead of sequentially, improvingreveal claude:// --with-statsspeed on large session corpora.
Refactored
- Removed dead
_mask_secretsduplication in claude adapter (D005 finding) — D005 flagged_SECRET_PATTERNSduplicated 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_confignever called it, and the BACK-241 handler split copied the dead code forward. No security regression: claude_get_configreturns 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) — AddedCATEGORY='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). Newregistry.get_code_extensions()(frozenset,lru_cache) replaces the 35-entry hardcoded set inis_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/htmlcovwhile another descended into it. A single canonicalSKIP_DIRECTORIESsuperset now lives inreveal.defaultsand 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.pysplit into focused modules (BACK-363) — Extractedschema.py(all_SCHEMA_*constants, 261 lines) andhandlers/post_process.py(all_post_process_*functions +_slice_list, 157 lines).adapter.pyreduced from 1,383 → 1,011 lines (−27%).get_file_blamehelpers 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-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.99.0
Release v0.99.0
Added
claude://session/<name>/prompts— human-typed prompts only (BACK-340) —/userencodes tool-result turns asrole: user, so a session with ~15 real prompts shows ~170 "user" messages. The new/promptsresource filters to messages with at least onetype: textblock, excluding puretool_resultwrappers. Newget_human_prompts()inanalysis/messages.py, dedicated_render_claude_user_promptsrenderer,claude_user_promptsoutput type in the schema./useris unchanged for backward compatibility. (risen-scepter-0614)?snippet=Nfor 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). Threadedwindow_charsthroughsearch_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>/timelinerenderer (BACK-344) —/timelinewas routing correctly toget_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_timelineshows[idx] LABEL msg=N HH:MM previewper event with distinct formatting fortool_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>...oraye._parse_jsonl_line_for_titlenow 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_titlenow scans assistant Bash calls forsession badge "..."and returns it when present — the listing path is now badge-aware, matching the detail view. (risen-scepter-0614) - claude://
/thinkingemitted noise for encrypted sessions (BACK-345) — Recent Claude Code versions write thinking blocks with an emptythinking: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://
/messagesundiscoverable — missing from schema elements and help (BACK-346) —/messagesis 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. Addedmessagesandpromptsto_SCHEMA_ELEMENTSwith descriptions; added/messagesexample entry to both query lists. (prairie-squall-0614)
Tests
- +30 tests in
tests/test_claude_adapter_gaps.py—TestGetHumanPrompts(7),TestPromptsRoute(3),TestParseJsonlLineForTitleXmlSkip(6),TestParseJsonlLineForTitleMinLength(5),TestScanJsonlForTitleBadge(4),TestSnippetWindowParam(5). Full suite: 8951 passed, 22 skipped. (risen-scepter-0614) - +18 tests —
TestBack344TimelineRenderer(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=DATErange filter. Seeinternal-docs/feedback/CLAUDE_ADAPTER_RESOURCE_AUDIT_2026-06-14.md.
Install/Upgrade:
pip install --upgrade reveal-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.98.0
Release v0.98.0
Fixed
- Zig: doubled function names in display —
_build_function_signaturereturned"sin(value)"but the display layer rendersf"{name}{signature}", producingsinsin(value). Changed to return params only:"(value)"or""for zero-param functions. (hehacapo-0613) - Zig: named extraction failing —
reveal file.zig funcnameraised an error because baseextract_elementsearches Python/Go/Rust node type names, none of which match Zig'sDecl/FnPrototree. AddedZigAnalyzer.extract_elementoverride walkingDeclnodes. Verified against/opt/zig/lib/std/math.zig. (hehacapo-0613) reveal check/hotspotshang on non-Python projects — BACK-338 — Three layered defects in I002's_find_project_rootcaused the import-graph build to scan the entire filesystem when a stray ancestor__init__.pyexisted above a non-Python project. (A) Pass-2__init__.pywalk 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_preloadwas unconditional — now skips the import-graph build when I002 is not in the effective rule set (e.g.--select C901). Hardening:_collect_raw_importsaborts to an empty graph + logged WARNING pastREVEAL_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 tests —
TestI002ProjectRootBACK338(8 tests) intest_rules.py; Defect C + preload-signature tests intest_file_checker.py; Zig display and named-extraction tests intest_zig_analyzer.py. Full suite: 8921 passed, 22 skipped. (hehacapo-0613)
Install/Upgrade:
pip install --upgrade reveal-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.97.0
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=TERMfilters 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-3 —
claude://schema gains?params,?last,?tool,?turns,?sincequery parameters;help://decision_tree and recipes entries guide agents to the right resource for common tasks;MCP_SETUP.mdcross-resource workflow examples;README.mdAI agents section;AGENT_HELP.mdcodex row added. 17 new tests across claude adapter schema parity and help registry. (roaring-tide-0524)
Fixed
codex://Path(None) crash —dict.get('key', default)returnsNone(not default) when the key is present with a NULL SQLite value;rollout_pathcolumn is sometimes NULL, causingPath(None)TypeError. Fixed with explicitNonecheck. (roaring-tide-0524)help://cli_flags renderer dropping descriptions — Sprint 1-3 changedcli_flagsfrom list to dict;_render_schema_cli_flagswas iterating dict keys, silently dropping all flag descriptions. Fixed by iterating.items(). (roaring-tide-0524)codex://grand_totaltokens using per-request delta —grand_totalwas reading last-turn per-request usage delta instead of cumulative session total. Addedget_grand_total_tokens()toanalysis/messages.py. (roaring-tide-0524)codex://tokens_used == 0falsy guard —tokens_used or jsonl_totalsilently replaced a legitimate0with the JSONL total. Changed tois not Noneguard. (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 inoverview.py,messages.py,timeline.py; explicitlasttyping in_parse_token_usage;Callableannotation on dynamic dispatch inadapter.py; removed dead# type: ignoreinhandlers/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-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md
v0.96.1
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_pathinrouting/file.pyunconditionally treated--typeas 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 likeclass,function) still route to the AST handler as before. Combination--name Foo --type functionalso continues to work —--namepresence always triggers AST routing.
Install/Upgrade:
pip install --upgrade reveal-cliDocumentation: https://github.com/Semantic-Infrastructure-Lab/reveal
Full Changelog: https://github.com/Semantic-Infrastructure-Lab/reveal/blob/master/CHANGELOG.md