Releases: Semantic-Infrastructure-Lab/reveal
v0.83.0
Release v0.83.0
Added
reveal architecture <path>— new subcommand for targeted architectural briefings. Answers "what do I need to know before editing this directory?" Composes entry points (fan-in=0, active, sorted by fan-out), core abstractions (top fan-in,__init__.pyexcluded), component cohesion map, circular dependency groups, and derived risks into one output. Risks section surfaces: circular groups (severity high >10 files / medium otherwise), high-complexity entry points (cx ≥ 20), and load-bearing files (fan-in ≥ 8, top 5). Next Commands section generates follow-uprevealcommands dynamically based on findings — closes the agent loop.--format jsonemits{path, facts{entry_points, core_abstractions, components, circular_groups}, risks[], next_commands[]}.--no-importsskips graph analysis.--top Ncontrols per-section limits. Works on subdirectories. 56 new tests. (BACK-211)
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.81.0
Release v0.81.0
Added
--boundarycomposite nav flag —collect_boundary()composescollect_deps+collect_effects, splits PHP superglobals ($_GET,$_POST,$_SESSION,$_SERVER,$_FILES,$_COOKIE,$_ENV,$GLOBALS,$_REQUEST) into a separate ENVIRONMENT section. Emits three sections: INPUTS / ENVIRONMENT / EFFECTS. ENVIRONMENT omitted when empty. 21 new tests. (BACK-201)reveal_navMCP tool — single MCP tool routing all nav flags (--outline,--around,--scope,--ifmap,--catchmap,--exits,--flowto,--varflow,--deps,--mutations,--sideeffects,--returns,--boundary) to agents. Boolean flags viaflagstring param; value-taking flags viaflag_value._NAV_BOOLEAN_FLAGSfrozenset is the extension point — future boolean nav flags require zero MCP changes. 9 new tests. (BACK-204)--format jsonfor all nav flags —_nav_json()helper infile_handler.pyemits{meta, findings, warnings}envelope. All 12 nav dispatch blocks branch onoutput_format == 'json'. Consistent findings shapes across all flags;varfloweventnodefield stripped (raw AST Node, not serializable). 13 new tests. (BACK-202)--sideeffectsand--returnsnav flags —--sideeffectsclassifies calls into db/http/cache/log/file/sleep/hard_stop categories.--returnsshows return/exit paths with gate chains. Both work on Python and PHP. (BACK-199, BACK-200)
Fixed
- PHP
--varflowtracking — PHP variable flow was not correctly tracking assignments through certain PHP-specific constructs. Fixed; all variable-tracking flags now work on PHP as well as Python. (BACK-203)
Maintenance
reveal_structureandreveal_queryMCP tools off_capture()—reveal_structuredirectory case now callsshow_directory_tree()directly. File case andreveal_queryuse_run_and_capture(), a lock-free replacement. Global_capture_lockandthreadingimport removed. All 5 MCP tools now off the global-lock capture helper. (BACK-193)
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.80.0
Release v0.80.0
Fixed
help://schemas --format=jsonnow returns structured listing — barehelp://schemaswith--format=jsonpreviously returned{"error": "No adapter specified"}. Now returns{"type":"adapter_schema","available_adapters":[...],"usage":"..."}. Text rendering unchanged. (BACK-188)claude://help text shows all URI forms —help://claudeandhelp://adapterspreviously showed onlyclaude://session/{name}. Now documents all 10 forms: bare listing,?search=, session-scoped,info,config,history,plans,memory,agents,hooks. (BACK-190)depends://missing fromhelp://relationshipscluster — adapter was registered but absent from all clusters, causing the dynamic count to read 22 instead of 23. Added to Code Analysis cluster withimports↔dependspair. (BACK-189)- Hardcoded "22 adapters" in
mcp_server.pyandMCP_SETUP.md— updated to 23. (BACK-189) review.pysubprocess calls replaced with direct internal API —_run_check,_run_hotspots,_run_complexity,_run_diffpreviously shelled out torevealvia subprocess. Now call_check_files_json,StatsAdapter,AstAdapter,DiffAdapterdirectly. Also fixed latent bug:_run_checkwas callingdata.get('violations', [])butreveal check --format=jsonemits{files, summary}, so checks always returned[]. (BACK-181)reveal_check()MCP tool no longer uses_capture()— replaced_capture(run_check, args)with direct_check_files_jsoncall. Violations serialized to human-readable text at the MCP boundary. No global lock, no stdout redirection, noSystemExitcatching. Proof-of-concept for BACK-182; remaining 4 MCP tools need display-layer structured returns before the same refactor applies. (BACK-182 partial)reveal_pack()MCP tool no longer uses_capture()— calls_parse_budget,_get_changed_files,_collect_candidates,_apply_budget,_collect_file_contentsdirectly. Content and file listing rendered as text at the MCP boundary. No global lock, no stdout capture. (BACK-193 partial)reveal_element()MCP tool no longer uses_capture()— callsget_analyzer+_parse_element_syntax+_extract_by_syntaxdirectly; formats result dict at the MCP boundary. No global lock, no stdout redirection. 3 of 5 MCP tools now use direct APIs; onlyreveal_structureandreveal_queryremain on_capture(). (BACK-182 partial)
Added
- Section extraction: match count prefix for multi-section results — when a substring query matches N sections (e.g.,
reveal book.md "CHAPTER"matches 16 headings), output now begins with# N sections matched "QUERY" — showing all. Mirrors theMatched: N of M filespattern already used bymarkdown://. (BACK-191b, M1) --outlineshows section size in lines for markdown headings — each heading inreveal file.md --outlinenow shows, N linesafter the line number (e.g.,THE KERNEL (file.md:1347, 153 lines)). Size is computed via_section_end— spans all content including sub-headings. Mirrors the[N lines, depth:M]already shown for code elements. (BACK-191c, M2)markdown://listing:?fields=f1,f2param adds frontmatter columns —reveal 'markdown://primitives/?type=framework&fields=book,cohort'appendsbook=X cohort=Yinline on each result row. Fields missing from a file's frontmatter are silently omitted. Combines with all existing filters. (BACK-191d, M3)- Section extraction: short-result warning with next-section hint — when a single section returns ≤ 5 lines and a next heading follows immediately, stderr shows
⚠ Short result (N lines) — this section may be a label only. Next section: NAME (line L). Turns a dead end into a navigable suggestion. (BACK-191e, M4) - V024: Adapter guide coverage rule —
reveal reveal:// --checknow flags any registered public adapter missing a guide file indocs/adapters/. Prefix-matched (NGINX_GUIDE.md satisfies nginx://). Exempts help://, demo, test. 7 tests. (BACK-191) AUTOSSL_ADAPTER_GUIDE.md— static guide forautossl://adapter. Covers defect codes (SELF_SIGNED_CERT, CERT_HAS_EXPIRED, etc.), DCV impediment codes (TOTAL_DCV_FAILURE, DNS_RESOLVES_TO_ANOTHER_SERVER, etc.), shared-host--userworkflow, domain history, JSON output, combos withssl:///nginx:///cpanel:///letsencrypt://.reveal reveal:// --checknow fully clean (0 V024 violations). (BACK-192)
Maintenance
- I002 circular dependency ceiling documented —
reveal check reveal/ --select I002 --format jsonbaseline is 23 violations. Added toRELEASING.mdpre-flight checklist. CI gate was evaluated and removed (12.5 min runtime). (BACK-183) utils/query.py(762 lines) split into 3 focused modules —query_parser.py(coerce/parse/QueryFilter),query_eval.py(compare_values/apply_filter),query_control.py(ResultControl/sort/budget).query.pyis now a re-export shim; all 24 import sites unchanged. (BACK-184)treesitter.pycomplexity metrics extracted —_calculate_complexity_and_depth(79 lines, pure node function) moved toreveal/complexity.pyas a standalone function._calculate_complexityand_get_nesting_depthonTreeSitterAnalyzerbecome thin wrappers. (BACK-187)adapters/ast/nav.py(1068 lines) split into 4 modules —nav_outline.py(element_outline, scope_chain),nav_varflow.py(var_flow, _walk_var),nav_calls.py(range_calls),nav_exits.py(collect_exits, collect_deps, collect_mutations).nav.pyis now a re-export shim. Cross-module deps explicit: nav_exits imports from nav_calls and nav_varflow. (BACK-185)
Docs
- RECIPES.md major expansion — added "Start Here: Distinctive Capabilities" orientation section, "Large-Function Navigation" (all nav flags:
--outline,--around,--scope,--ifmap,--catchmap,--exits,--flowto,--varflow,--deps,--mutations), "Spreadsheet & BI Inspection" (xlsx/PowerPivot/PowerQuery), "Inspect Claude Install State" (claude://info/config/history/plans/memory/agents/hooks), and "Cross-adapter orientation". All examples validated at runtime.
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.79.0
Release v0.79.0
Breaking Changes
--domainrenamed to--server-namefor nginx —--domainpreviously meant two unrelated things: filter markdown/HTML links by domain, and filter nginx server blocks byserver_name. These are now separate flags.--domainunchanged for link filtering;--server-name DOMAINis the new flag for nginx file analysis. (BACK-173)--quietalias removed from--no-breadcrumbs—--quietimplied global quiet mode but only suppressed breadcrumbs; removed to avoid confusion.-qshorthand retained. (BACK-178)demo://removed from public adapter registry — scaffolding template only; was never intended as a user-facing adapter.demo://no longer appears in--adapters. File remains as a developer reference. (BACK-177)
Added
- URI query param support for
ssl://,cpanel://,letsencrypt://,autossl://— adapter-specific options now travel with the URI.ssl://host?expiring-within=30,cpanel://USER/ssl?dns-verified,letsencrypt://?check-orphans,autossl://latest?only-failuresall work. Enables per-URI option control in batch/pipeline workflows. CLI flags still work. (BACK-164, BACK-165, BACK-170, BACK-175) help://uxguide — new static guide covering the CLI-vs-URI mental model: when to use file paths vs URIs, CLI flags vs query params, the--search=?name~=rename,--head/--tailvs?limit=/?offset=semantic difference, and the progressive escalation pattern. Accessible asreveal help://ux. (turbulent-wind-0413)cli_only_flagsin--discoverschema —mysql://,domain://, andsqlite://schemas now expose adapter-specific CLI flags (check-mode flags that can't be URI query params) to AI agents via--discover. (BACK-175)
Fixed
--sort+?sort=duplicate injection — URI-explicit sort takes precedence; CLI--sortonly injects when URI has no sort param. (BACK-167)domain://andnginx://URI query string stripping — bare query params on adapters that don't support them no longer cause confusing DNS errors; both adapters strip?...and warn to stderr. (BACK-171)- cpanel
get_schema()key rename —uri_query_params→query_paramsfor consistency with all other adapters. (BACK-167) --helpgroup label taxonomy — all 12 argument groups now show scope tier ([global — ...],[file-specific — ...],[adapter-specific — ...],[universal — ...]). Previously 6 of 12 groups had no scope hint.autosslandletsencryptget_help()migrated to YAML — consistent with mysql/ssl/sqlite; includesquery_paramssection and URI param examples.reveal help://autosslandreveal help://letsencryptnow show current examples.- Various doc and schema fixes:
QUERY_PARAMETER_REFERENCE.md,LETSENCRYPT_ADAPTER_GUIDE.md,AGENT_HELP.md,INDEX.md,SCAFFOLDING_GUIDE.md,ADAPTER_CONSISTENCY.md.
Tests (+33 since v0.78.0)
- 8 new tests:
TestAutosslQueryParams - 10 new tests: letsencrypt/cpanel/domain URI param coverage (v0.78.3)
- 3 new tests:
--sortdedup regression (v0.78.2) - 12 new tests:
TestAutosslGetHelp+TestLetsEncryptGetHelpYAML structure pins
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.78.0
Release v0.78.0
Added
--around N: verbatim context centered on a line —reveal file.py :123 --aroundprints ±20 lines (default) around the target with a▶pointer.--around 10adjusts the window. Eliminates the mental arithmetic of manually computing a line range. Requires a:LINEelement; errors with a clear message otherwise.--ifmap: branching skeleton for a line range —reveal file.php :878-2130 --ifmapshows only IF/ELIF/ELSE/SWITCH nodes from--outline's output, filtered by keyword. Works on named functions (reveal file.py myfunc --ifmap) and flat procedural files. Optionally scoped with--range.--catchmap: exception skeleton for a line range — Same as--ifmapbut filtered to TRY/CATCH/EXCEPT/FINALLY keywords. Equivalent toprobe catchmap.--exits: exit-node list —reveal file.php :657-2200 --exitscollects all return/raise/throw/break/continue nodes in a range, plusdie()/exit()language-construct calls (for PHP). Returns kind, line, and first-line text for each.--flowto: exit-node list + reachability verdict — Same output as--exitsplus a verdict line:✓ CLEAR(no exits),~ CONDITIONAL(only break/continue),⚠ BLOCKED(hard return/raise/exit). Equivalent toprobe flowto.--deps: refactoring pre-flight — variables flowing in —reveal file.php :1136-1463 --depsidentifies variables whose first event in the range is a READ (meaning they were set before the range), making them candidates for function parameters on extraction. Shows first-read line and first-write line (or "never written in range").--mutations: refactoring pre-flight — variables written and read after —reveal file.php :1136-1463 --mutationsidentifies variables written in the range that are read after it — candidates for return values on extraction. Together with--deps, this is a complete function-extraction pre-flight.- Flat-file support for
--varflowand--calls— Previously these two flags required a named function element and failed with "Error: could not find function…" on flat procedural files (PHP, shell scripts, etc.). Now: (a) any:LINE-RANGEelement falls back toroot_nodeinstead of erroring; (b) omitting the element entirely (e.g.,reveal file.php --varflow errormsg) synthesizes:1-Ncovering the whole file. Thenav.pyfunctions already accepted any tree-sitter node — the limitation was purely in the CLI dispatch layer (file_handler.py).
Changed
--callsis now optional-arg (nargs='?') —reveal file.php :477-531 --calls(no range after the flag) uses the element's line range as the scope.reveal file.py myfunc --calls 89-120(explicit range) continues to work unchanged.
Tests (68 new)
TestCollectExits(13) — return/raise/break/continue detection, range filtering, root-node acceptance, die/exit call detectionTestRenderExits(8) — empty, formatted, verdict variants (CLEAR/CONDITIONAL/BLOCKED)TestRenderBranchmap(4) — empty, formatted, single-line range, depth indentationTestAllVarFlow(6) — dict return, known vars, event format, range limits, sorted events, root-node acceptanceTestCollectDeps(8) — required fields, sorted order, param detection, non-param exclusion, write info, no-deps case, range limitTestCollectMutations(7) — required fields, sorted order, result detection, after-write ordering, no-mutations case, range limitTestRenderDeps(4) — empty, dep without write, dep with write, multiple depsTestRenderMutations(3) — empty, single, multipleTestIfmapCatchmapFiltering(4) — keyword exclusion for ifmap/catchmap, depth preservation, render outputTestFlatFileFallback(7) — all six nav functions accept root_node as scope_nodeTestCollectIdentifierNames(4) — identifier discovery, range limiting, frozenset type, empty range
Files Changed
reveal/adapters/ast/nav.py— 8 new functions:collect_exits,_collect_identifier_names,all_var_flow,collect_deps,collect_mutations,render_branchmap,render_exits,render_deps,render_mutationsreveal/cli/parser.py— 7 new flags:--around,--ifmap,--catchmap,--exits,--flowto,--deps,--mutations;--callschanged tonargs='?'reveal/file_handler.py—_has_nav_flag()extended;_dispatch_nav()extended with 6 new branches + Change A (root_node fallback);handle_file()Change B (flat-file element synthesis)reveal/docs/AGENT_HELP.md— nav task section fully rewritten; quick-reference table extended; version history updatedtests/adapters/test_ast_nav_probe_features.py— new test file, 68 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.77.1
Release v0.77.1
Fixed
ssl:// --check --probe-httpwas silently ignored —probe_httpwas missing from_build_check_kwargsincli/routing/uri.py, so the flag was parsed by argparse but never forwarded toSSLAdapter.check(). The redirect check produced no output and no change in exit code. Fixed by addingadd_if_supported('probe_http')alongside the other check kwargs (advanced,validate_nginx,local_certs,expiring_within). Regression test added:test_routing_passes_probe_http_to_check. Resolves BUG-155.
Tests
- B002/B003/B004 rule tests were entirely wrong — test classes in
test_bug_rules.pyhad inputs for the wrong violations (flake8 equivalents: None comparison, mutable defaults, unused loop vars) instead of the actual rules (@staticmethod+self, oversized@property,@propertywithout return). All three only assertedisinstance(list)so they always passed. Replaced with correct detection and allows tests. B001 vacuousisinstancecheck tightened to assert count. - Tautological tests removed across 5 files — deleted 13
*_exist/*_typestests intest_defaults.py, 4 redundant top-level import tests, 3 wrong initialization tests, 1 mock-only test, 1 no-assertion test;test_env_overrides_counttightened from>= 6to== 6; public API used instead of internal_ADAPTER_REGISTRYdict.
Net: -97 lines of test code, 7662 passing.
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.77.0
Release v0.77.0
Added
ssl:// --check --probe-http: HTTP→HTTPS redirect is now a first-class check item — Previously--probe-httpwas silently ignored when combined with--check(the routing layer exited early for check mode). NowSSLAdapter.check()acceptsprobe_http=Trueand passes it tocheck_ssl_health(), which runs_check_http_redirect()and appends it to the checks list. A failing redirect elevates overall exit code to 2. Redirect check reports full chain, hop count, and final URL.--probe-httpcontinues to work standalone (structure mode) with its security header display (HSTS, CSP, X-Frame-Options, X-Content-Type-Options) unchanged.ssl:// --check --advanced: cipher suite now reported alongside TLS version —_check_tls_version()already opened a live TLS socket but discardedssock.cipher(). Now captures cipher name and bits; message format:Using TLSv1.3 / TLS_AES_256_GCM_SHA384 (256-bit) (recommended). Fieldscipher_nameandcipher_bitsadded to check result for JSON consumers.
Documentation
ssl.yaml:--probe-httpadded to flags, cli_flags, examples (standalone + combined with--check), new "Full TLS + Redirect Audit" workflow, two new anti-patterns,--advanceddescription updated to mention cipher.AGENT_HELP.md: new "Live TLS + redirect checks" block with example output for both features.SSL_ADAPTER_GUIDE.md: Advanced Health Checks section updated for cipher, new "HTTP→HTTPS Redirect Check" section, Version 1.3.0 entry.
9 new tests, 7682 passing.
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.76.2
Release v0.76.2
Changed
autossl://DOMAINrow cap — output capped at 20 most recent rows by default;--allflag bypasses cap. 300-row walls for chronic failures were obscuring the pattern. When truncated, shows "… N older runs not shown (use --all to see full history)".autossl://DOMAINricher summary line — always shows✅ 0 okeven when zero; the zero-ok count is the key signal for chronic failures. Other buckets shown only when non-zero. Also now countsdcv_failedentries (tls_status=None + impediments) in the summary dict.autossl://DOMAINfailing-since line — when ok==0, prints "Failing since: YYYY-MM-DD (oldest available run)" at top of output, derived from the true history floor pre-truncation. Previously required scrolling to the bottom of 300 rows.
6 new tests, 73 autossl tests total, 7,673 total passing.
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.76.1
Release v0.76.1
Fixed
autossl://DOMAINrenderer crash onNonetls_status —_render_domain_historynow uses the sametls_status or dcv_failed/unknownfallback as_render_domain_table. Triggered on real gateway data where dcv_failed domains havetls_status: None. 1 new test.
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.76.0
Release v0.76.0
Added
- BACK-144:
autossl://DOMAINdomain history drill-down — new URI mode that searches all AutoSSL runs for a specific domain and returns its full TLS history across runs. Answers "is this domain always failing or just this run?"_parse_connection_stringdetects dots to distinguish domain names from timestamps. New_domain_history_structuremethod,autossl_domain_historyoutput type,_render_domain_historytable renderer (run | user | status | expiry | detail).get_schemaandget_helpupdated with new URI syntax, output type schema, and examples. 13 new tests inTestAutosslDomainHistory. 7,666 passing.
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