Changelog
All notable changes to BC Atlas will be documented here. The format is based on Keep a Changelog, and the project follows Semantic Versioning.
Unreleased
Added
Coupling weights: every dependency weighs what it takes to cut it (
writes5,extends4,relates/implements3, calls and reads 2, subscribers 1, permission grants 0.1; repeats count logarithmically;architecture.couplingWeightschanges them). The proposal orders components, merges small groups, and finds objects that belong elsewhere by coupling; PageRank and communities use it too.--group-by coupling: components from namespaces that are tightly coupled to each other (Louvain communities on the coupling).Every architecture gets a score: cohesion per component, the share of the coupling inside components, and modularity, to compare groupings.
Dependency explorer: in open space, what drifts together follows the color (apps, components, communities, types, build layers), groups are spread apart, and tightly coupled objects sit closer together.
Dependency explorer: the new default layout Open space lets the graph float freely in a large space, like the large-graph example of 3d-force-graph: small nodes, hairline links, apps or components that only drift together, and the camera frames the connected objects once the layout has settled. The filters start collapsed (☰ or
F) so the graph has the whole window.Tools to split a monolith into apps (see the new guide Split a monolith into apps and the example
examples/monolith):- Data ownership: for every table that other components use, who owns, writes, reads, relates to, and extends it;
bca checkreports tables other components write (foreign-table-write). - Extraction plans:
bca architecture --extract <component>(and the MCP toolbc_atlas_extraction_plan, and the Architecture page) lists what moves, the blockers with their work items (including app cycles), the new app'sapp.jsonwith a stable ID, dependencies, andidRanges, the tables whose data moves withObsoleteState = PendingMove/MovedTo/MovedFrom, and the steps in order. - Public surface: per component, the objects other components use (its de facto API) and the objects that could be
Access = Internal(could-be-internal).bca refactor surface(and MCPbc_atlas_refactor_surface) setsAccess = Internalon them and writes the API toexposes.bca architecture --update-surfacerecords the surface in.bca-surface.json;bca checkthen reports changes that break its users, like AppSourceCop for internal boundaries (public-surface-change: removed or internal objects, changed procedure signatures, removed events, fields, and enum values). bca refactor move: moves an AL object to another component: its file, or the object cut out of a shared file, goes to the component's folder, its namespace becomes the component's, and referencing files get theusingthey need. Dry run by default; also the MCP toolbc_atlas_refactor_move. Work items that are moves carry the command.
- Data ownership: for every table that other components use, who owns, writes, reads, relates to, and extends it;
VS Code: the extension and its engine are bundled with esbuild; the
.vsixholds about 50 instead of 1,200 files, and CI tests the packaged extension.More architecture rules in
bca check,bca architecture, and the Architecture page:- Public objects: a component may use only public objects of another one:
internal-accessfor objects withAccess = Internal(no other app can see them) or outside the component's newexposesselectors. - Strict layers:
strictLayerslets a component use only the layer directly below it (layer-skip-dependency). - Rules of your own:
architecture.rulesforbids dependencies by selectors, now alsocomponent:andlayer:, with relationkinds(e.g. onlywrites),except,across, and a message and resolution (dependency-rule). Its violations are baselined like the others. - Checks of the architecture: empty components, unused selectors, unused or layer-contradicting
dependsOnentries, declared cycles, components abovemaxObjects, and dependencies on less stable components. Checks of the configuration point at the component in.bca.json. - Severities:
architecture.severitiessets the severity of each rule or turns it off. - New strategies
use-public-api,go-through-layer, andfollow-rule; the report counts violations by rule.
- Public objects: a component may use only public objects of another one:
VS Code: the BC Atlas panel takes its design from the editor's color theme (background, text, borders, accent, selection, status colors, and fonts), for any theme including high contrast; the 3D explorer and the Docs page inside the panel follow too. Exported pages keep the BC Atlas design.
VS Code: the BC Atlas side bar is the panel's navigation and marks the page it shows; the panel no longer repeats the pages in a navigation of its own.
Microsoft's AL toolchain replaces BC Atlas's own analysis where it knows better. With the AL Language extension or the AL Development Tools installed (
al.compiler: auto, the default), BC Atlas compiles a copy of the workspace in dependency order and:- resolves calls with the compiler's call graph (
al graph): overloads, variables, interfaces, and built-in methods, which no longer show up as unresolved calls; - reports compiler errors and warnings and CodeCop, UICop, AppSourceCop, and PerTenantExtensionCop findings in
bca check, with exact ranges and help links; compiler syntax errors replace tree-sitter parse errors.
Results are cached by file content; nothing is written into the repository.
--compiler auto|off|<path>,BCA_AL_COMPILER, and thealsection of.bca.jsonchoose the compiler;--analyzers CodeCop,UICoppicks analyzers.- resolves calls with the compiler's call graph (
bca check --compiler-log <file|folder>imports AL compiler error logs from any build (alc/errorlog,al workspace compile --errorlogdirectory, AL-Go, BcContainerHelper) without a compiler on the machine.bca check --format sarif: SARIF 2.1.0 with BC Atlas and AL findings for GitHub code scanning and Azure DevOps.AL settings like the AL Language extension reads them:
al.packageCachePath(string or list) for symbols,al.codeAnalyzerswithal.enableCodeAnalysis,al.ruleSetPath, andal.assemblyProbingPathsfrom.vscode/settings.jsonand.code-workspacefiles, whosefoldersalso define the projects. The same symbol package in several caches loads once.VS Code: the extension uses the AL Language extension's compiler and the editor's
al.*settings, compiles in the background after each change, and analyzes again after AL: Download Symbols, a new.app, or changed AL settings. SettingsbcAtlas.alCompilerandbcAtlas.alAnalyzers. Compiler findings in the Problems panel are left to the AL Language extension.Generated GitHub Actions workflows and Azure Pipelines, and the BC Atlas GitHub Action (
al-compilerinput), install the AL Development Tools.BC Atlas for VS Code (
vscode/,SchulzOli.bc-atlas): everything BC Atlas does, in the editor, with the engine inside. A panel with one look and feel for all of it: an overview, health findings, the architecture (layers, work items, components; adopt a proposal or accept violations with one click), the 3D dependency explorer, diagrams for every view with zoom and pan, a searchable object list with one page per object (dependencies, members, violations; open the source at its line), and the UI-test documentation. Findings in the Problems panel, CodeLens above AL objects, a status bar item, a side bar, commands for export, documentation, setup, and tasks, and the BC Atlas MCP server for agents in VS Code. The engine analyzes in a background process and the panel refreshes when AL files change.bca setup --editor vscoderecommends the extension.bca export: one command for every file output.--view app(default) writes the BC Atlas pages as one offline HTML file to share or publish from CI;report,explorer,catalog, and the ten diagram views write what the former commands wrote;--watchwrites again on every change.The Git timeline can step by merged pull request (
--history-by prs: GitHub, Azure DevOps, GitLab, and squash merges, with the number of commits each brought) or by release tag (--history-by releases, plus unreleased commits);--last nkeeps the most recent steps. The Dependencies page in VS Code has the same choice.Explorer: a Spacing slider (50 % to 500 %) gives crowded graphs room: longer links, longest between large nodes, stronger repulsion, and more distance between clusters and floors.
One design system (
src/ui/theme.css) for the VS Code panel, the explorer, and the HTML documentation, with light and dark themes.bca architecture: clean architecture for AL apps. Define components (namespace, folder, app, module, type, or object selectors), layers, and allowed dependencies in.bca.json, or let BC Atlas propose them from today's dependencies (--propose, weighted feedback arc set and layering). Every dependency that points outward, sideways, or undeclared becomes a work item with a resolution strategy in AL terms: declare the dependency, move an extension, subscriber, permissions, or navigation, move a related field into a table extension, move an object, or invert the dependency with an interface or event. Reports instability, abstractness, and distance per component and which components can become apps of their own; text, Markdown with a Mermaid diagram, and JSON.--writesaves the architecture to.bca.json;--update-baselineaccepts today's violations.bca checkfails on new violations, reports fixed ones so the baseline only shrinks, and warns about component cycles.The dependency explorer shows the architecture: a Components level, violating edges in red with their resolution, an Architecture panel with the largest work items, violations per commit on the timeline, and architecture layers as a layout. The MCP server offers
bc_atlas_architecture.Dependency explorer (
bca export --view explorer, and the Dependencies page in VS Code): an interactive 3D dependency explorer in one self-contained, offline HTML file. Dependencies inside one app are kept apart from dependencies across apps, which are checked againstapp.json:declared,implicit(Microsoft apps),undeclared, andunresolved. Switch between an object level and an app level; filter by app, dependency class, object type, and relation kind; search, isolate neighborhoods, and inspect the evidence behind every edge.--historyreplays Git history as a fourth dimension: one frame per commit that changed AL files orapp.json, with added, changed, and removed objects highlighted. Without Git, the timeline replays the build order.--format jsonwrites thebc-atlas.graphdocument: a temporal graph with presence spans, PageRank, Louvain communities, build layers, and cycles, built with graphology. The MCP server offers it asbc_atlas_explore.examples/multi-app, a three-app workspace, and its explorer example.Nested
app.jsonfiles are modules of the enclosing app, as in BCApps' System Application and Base Application. The explorer adds a module level, checks module dependencies against the module manifests, and marks dependencies between modules of one app ascross-module.Platform system objects (
Integer,Date,Field,AllObjWithCaption,Company, ...) andSystem "..."permissions count as implicit dependencies instead of unresolved ones.--pathsanalyzes and replays only some folders of a large repository. Large explorer files embed their graph gzip-compressed and start on the module level.bca docs generatedraws every scenario as a flow of its clicks in BPMN notation ("At a glance"): user tasks, milestones for[THEN]between[WHEN]phases, loop markers for repeated blocks, and wrapping rows for long flows.Every use case gets a process diagram with one lane per permission set, the scenarios in
[NEXT]/[REQUIRES]order, and an exclusive gateway where[ALTERNATIVE]paths branch. In HTML, each scenario links to its guide.--export bpmn:use-case-<feature>.bpmn, a BPMN 2.0 file with diagram layout and colors for Camunda Modeler, bpmn.io, and Signavio. Each scenario is a collapsed sub-process; double-click it to see its clicks as user tasks.
Changed
internal-accessis on by default: a configured architecture can report new violations where a component uses anAccess = Internalobject of another one. Accept them withbca architecture --update-baseline, or set"severities": { "internal-access": "off" }when components are layers of one app that never split.- The Publish VS Code extension workflow signs in to the Marketplace with Microsoft Entra ID (GitHub OIDC,
vsce --azure-credential) instead of theVSCE_PATtoken, because Azure DevOps retires global personal access tokens on December 1, 2026. It needs the secretsAZURE_CLIENT_IDandAZURE_TENANT_IDand checks access to the publisher before publishing. - A new BC Atlas icon and logo (an "A" drawn as a dependency graph with an orbit), used by the extension, its activity bar, and the panel. The extension has a Marketplace listing with screenshots, a banner, and a social preview image; sources and the render script are in
vscode/marketing/. - Fewer commands: 8 instead of 15.
bca report,bca graph,bca watch,bca inspect, andbca codegraphare nowbca export --view report,--view <view>,--watch,--format json, and--view catalog;-oreplaces--output-dir.bca initis part ofbca setup, andbca capabilitiesisbca help --format json.bca <app-root>is no longer a shortcut; the interactive views are in the VS Code extension. See the table in the CLI reference. - The journey diagram shows each scenario with its permission set and number of steps.
[NEXT]and[REQUIRES]between the same scenarios are one arrow in flow direction;[ALTERNATIVE]and[RELATED]are dashed lines.
Fixed
The warehouse example declares
using BCA.Example.UI;for the page its permission set grants; the AL compiler reported it as missing.The 3D explorer inside the panel follows a dark theme: it now asks for the theme once its graph is unpacked, instead of missing the message sent while it was still loading.
Namespace-qualified references such as
Record Microsoft.Sales.Document."Sales Header",TableData Microsoft.Sales.Document."Sales Line" = R, andDatabase::Microsoft.Sales.Document."Sales Header"resolve to their object instead of an unresolved object namedMicrosoft.The call view no longer slows down quadratically on large apps: resolving calls in the Base Application takes about 2.5 instead of 70 seconds.
Steps on quoted fields and actions, such as
SalesOrder."Sell-to Customer No.".SetValue(...), are no longer dropped from generated documentation.
0.7.0 - 2026-10-04
Added
- Documentation website on GitHub Pages (https://schulzoli.github.io/BC-Atlas/), built with VitePress from the repository Markdown, with search, a sidebar by feature area, and the generated examples.
bca setup: guided setup of features, Git hooks (Husky or plain Git), pipelines (GitHub Actions or Azure Pipelines), cron schedules, and sync of generated files, as a terminal wizard or with--yes.bca setup planandbca setup apply: the same setup as detectable facts, questions with recommendations, and a validated, idempotent apply with--dry-run.bca setup --editor vscode: VS Code tasks for the local loop: health check with findings in the Problems panel, report and docs builds, hook dry runs, a live architecture diagram, and the setup wizard. Existing tasks are kept.bca setup agent --agent claude|copilot|cursor: a/bca-setupcommand that lets the user's AI agent guide the setup through the CLI.bca run --trigger pre-commit|pre-push|ci|schedule: one entry point for every trigger, configured in the newautomationsection of.bca.json, withverifyandstagesync anddocs,codegraph, anddiagramstasks.- A GitHub Action (
uses: SchulzOli/BC-Atlas@v0.7.0) withoutputsandpassedoutputs. - MCP tools
bc_atlas_setup_plan,bc_atlas_setup_apply,bc_atlas_run, andbc_atlas_update_check. - Update cycle: interactive commands show a notice when a newer version is available (checked at most once a day in the background, off in CI, hooks,
bca run, and JSON output, or withBCA_NO_UPDATE_CHECK). bca update: release notes since the installed version, a confirmed update of the global or project installation, and regenerated hooks, VS Code tasks, pipelines, and agent commands.--checkexits with1when an update exists.bca setup --updates dependabot: Dependabot pull requests for newbc-atlasversions;bca setup apply --from-configreproduces an existing setup.- With a
package.jsonthat declaresbc-atlas, generated pipelines and VS Code tasks use that version (npm ci,npx --no-install bca). bca docs generatepresents scenarios in the structure of an OASIS DITA 1.3 task topic (prerequisites, steps, step results, result, related links). The AL tags are unchanged.--export markdown,html,dita,ado-csv: Markdown, one self-contained HTML file, DITA 1.3 task topics with a map, and an Azure DevOps Test Plans CSV.--as testcase: test case specification with preconditions, an action/expected result/pass-fail table, and a sign-off block.--app: real page, field, part, and action captions and tooltips from the app's AL source, plus page and action coverage in the index.--language: German and English wording; captions and tooltips from the app's XLIFF translations.- Use-case pages per
[FEATURE], a journey diagram of scenario links, and indexes by page and permission set. [THEN]between two[WHEN]phases becomes the result of that phase.- The MCP tool
bc_atlas_docs_generateaccepts formats, mode, app, and language. - Generated example documentation in
examples/docs.
Changed
- Instructions follow Business Central help conventions ("Choose the 🔍 icon, enter ...", "In the Field field, enter ...", "Choose the Action action."). Scenarios with one
[WHEN]phase list their instructions as top-level steps; repeated blocks become sub-steps. - Node.js 22 or later is required; Node.js 20 reached end of life in April 2026. The Docker image and generated pipelines use Node.js 24.
- CI runs once per pull request instead of twice, starts with one fast check job, then tests Node.js 22 and 24 on Linux and Node.js 24 on Windows.
0.6.0 - 2026-10-04
Added
bca initcreates a.bca.jsontailored to the project: app title, excluded test folders, and source links for GitHub, GitLab, or Azure DevOps remotes.bca reportwrites a static Markdown architecture report with an at-a-glance table, diagrams for six views, the health summary, and optional object catalog and JSON model.bca checkevaluates architecture health (diagnostics, forbidden dependencies, cycles, fan-in/fan-out hot spots, orphans, unresolved references) with--fail-onlevels and text, JSON, or Markdown output.bca mcpstarts the MCP server; new MCP toolsbc_atlas_checkandbc_atlas_report.bca help <command>and per-command--helpwith grouped options and examples;bcawithout arguments shows all features by area.- Feature areas and views in the
bca capabilitiescontract. checkandreportsections in.bca.json.- Example report in
examples/report, regenerated bynpm run examples. - Public contribution, support, conduct, and security policies.
- Reproducible example project, generated diagrams, and feature screenshots.
Changed
- Every command is defined once in
src/capabilities.js; help, parsing, enum validation, the JSON contract, and generated docs derive from it. - Commands only accept their own options and validate enum values; invalid usage exits with code
2, failed operations and checks with1. [app-root]defaults to the current directory.- Clearer errors for missing paths, empty results, and unknown commands.
- Several views of one project share a single parse.
- Documentation reorganized by feature area; repository URLs point to
SchulzOli/BC-Atlas. - The npm package ships only runtime files.
- Updated
@modelcontextprotocol/server,zod, andweb-tree-sitter(0.27).
Removed
- The local web Control Center:
bca serve,bca docs serve, and themarkedanddompurifydependencies. Usebca reportfor a browsable overview.
Fixed
- Rendering more than one SVG in a single process could exit early because the D2 worker was unreferenced between renders.
bca-mcpdid not start when invoked through an npm bin symlink.codegraphno longer deletes a non-empty output directory that it did not generate.
0.5.0 - 2026-07-30
Added
- Project, module, object, data, call, boundary, contracts, events, UI, and workflow diagram views.
- D2, JSON, and WebAssembly-rendered SVG output.
- AL UI-test-to-Markdown documentation generation.
- Configuration, watch mode, diagnostics, dependency policies, and Docker support.