IOCO View for VS Code
An IOCO view in the Explorer for ASP.NET Core solutions. IOCO, Interface Oriented Code
Organization (Darren McLeod's post),
organizes code by the app's public interface: you find and place code by following the URL.
This view shows that interface for any codebase, whatever its folder layout, using the
ioco map --json output from this repository's CLI.
What the view shows
Run IOCO: Show Candidate Affected Endpoints for the active file, or right-click a
file in Explorer, the editor, or the IOCO tree and choose the command. A section above
URLs lists related URL templates and HTTP methods, with every relationship reason
visible below each candidate. Once opened, it follows active file changes and updates
after a successful map refresh. An unmapped file explains how to check dependency depth
and diagnostics. The section always states that file relationships do not prove runtime
impact; an empty lookup does not establish that a file has no impact.
File lookup uses the shared analyzer's schema 1.1 fileEndpoints index, included in the
bundled CLI. With an older CLI override, existing URL navigation still works and the
lookup explains how to upgrade or switch back to the bundled CLI.
IOCO EShopLayered.sln
├─ URLs 18 endpoints
│ ├─ GET / page · Pages/Index
│ ├─ Catalog 2 endpoints
│ └─ Order 4 endpoints
│ └─ Detail › {id?}
│ └─ GET /Order/Detail/{id?} mvc · OrderController.Detail
│ ├─ route source OrderController.cs
│ ├─ route config Program.cs
│ ├─ view NotFound.cshtml, Detail.cshtml
│ ├─ partial view _OrderItems.cshtml
│ ├─ model OrderViewModel.cs, OrderItemViewModel.cs
│ ├─ service IOrderViewModelService.cs
│ └─ service implementation OrderViewModelService.cs
├─ Scatter 6 features
│ └─ Order 10 folders · IOCO folder Order/
│ ├─ Controllers/ OrderController.cs → Order/
│ ├─ Infrastructure/ SmtpEmailSender.cs shared by 3 features (account, Manage, Order)
│ ├─ Interfaces/ IOrderViewModelService.cs used by 2 features (api, Order); rule of three not met
│ └─ src/ApplicationCore/Services/ OrderService.cs in another project
└─ Diagnostics (only when the CLI reports any)
- URLs: the solution's URL tree. Segments lead to endpoints, and each endpoint shows its
kind (page, mvc or minimal api) and its declaration. Under an endpoint, the
files that serve it are grouped by role: route source, route config, handler, view,
partial view, page model, model, service and service implementation. A role this
version doesn't know goes under other. Hover over a file to see why it is included
(the CLI's reasons, with the injection depth for services). Injected types that aren't
in the source are listed under external dependencies.
- Menus and Commands (when the solution has Windows desktop or console projects):
the menu tree of each WinForms or WPF app and the command tree of each command-line app,
shown next to the URL tree rather than merged into it. A menu item is labelled by its
path (
Orders > Export > To CSV) and a command as typed (contoso orders export), with
the framework it was found in (winforms, wpf, system.commandline,
spectre.cli, commandlineparser, mcmaster, cocona, consoleappframework or args) and its handler. Its files are grouped
by role in the same way: the handler is the route source, the .Designer.cs, .xaml or
command setup that declares it is route config, and the forms and windows it opens are views.
Toolbar buttons, context-menu items and WPF ribbon controls (map schema 1.4) appear in the
menu tree under their feature, labelled MainForm toolbar > Print or
Ribbon > Home > Paste, with winforms toolbar button, wpf ribbon control and so on
as their kind. Counts are given by kind (2 menu items, 1 toolbar button). A button or item
that runs the same handler as a menu item is not a second entry. It is listed under that
menu item's also reached from, and selecting it opens its declaration.
A desktop app with no menu is mapped by its windows (map schema 1.4): the startup form or
window and the windows reachable from it are entries of kind winforms window or
wpf window, one per window, each with its own files. The windows that open a window are
listed under its also reached from, and selecting one opens the code that opens it.
- Other (only when needed): endpoints whose organizer this version of the extension doesn't
know (for example from a newer CLI), listed flat so none are silently left out of the map.
- Scatter: for each feature (first URL segment, top-level menu or first command word),
the folders its files live in today. Each file shows
where IOCO would put it:
→ Order/ for a file only this feature uses, ✓ in Order/ when
it's already there, used by 2 features when the rule of three isn't met yet, shared
when three or more features use it, or in another project.
- Diagnostics: projects that failed to load, routes that couldn't be resolved, and so on.
Clicking an endpoint opens its declaration at the right line. Clicking a route source
does the same. Other files open at the top, because the JSON gives no line for them.
Finding the solution
- The
ioco.solutionPath setting (a .sln, .slnx, .csproj, .vbproj or a directory). A relative
path is resolved against the first workspace folder.
- Otherwise, the solution you picked earlier in this workspace.
- Otherwise, a single
.sln in the workspace, or a single .csproj or .vbproj if no solution is found.
- Otherwise, you're asked to pick from the solutions/projects found, or browse. Use
IOCO: Choose Solution… (the folder icon in the view's title bar) to change it later.
Install and map a project
The packaged VS Code extension includes a version-matched, framework-dependent IOCO CLI.
Installing the extension does not require an IOCO repository clone, a separate CLI package,
or a NuGet restore. The extension runs the bundled ioco.dll with dotnet.
The validated preview hosts are local Windows x64 (build 10.0.26200) with VS Code 1.140.0,
and Windows x64 (build 10.0.26300) with VS Code 1.142.0, with the .NET 8 runtime. The
1.142.0 run also covers the WinForms, WPF and console menu and command workflows on a mixed
desktop solution. The recorded host checks used an isolated profile and an installed
VSIX, including a fresh single-project workspace with no IOCO settings. A separate isolated
runtime-only check installed the VSIX with VS Code 1.141.0 and mapped the sample with the exact
bundled CLI using .NET 8.0.31, no SDK, no repository, and no prebuilt bin/obj assets.
It found 2 projects and 18 endpoints with no diagnostics. The .NET SDK and separate MSBuild
tools are not customer prerequisites. VS Code 1.141.0 is not yet a supported preview host,
because its extension-host UI suite has not completed.
The manifest declares VS Code 1.85+ API compatibility and the CLI permits runtime roll-forward,
but other VS Code/runtime versions, Windows ARM64, macOS, Linux, and remote SSH/container/WSL
hosts have not been validated and are excluded from preview support claims. Remote setups would
need .NET on the machine running the extension host.
If .NET is absent or older than 8, IOCO keeps the last successful map (if any), links to the
.NET 8 runtime download, and asks you to
reload VS Code after installing it. Install the .NET Runtime 8 or later on the machine
running the extension host; the SDK is not required.
Install IOCO View from the VS Code Marketplace when available, or install a supplied
.vsix using Extensions: Install from VSIX…. Open an ASP.NET Core workspace; IOCO maps a
single solution automatically, or a single .csproj or .vbproj when the workspace has no solution. Use
IOCO: Choose Solution… when there are several candidates, or browse to a project directly.
The ioco.cliPath setting can point to a standalone executable to override the bundled CLI.
PATH and repository-source fallbacks are used only by development builds that do not contain
the CLI bundle.
The extension reads schemaVersion from the output. It accepts any 1.x, ignores properties
it doesn't know, and refuses a different major version with a message saying which version
it got.
Refreshing
- IOCO: Refresh (the refresh icon in the view's title bar).
- Automatically after you save a
.cs, .cshtml, .xaml or .resx file, or ioco.json. Saves are debounced
(ioco.autoRefreshDelay, 1500 ms by default), and a newer run cancels one still running.
Turn this off with ioco.autoRefresh.
- When
ioco.solutionPath, ioco.cliPath or ioco.depth changes.
Cancellation currently means that a newer map supersedes and terminates the previous CLI run;
there is no separate user-facing Cancel command. Cancellation through Windows .cmd/.bat
CLI overrides or tools that spawn child processes has not been verified.
If a refresh fails, the last good map stays in place and the view explains what went wrong.
The IOCO output channel logs each command and the CLI's stderr.
Settings
| Setting |
Default |
|
ioco.solutionPath |
"" |
What to map. Empty: find it as described above. |
ioco.cliPath |
"" |
Optional standalone ioco executable. Empty: use the bundled CLI. |
ioco.depth |
1 |
ioco map --depth: levels of injected dependencies to include. Not used when the repository's ioco.json configures the mapped solution: its depth and project scope apply, as in CI. |
ioco.autoRefresh |
true |
Re-map on save of .cs/.cshtml/.xaml/.resx files and ioco.json. |
ioco.autoRefreshDelay |
1500 |
Debounce, in milliseconds. |
Privacy
The extension runs fully offline and sends nothing anywhere. It has no telemetry, and the
only process it starts is the CLI, run locally without a shell, with
DOTNET_CLI_TELEMETRY_OPTOUT=1 and DOTNET_NOLOGO=1. The CLI only reads files. The bundled
CLI does not restore packages. A development-source fallback using dotnet run may restore
the CLI project the first time.
Editions, trial and upgrade
- Community (free). Mapping, navigation, the reasons for each file, Scatter, diagnostics and
the CLI's map JSON are free for any use, including commercial work. No account or license key
is needed, and Community features never expire.
- Pro trial (free, 14 days, no payment card). IOCO: Show Candidate Affected Endpoints
(file-to-URL lookup) is a Pro feature. After a successful first map, start the trial with
IOCO: Start 14-day Pro Trial, the sparkle icon in the view's title bar, or from the prompt
that appears when you use the lookup. The trial starts when you choose it, not at
installation, and is limited to one per person. IOCO: License Status shows what is active.
- When a trial or license ends, IOCO falls back to Community. The map and every other
Community feature keep working. Only the Pro lookup stops, and output you already generated
is never deleted or locked.
- Paid Pro and Team licenses are not on sale yet, and this preview has no checkout or
in-product purchase. A signed license file you are given is activated offline with
IOCO: Activate Signed License. One named-user license covers VS Code, Visual Studio and
the CLI. License checks run on your computer and send nothing.
Support
Ask questions and report problems on the Q&A tab of this Marketplace page. Supported
configurations are the validated preview hosts listed under Install and map a project.
License
IOCO is proprietary software under the IOCO End User License Agreement, shown on this page's
License tab and shipped in the extension as LICENSE.txt. If this page and the agreement
differ, the agreement controls. Third-party components and their licenses are listed in
THIRD-PARTY-NOTICES.txt, also shipped in the extension.
| |