All notable changes to xpp-lens (called xpp-graft up to 1.2.0). Versions follow <Version> in
src/XppLens/XppLens.csproj; release tags are vX.Y.Z.
- Updating no longer needs Claude to be closed. The installer does not stop running
xpplens.exeprocesses any more: a file in use is renamed to*.old, so open sessions keep working on the old version and new sessions start the new one; the next start of xpplens deletes the leftovers. At the end the installer offers to restart Claude Desktop;xpplens update --install --restart-claude(install.ps1 -RestartClaude) does it without asking. Claude Code processes in terminals are never stopped. xpp_grepaccepts several names separated by;inobjectNameandmodel, like the other tools. The answer for standard code without a scope, or with too large a scope, points toxpp_refs/xpp_callersfor names.- The release package stores its paths with
/, as the ZIP format requires. - GitHub Actions:
actions/checkoutv7 andactions/setup-dotnetv6 (Node 24).
- Command line options:
-installwas silently ignored (only--installwas known), soxpplens update -installonly checked for the update. Options now work with one or two dashes and as--name=value, may come before the arguments, and an unknown option or a missing value stops with an error that lists the options of the command.
xpp_build_errorsreads the result of a Visual Studio project build (BuildProjectResult.xml) next to that of the model build. The header shows both build times and the time of the model DLL. Diagnostics of the newer build come first and replace those of the model build for the same objects.xpp_build_errorslists the objects changed after the newest build, which are not compiled yet. After a project build it also lists the objects changed between the model build and the project build, which are compiled only if they are in the project. This answers "did my build take everything?" in one call.xpp_changed since=build(xpplens changed --since build): per package, the objects changed after its last build.
xpplens status/xpp_statusstart with the xpp-lens version (and an available update) and show the index tiers and counts as tables. The console gets box-drawing frames; output redirected to a file or a pipe, or--ascii, gets+-|frames;xpp_statusreturns Markdown tables. Numbers are grouped by thousands; long model lists come last.
- After a project build,
xpp_build_errorsshowed the older model build as the latest result. Objects changed after the build were marked only when they had a diagnostic; with a clean build they were not mentioned at all.
xpp_build_errorspointed at wrong lines: the compiler numbers lines through the object's whole code (the declaration without its closing brace, then every method in file order), not from the start of the method. Lines are now translated that way and accepted only when they fall into the method the compiler named. Metadata diagnostics (form designs, controls, form extensions) show the object's file and the element instead of a raw path. Methods of form data sources and controls show where the method starts; their exact line is not mapped yet.
xpplens updatechecks GitHub for a newer release;xpplens update --installdownloads it, verifies its SHA-256 digest and runs its installer, keeping settings and index.statusmentions an available update found by the last check. This is the only network access of xpp-lens and happens only when the command is run.- Automated releases: pushing a tag
vX.Y.Zruns the tests, checks the tag against the project version, builds the package and publishes the release with its notes taken from this file (release-notes.ps1). - Continuous integration: GitHub Actions builds the solution and runs the tests on Windows for every push and pull request.
SECURITY.mdand issue forms for bug reports and feature requests, which ask not to share customer code or data.
xpplens status/xpp_statusno longer count all references and labels (tens of seconds on a cold disk);--counts/counts=trueshows them. A standard tier that is listed but not indexed is explained, with the command that indexes it.xpplens build --std-onlyswitchesindexStandardon when an installation was made without the standard tier.- Running
install.ps1over an existing installation keeps its label languages andPackagesLocalDirectoryunless-Languages/-PackagesDirare given.
- Taking over an xpp-graft installation could leave the index behind and build a new one from scratch. The index
files are now moved one by one by
xpplens migrateand checked; when they cannot be moved (in use, or the new folder already holds an index) the new configuration keeps using the old index where it is.
- Renamed from xpp-graft to xpp-lens, to avoid confusion with the unrelated
Graft project. Program
xpplens.exe, MCP serverxpp-lens, configurationxpplens.json, default foldersC:\Tools\xpp-lensand%LOCALAPPDATA%\xpp-lens, environment variablesXPPLENS_CONFIG/XPPLENS_VERBOSE/XPPLENS_TIMING/XPPLENS_USAGE. The MCP tool names (xpp_find, …) are unchanged. install.ps1takes over an existing xpp-graft installation: settings (incl. label languages), the index and the usage log move over without a rebuild, and the old MCP entries are removed. The old folder is left for you to delete.- Release packages are named after the version (
xpp-lens-1.2.1.zip).
- Usage statistics: every MCP call is logged locally (
%LOCALAPPDATA%\xpp-graft\usage);xppgraft statsshows tokens, time and empty answers per tool, the largest and slowest calls and the latest empty answers.xppgraft config --usage-log falseswitches it off. - Several lookups in one call:
xpp_findandxpp_objecttake names separated by;;xpp_methodtakesmethod="a;b"orobjectName="Obj.method;Obj2::method". - Method fragments:
xpp_methodwithmatch(regex) and/orlinesreturns only those lines with context, numbered with file lines; the signature and variable declarations are always included, skipped parts are marked. Long methods returned in full carry a hint about it. - Callers inside Microsoft code: the standard tier now stores call references (calls,
new, intrinsics) —xpp_callerslists them after custom code;standard=falseleaves them out. About +300 MB of index;xppgraft config --standard-code falsekeeps the old dictionary-only standard tier. - Chained calls:
Table::find(x).method(),a.b().c(),new T().m()andvar x = A::b()are typed from method return types — inxpp_callers,xpp_refs(withmember) andxpp_callees. - New tools:
xpp_scaffold— CoC wrapper (exact signature, default values removed, warnings for private / final / non-wrappable methods), table / form / data source / control / field event handlers with parameters learned from existing handlers, delegate subscribers, pre/post handlers; class names follow the pattern found in your models.xpp_build_errors— errors and warnings fromBuildModelResult.xmlmapped to XML file lines, flags files changed after the build.xpp_security— menu item / form → privileges (granted access) → duties → roles, and privilege / duty / role views.xpp_join— shortest relation path between two tables as a ready X++ join.xpp_entity— data entity overview (public names, staging, data source tree with joins, field mapping, keys) or the entities that use a table.xpp_changed— objects changed on disk since a time, per model.
- Matching CLI commands:
scaffold,build-errors,security,join,entity,changed,stats;method --match/--lines/--context,callers --standard false. - xUnit test project (
tests/XppGraft.Tests) with neutral sample AOT XML; runs in Visual Studio Test Explorer or withdotnet test. - Visual Studio launch profiles for the new commands.
- Analyzer upgrades re-parse custom models once at start-up and re-index the standard tier once in the background, package by package (an interrupted run resumes) — no manual rebuild after updating.
- Parser: data entity keys, query / entity data source joins (
on Field=DataSource.Field) and data source tree, privilege entry point grants (grant=Read,Update,…). - Tool descriptions no longer contain installation-specific examples.
- The release package also ships
CHANGELOG.mdandLICENSE;build.ps1 -Testruns the tests before building. - The WAL file is trimmed after checkpoints (
journal_size_limit), so a large rebuild does not leave it at peak size.
First published release, under the MIT License.
- Three index tiers: custom models (full code references), Microsoft standard (dictionary), compiled-only packages
(from
.xref,bin\*.mdand resource DLLs);xpp_statuslists packages on disk that are not indexed. - Tools:
xpp_find,xpp_object,xpp_method,xpp_callers,xpp_callees,xpp_refs,xpp_extensions,xpp_grep,xpp_label,xpp_status. - Control and menu trees with
parent/depth/filter, full control paths, ReferenceField / ReplacementFieldGroup, menu extension parent and position. - Literal underscore in name searches; dotted extension names (e.g.
*Staging.Contoso) found as objects. - Index follows the files on disk (watcher + periodic scan); read-only index detection with live parsing.
- Portable installer / uninstaller, configurable languages, models and
PackagesLocalDirectory(given or detected).