Skip to content

Releases: Semantic-Infrastructure-Lab/reveal

v0.83.0

22 Apr 00:30

Choose a tag to compare

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__.py excluded), 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-up reveal commands dynamically based on findings — closes the agent loop. --format json emits {path, facts{entry_points, core_abstractions, components, circular_groups}, risks[], next_commands[]}. --no-imports skips graph analysis. --top N controls per-section limits. Works on subdirectories. 56 new tests. (BACK-211)


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.81.0

20 Apr 05:17

Choose a tag to compare

Release v0.81.0

Added

  • --boundary composite nav flagcollect_boundary() composes collect_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_nav MCP 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 via flag string param; value-taking flags via flag_value. _NAV_BOOLEAN_FLAGS frozenset is the extension point — future boolean nav flags require zero MCP changes. 9 new tests. (BACK-204)
  • --format json for all nav flags_nav_json() helper in file_handler.py emits {meta, findings, warnings} envelope. All 12 nav dispatch blocks branch on output_format == 'json'. Consistent findings shapes across all flags; varflow event node field stripped (raw AST Node, not serializable). 13 new tests. (BACK-202)
  • --sideeffects and --returns nav flags--sideeffects classifies calls into db/http/cache/log/file/sleep/hard_stop categories. --returns shows return/exit paths with gate chains. Both work on Python and PHP. (BACK-199, BACK-200)

Fixed

  • PHP --varflow tracking — 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_structure and reveal_query MCP tools off _capture()reveal_structure directory case now calls show_directory_tree() directly. File case and reveal_query use _run_and_capture(), a lock-free replacement. Global _capture_lock and threading import removed. All 5 MCP tools now off the global-lock capture helper. (BACK-193)


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.80.0

18 Apr 05:07

Choose a tag to compare

Release v0.80.0

Fixed

  • help://schemas --format=json now returns structured listing — bare help://schemas with --format=json previously returned {"error": "No adapter specified"}. Now returns {"type":"adapter_schema","available_adapters":[...],"usage":"..."}. Text rendering unchanged. (BACK-188)
  • claude:// help text shows all URI formshelp://claude and help://adapters previously showed only claude://session/{name}. Now documents all 10 forms: bare listing, ?search=, session-scoped, info, config, history, plans, memory, agents, hooks. (BACK-190)
  • depends:// missing from help://relationships cluster — adapter was registered but absent from all clusters, causing the dynamic count to read 22 instead of 23. Added to Code Analysis cluster with imports↔depends pair. (BACK-189)
  • Hardcoded "22 adapters" in mcp_server.py and MCP_SETUP.md — updated to 23. (BACK-189)
  • review.py subprocess calls replaced with direct internal API_run_check, _run_hotspots, _run_complexity, _run_diff previously shelled out to reveal via subprocess. Now call _check_files_json, StatsAdapter, AstAdapter, DiffAdapter directly. Also fixed latent bug: _run_check was calling data.get('violations', []) but reveal check --format=json emits {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_json call. Violations serialized to human-readable text at the MCP boundary. No global lock, no stdout redirection, no SystemExit catching. 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_contents directly. 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() — calls get_analyzer + _parse_element_syntax + _extract_by_syntax directly; formats result dict at the MCP boundary. No global lock, no stdout redirection. 3 of 5 MCP tools now use direct APIs; only reveal_structure and reveal_query remain 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 the Matched: N of M files pattern already used by markdown://. (BACK-191b, M1)
  • --outline shows section size in lines for markdown headings — each heading in reveal file.md --outline now shows , N lines after 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,f2 param adds frontmatter columnsreveal 'markdown://primitives/?type=framework&fields=book,cohort' appends book=X cohort=Y inline 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 rulereveal reveal:// --check now flags any registered public adapter missing a guide file in docs/adapters/. Prefix-matched (NGINX_GUIDE.md satisfies nginx://). Exempts help://, demo, test. 7 tests. (BACK-191)
  • AUTOSSL_ADAPTER_GUIDE.md — static guide for autossl:// 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 --user workflow, domain history, JSON output, combos with ssl:///nginx:///cpanel:///letsencrypt://. reveal reveal:// --check now fully clean (0 V024 violations). (BACK-192)

Maintenance

  • I002 circular dependency ceiling documentedreveal check reveal/ --select I002 --format json baseline is 23 violations. Added to RELEASING.md pre-flight checklist. CI gate was evaluated and removed (12.5 min runtime). (BACK-183)
  • utils/query.py (762 lines) split into 3 focused modulesquery_parser.py (coerce/parse/QueryFilter), query_eval.py (compare_values/apply_filter), query_control.py (ResultControl/sort/budget). query.py is now a re-export shim; all 24 import sites unchanged. (BACK-184)
  • treesitter.py complexity metrics extracted_calculate_complexity_and_depth (79 lines, pure node function) moved to reveal/complexity.py as a standalone function. _calculate_complexity and _get_nesting_depth on TreeSitterAnalyzer become thin wrappers. (BACK-187)
  • adapters/ast/nav.py (1068 lines) split into 4 modulesnav_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.py is 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-cli

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

v0.79.0

14 Apr 09:39

Choose a tag to compare

Release v0.79.0

Breaking Changes

  • --domain renamed to --server-name for nginx--domain previously meant two unrelated things: filter markdown/HTML links by domain, and filter nginx server blocks by server_name. These are now separate flags. --domain unchanged for link filtering; --server-name DOMAIN is the new flag for nginx file analysis. (BACK-173)
  • --quiet alias removed from --no-breadcrumbs--quiet implied global quiet mode but only suppressed breadcrumbs; removed to avoid confusion. -q shorthand 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-failures all work. Enables per-URI option control in batch/pipeline workflows. CLI flags still work. (BACK-164, BACK-165, BACK-170, BACK-175)
  • help://ux guide — 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/--tail vs ?limit=/?offset= semantic difference, and the progressive escalation pattern. Accessible as reveal help://ux. (turbulent-wind-0413)
  • cli_only_flags in --discover schemamysql://, domain://, and sqlite:// 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 --sort only injects when URI has no sort param. (BACK-167)
  • domain:// and nginx:// 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 renameuri_query_paramsquery_params for consistency with all other adapters. (BACK-167)
  • --help group 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.
  • autossl and letsencrypt get_help() migrated to YAML — consistent with mysql/ssl/sqlite; includes query_params section and URI param examples. reveal help://autossl and reveal help://letsencrypt now 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: --sort dedup regression (v0.78.2)
  • 12 new tests: TestAutosslGetHelp + TestLetsEncryptGetHelp YAML structure pins


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.78.0

14 Apr 04:56

Choose a tag to compare

Release v0.78.0

Added

  • --around N: verbatim context centered on a linereveal file.py :123 --around prints ±20 lines (default) around the target with a pointer. --around 10 adjusts the window. Eliminates the mental arithmetic of manually computing a line range. Requires a :LINE element; errors with a clear message otherwise.
  • --ifmap: branching skeleton for a line rangereveal file.php :878-2130 --ifmap shows 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 --ifmap but filtered to TRY/CATCH/EXCEPT/FINALLY keywords. Equivalent to probe catchmap.
  • --exits: exit-node listreveal file.php :657-2200 --exits collects all return/raise/throw/break/continue nodes in a range, plus die()/exit() language-construct calls (for PHP). Returns kind, line, and first-line text for each.
  • --flowto: exit-node list + reachability verdict — Same output as --exits plus a verdict line: ✓ CLEAR (no exits), ~ CONDITIONAL (only break/continue), ⚠ BLOCKED (hard return/raise/exit). Equivalent to probe flowto.
  • --deps: refactoring pre-flight — variables flowing inreveal file.php :1136-1463 --deps identifies 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 afterreveal file.php :1136-1463 --mutations identifies 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 --varflow and --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-RANGE element falls back to root_node instead of erroring; (b) omitting the element entirely (e.g., reveal file.php --varflow errormsg) synthesizes :1-N covering the whole file. The nav.py functions already accepted any tree-sitter node — the limitation was purely in the CLI dispatch layer (file_handler.py).

Changed

  • --calls is 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 detection
  • TestRenderExits (8) — empty, formatted, verdict variants (CLEAR/CONDITIONAL/BLOCKED)
  • TestRenderBranchmap (4) — empty, formatted, single-line range, depth indentation
  • TestAllVarFlow (6) — dict return, known vars, event format, range limits, sorted events, root-node acceptance
  • TestCollectDeps (8) — required fields, sorted order, param detection, non-param exclusion, write info, no-deps case, range limit
  • TestCollectMutations (7) — required fields, sorted order, result detection, after-write ordering, no-mutations case, range limit
  • TestRenderDeps (4) — empty, dep without write, dep with write, multiple deps
  • TestRenderMutations (3) — empty, single, multiple
  • TestIfmapCatchmapFiltering (4) — keyword exclusion for ifmap/catchmap, depth preservation, render output
  • TestFlatFileFallback (7) — all six nav functions accept root_node as scope_node
  • TestCollectIdentifierNames (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_mutations
  • reveal/cli/parser.py — 7 new flags: --around, --ifmap, --catchmap, --exits, --flowto, --deps, --mutations; --calls changed to nargs='?'
  • 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 updated
  • tests/adapters/test_ast_nav_probe_features.py — new test file, 68 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.77.1

12 Apr 01:29

Choose a tag to compare

Release v0.77.1

Fixed

  • ssl:// --check --probe-http was silently ignoredprobe_http was missing from _build_check_kwargs in cli/routing/uri.py, so the flag was parsed by argparse but never forwarded to SSLAdapter.check(). The redirect check produced no output and no change in exit code. Fixed by adding add_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.py had inputs for the wrong violations (flake8 equivalents: None comparison, mutable defaults, unused loop vars) instead of the actual rules (@staticmethod+self, oversized @property, @property without return). All three only asserted isinstance(list) so they always passed. Replaced with correct detection and allows tests. B001 vacuous isinstance check tightened to assert count.
  • Tautological tests removed across 5 files — deleted 13 *_exist/*_types tests in test_defaults.py, 4 redundant top-level import tests, 3 wrong initialization tests, 1 mock-only test, 1 no-assertion test; test_env_overrides_count tightened from >= 6 to == 6; public API used instead of internal _ADAPTER_REGISTRY dict.

Net: -97 lines of test code, 7662 passing.



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.77.0

12 Apr 00:46

Choose a tag to compare

Release v0.77.0

Added

  • ssl:// --check --probe-http: HTTP→HTTPS redirect is now a first-class check item — Previously --probe-http was silently ignored when combined with --check (the routing layer exited early for check mode). Now SSLAdapter.check() accepts probe_http=True and passes it to check_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-http continues 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 discarded ssock.cipher(). Now captures cipher name and bits; message format: Using TLSv1.3 / TLS_AES_256_GCM_SHA384 (256-bit) (recommended). Fields cipher_name and cipher_bits added to check result for JSON consumers.

Documentation

  • ssl.yaml: --probe-http added to flags, cli_flags, examples (standalone + combined with --check), new "Full TLS + Redirect Audit" workflow, two new anti-patterns, --advanced description 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-cli

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

v0.76.2

11 Apr 02:01

Choose a tag to compare

Release v0.76.2

Changed

  • autossl://DOMAIN row cap — output capped at 20 most recent rows by default; --all flag 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://DOMAIN richer summary line — always shows ✅ 0 ok even when zero; the zero-ok count is the key signal for chronic failures. Other buckets shown only when non-zero. Also now counts dcv_failed entries (tls_status=None + impediments) in the summary dict.
  • autossl://DOMAIN failing-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-cli

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

v0.76.1

11 Apr 01:10

Choose a tag to compare

Release v0.76.1

Fixed

  • autossl://DOMAIN renderer crash on None tls_status_render_domain_history now uses the same tls_status or dcv_failed/unknown fallback as _render_domain_table. Triggered on real gateway data where dcv_failed domains have tls_status: None. 1 new test.


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.76.0

11 Apr 00:59

Choose a tag to compare

Release v0.76.0

Added

  • BACK-144: autossl://DOMAIN domain 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_string detects dots to distinguish domain names from timestamps. New _domain_history_structure method, autossl_domain_history output type, _render_domain_history table renderer (run | user | status | expiry | detail). get_schema and get_help updated with new URI syntax, output type schema, and examples. 13 new tests in TestAutosslDomainHistory. 7,666 passing.


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