bc-atlas 0.5.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bca.example.json +98 -10
- package/CHANGELOG.md +370 -0
- package/LICENSE +21 -21
- package/README.md +227 -260
- package/THIRD_PARTY_NOTICES.md +17 -0
- package/package.json +34 -16
- package/src/al/compiler.js +349 -0
- package/src/al/index.js +184 -0
- package/src/al/settings.js +166 -0
- package/src/al/toolchain.js +234 -0
- package/src/analyzer.js +683 -90
- package/src/app/page.js +54 -0
- package/src/app/service.js +63 -0
- package/src/app/snapshot.js +82 -0
- package/src/app/ui/app.css +281 -0
- package/src/app/ui/app.js +1023 -0
- package/src/app/ui/index.html +53 -0
- package/src/app/worker.js +32 -0
- package/src/app/workspace.js +362 -0
- package/src/architecture.js +169 -0
- package/src/automation/agent.js +72 -0
- package/src/automation/config.js +119 -0
- package/src/automation/dependabot.js +36 -0
- package/src/automation/git.js +47 -0
- package/src/automation/pipelines.js +229 -0
- package/src/automation/run.js +137 -0
- package/src/automation/setup.js +556 -0
- package/src/automation/starter.js +88 -0
- package/src/automation/vscode.js +113 -0
- package/src/blueprint/annotate.js +50 -0
- package/src/blueprint/baseline.js +54 -0
- package/src/blueprint/components.js +176 -0
- package/src/blueprint/evaluate.js +546 -0
- package/src/blueprint/extract.js +321 -0
- package/src/blueprint/index.js +114 -0
- package/src/blueprint/ownership.js +54 -0
- package/src/blueprint/propose.js +401 -0
- package/src/blueprint/report.js +253 -0
- package/src/blueprint/resolutions.js +151 -0
- package/src/blueprint/surface.js +212 -0
- package/src/call-analysis.js +103 -0
- package/src/capabilities.js +631 -0
- package/src/cli/args.js +76 -0
- package/src/cli/errors.js +24 -0
- package/src/cli/help.js +146 -0
- package/src/cli.js +94 -338
- package/src/codegraph.js +454 -0
- package/src/commands/blueprint.js +69 -0
- package/src/commands/check.js +61 -0
- package/src/commands/explore.js +32 -0
- package/src/commands/export.js +170 -0
- package/src/commands/refactor.js +55 -0
- package/src/commands/report.js +183 -0
- package/src/commands/run.js +28 -0
- package/src/commands/setup.js +179 -0
- package/src/commands/update.js +144 -0
- package/src/d2.js +147 -46
- package/src/docs/al-ui-source.js +201 -133
- package/src/docs/al-ui-writer.js +141 -0
- package/src/docs/automation.js +109 -0
- package/src/docs/captions.js +201 -0
- package/src/docs/cli.js +139 -34
- package/src/docs/export.js +143 -0
- package/src/docs/markdown.js +18 -64
- package/src/docs/model.js +147 -0
- package/src/docs/phrases.js +291 -0
- package/src/docs/process.js +419 -0
- package/src/docs/render/bpmn.js +131 -0
- package/src/docs/render/csv.js +24 -0
- package/src/docs/render/dita.js +84 -0
- package/src/docs/render/format.js +46 -0
- package/src/docs/render/html.js +212 -0
- package/src/docs/render/markdown.js +243 -0
- package/src/docs/render/process-svg.js +142 -0
- package/src/docs/steps.js +166 -0
- package/src/docs/tags.js +107 -0
- package/src/docs/task.js +317 -0
- package/src/graph/coupling.js +44 -0
- package/src/graph/document.js +149 -0
- package/src/graph/history.js +286 -0
- package/src/graph/html.js +51 -0
- package/src/graph/lenses/dependency.js +418 -0
- package/src/graph/lenses/index.js +19 -0
- package/src/graph/metrics.js +118 -0
- package/src/graph/temporal.js +99 -0
- package/src/graph/viewer/template.html +76 -0
- package/src/graph/viewer/viewer.css +198 -0
- package/src/graph/viewer/viewer.js +1470 -0
- package/src/health.js +339 -0
- package/src/insights.js +1 -1
- package/src/mcp.js +440 -0
- package/src/operation-semantics.js +15 -0
- package/src/output.js +89 -0
- package/src/permission-semantics.js +71 -0
- package/src/refactor/diff.js +72 -0
- package/src/refactor/move.js +288 -0
- package/src/refactor/surface.js +107 -0
- package/src/relation-aggregation.js +33 -0
- package/src/resolver.js +97 -15
- package/src/sarif.js +65 -0
- package/src/svg.js +33 -8
- package/src/symbols.js +163 -0
- package/src/ui/theme.css +143 -0
- package/src/update-worker.js +9 -0
- package/src/update.js +131 -0
- package/src/views.js +357 -79
- package/src/workflow.js +24 -65
- package/docs/al-ui-test-documentation.md +0 -126
- package/docs/cli-reference.md +0 -242
- package/examples/README.md +0 -32
- package/examples/output/project.d2 +0 -86
- package/examples/output/project.svg +0 -225
- package/examples/output/ui.d2 +0 -47
- package/examples/output/ui.svg +0 -166
- package/examples/output/workflow.d2 +0 -56
- package/examples/output/workflow.svg +0 -194
- package/examples/warehouse-app/Automation.al +0 -24
- package/examples/warehouse-app/Inventory.al +0 -46
- package/examples/warehouse-app/WarehouseUI.al +0 -29
- package/examples/warehouse-app/app.json +0 -8
- package/scripts/generate-examples.js +0 -56
- package/scripts/update-grammar.js +0 -22
package/.bca.example.json
CHANGED
|
@@ -1,32 +1,60 @@
|
|
|
1
1
|
{
|
|
2
2
|
"view": "project",
|
|
3
|
+
"projectRoot": ".",
|
|
3
4
|
"direction": "right",
|
|
4
5
|
"title": "Business Central architecture",
|
|
5
6
|
"groupBy": "role",
|
|
6
|
-
"
|
|
7
|
-
|
|
7
|
+
"roleMappings": {
|
|
8
|
+
"Domain": [
|
|
9
|
+
"Contoso.Sales:table:*",
|
|
10
|
+
"Contoso.Sales:codeunit:*"
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
"namespaces": [
|
|
14
|
+
"Contoso.**"
|
|
15
|
+
],
|
|
16
|
+
"exclude": [
|
|
17
|
+
"**/test/**"
|
|
18
|
+
],
|
|
8
19
|
"moduleDepth": "auto",
|
|
9
20
|
"folderDepth": 1,
|
|
10
21
|
"includeUnresolvedCalls": false,
|
|
11
22
|
"maxEdges": 500,
|
|
12
23
|
"workflow": {
|
|
13
|
-
"entries": [
|
|
24
|
+
"entries": [
|
|
25
|
+
"ProcessDocument"
|
|
26
|
+
],
|
|
14
27
|
"depth": 8,
|
|
15
28
|
"maxNodes": 100,
|
|
16
29
|
"maxEdges": 250,
|
|
17
|
-
"edgeTypes": [
|
|
30
|
+
"edgeTypes": [
|
|
31
|
+
"calls",
|
|
32
|
+
"events",
|
|
33
|
+
"writes"
|
|
34
|
+
],
|
|
18
35
|
"phases": {
|
|
19
|
-
"Validation": [
|
|
20
|
-
|
|
36
|
+
"Validation": [
|
|
37
|
+
"Validate*"
|
|
38
|
+
],
|
|
39
|
+
"Processing": [
|
|
40
|
+
"Process*",
|
|
41
|
+
"Post*"
|
|
42
|
+
]
|
|
21
43
|
},
|
|
22
|
-
"stop": [
|
|
23
|
-
|
|
44
|
+
"stop": [
|
|
45
|
+
"Finalize*"
|
|
46
|
+
],
|
|
47
|
+
"collapse": [
|
|
48
|
+
"*Telemetry*"
|
|
49
|
+
]
|
|
24
50
|
},
|
|
25
51
|
"details": false,
|
|
26
52
|
"noExternal": false,
|
|
27
53
|
"layout": "elk",
|
|
28
54
|
"theme": 0,
|
|
29
|
-
"sourceUrl": "https://github.com/example/repo/blob/
|
|
55
|
+
"sourceUrl": "https://github.com/example/repo/blob/{ref}/{file}#L{line}",
|
|
56
|
+
"sourceRef": "main",
|
|
57
|
+
"sourcePathPrefix": "apps/Sales",
|
|
30
58
|
"forbiddenDependencies": [
|
|
31
59
|
{
|
|
32
60
|
"from": "Contoso.Core:**",
|
|
@@ -34,5 +62,65 @@
|
|
|
34
62
|
"severity": "warning",
|
|
35
63
|
"message": "Core must not depend on UI"
|
|
36
64
|
}
|
|
37
|
-
]
|
|
65
|
+
],
|
|
66
|
+
"architecture": {
|
|
67
|
+
"components": [
|
|
68
|
+
{ "name": "Core", "layer": 0, "match": ["namespace:Contoso.Core"], "exposes": ["type:interface,table", "object:codeunit:Core API"] },
|
|
69
|
+
{ "name": "Sales", "layer": 1, "match": ["namespace:Contoso.Sales"], "dependsOn": ["Core"], "maxObjects": 400 },
|
|
70
|
+
{ "name": "Integration", "layer": 2, "match": ["app:Contoso Integration"], "dependsOn": ["Sales"] }
|
|
71
|
+
],
|
|
72
|
+
"allowSameLayer": false,
|
|
73
|
+
"strictLayers": false,
|
|
74
|
+
"maxObjects": 1500,
|
|
75
|
+
"couplingWeights": { "reads": 2, "subscribes": 1 },
|
|
76
|
+
"severity": "error",
|
|
77
|
+
"unassigned": "warning",
|
|
78
|
+
"severities": {
|
|
79
|
+
"internal-access": "warning",
|
|
80
|
+
"unstable-dependency": "off"
|
|
81
|
+
},
|
|
82
|
+
"rules": [
|
|
83
|
+
{
|
|
84
|
+
"name": "owner-writes-its-tables",
|
|
85
|
+
"from": "*",
|
|
86
|
+
"to": "type:table",
|
|
87
|
+
"kinds": ["writes"],
|
|
88
|
+
"across": true,
|
|
89
|
+
"severity": "error",
|
|
90
|
+
"message": "Only the component that owns a table writes to it",
|
|
91
|
+
"resolution": "Call a codeunit of the owning component that writes the record."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "core-has-no-ui",
|
|
95
|
+
"from": "layer:0",
|
|
96
|
+
"to": "type:page,report",
|
|
97
|
+
"except": ["object:page:Core Setup"]
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"check": {
|
|
102
|
+
"failOn": "error",
|
|
103
|
+
"cycles": "warning",
|
|
104
|
+
"maxFanIn": 25,
|
|
105
|
+
"maxFanOut": 25
|
|
106
|
+
},
|
|
107
|
+
"al": {
|
|
108
|
+
"compiler": "auto",
|
|
109
|
+
"analyzers": ["CodeCop", "UICop"],
|
|
110
|
+
"callGraph": true
|
|
111
|
+
},
|
|
112
|
+
"report": {
|
|
113
|
+
"outputDir": "docs/atlas",
|
|
114
|
+
"views": [
|
|
115
|
+
"project",
|
|
116
|
+
"module",
|
|
117
|
+
"data",
|
|
118
|
+
"contracts",
|
|
119
|
+
"events",
|
|
120
|
+
"ui"
|
|
121
|
+
],
|
|
122
|
+
"format": "svg",
|
|
123
|
+
"codegraph": false,
|
|
124
|
+
"json": false
|
|
125
|
+
}
|
|
38
126
|
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to BC Atlas will be documented here. The format is based on
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project
|
|
5
|
+
follows [Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## 0.8.0 - 2026-10-29
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Coupling weights: every dependency weighs what it takes to cut it
|
|
12
|
+
(`writes` 5, `extends` 4, `relates`/`implements` 3, calls and reads 2,
|
|
13
|
+
subscribers 1, permission grants 0.1; repeats count logarithmically;
|
|
14
|
+
`architecture.couplingWeights` changes them). The proposal orders
|
|
15
|
+
components, merges small groups, and finds objects that belong elsewhere
|
|
16
|
+
by coupling; PageRank and communities use it too.
|
|
17
|
+
- `--group-by coupling`: components from namespaces that are tightly coupled
|
|
18
|
+
to each other (Louvain communities on the coupling).
|
|
19
|
+
- Every architecture gets a score: cohesion per component, the share of the
|
|
20
|
+
coupling inside components, and modularity, to compare groupings.
|
|
21
|
+
- Dependency explorer: in open space, what drifts together follows the
|
|
22
|
+
color (apps, components, communities, types, build layers), groups are
|
|
23
|
+
spread apart, and tightly coupled objects sit closer together.
|
|
24
|
+
- Dependency explorer: the new default layout **Open space** lets the graph
|
|
25
|
+
float freely in a large space, like the large-graph example of
|
|
26
|
+
3d-force-graph: small nodes, hairline links, apps or components that only
|
|
27
|
+
drift together, and the camera frames the connected objects once the layout
|
|
28
|
+
has settled. The filters start collapsed (☰ or `F`) so the graph has the
|
|
29
|
+
whole window.
|
|
30
|
+
- Tools to split a monolith into apps (see the new guide
|
|
31
|
+
[Split a monolith into apps](./docs/modularization.md) and the example
|
|
32
|
+
`examples/monolith`):
|
|
33
|
+
- **Data ownership:** for every table that other components use, who
|
|
34
|
+
owns, writes, reads, relates to, and extends it; `bca check` reports
|
|
35
|
+
tables other components write (`foreign-table-write`).
|
|
36
|
+
- **Extraction plans:** `bca architecture --extract <component>` (and the
|
|
37
|
+
MCP tool `bc_atlas_extraction_plan`, and the Architecture page) lists what
|
|
38
|
+
moves, the blockers with their work items (including app cycles), the new
|
|
39
|
+
app's `app.json` with a stable ID, dependencies, and `idRanges`, the tables
|
|
40
|
+
whose data moves with `ObsoleteState = PendingMove`/`MovedTo`/`MovedFrom`,
|
|
41
|
+
and the steps in order.
|
|
42
|
+
- **Public surface:** per component, the objects other components use (its
|
|
43
|
+
de facto API) and the objects that could be `Access = Internal`
|
|
44
|
+
(`could-be-internal`). `bca refactor surface` (and MCP
|
|
45
|
+
`bc_atlas_refactor_surface`) sets `Access = Internal` on them and writes
|
|
46
|
+
the API to `exposes`. `bca architecture --update-surface` records the
|
|
47
|
+
surface in `.bca-surface.json`; `bca check` then reports changes that
|
|
48
|
+
break its users, like AppSourceCop for internal boundaries
|
|
49
|
+
(`public-surface-change`: removed or internal objects, changed procedure
|
|
50
|
+
signatures, removed events, fields, and enum values).
|
|
51
|
+
- **`bca refactor move`:** moves an AL object to another component: its
|
|
52
|
+
file, or the object cut out of a shared file, goes to the component's
|
|
53
|
+
folder, its namespace becomes the component's, and referencing files get
|
|
54
|
+
the `using` they need. Dry run by default; also the MCP tool
|
|
55
|
+
`bc_atlas_refactor_move`. Work items that are moves carry the command.
|
|
56
|
+
- VS Code: the extension and its engine are bundled with esbuild; the
|
|
57
|
+
`.vsix` holds about 50 instead of 1,200 files, and CI tests the packaged
|
|
58
|
+
extension.
|
|
59
|
+
- More architecture rules in `bca check`, `bca architecture`, and the
|
|
60
|
+
Architecture page:
|
|
61
|
+
- **Public objects:** a component may use only public objects of another
|
|
62
|
+
one: `internal-access` for objects with `Access = Internal` (no other app
|
|
63
|
+
can see them) or outside the component's new `exposes` selectors.
|
|
64
|
+
- **Strict layers:** `strictLayers` lets a component use only the layer
|
|
65
|
+
directly below it (`layer-skip-dependency`).
|
|
66
|
+
- **Rules of your own:** `architecture.rules` forbids dependencies by
|
|
67
|
+
selectors, now also `component:` and `layer:`, with relation `kinds`
|
|
68
|
+
(e.g. only `writes`), `except`, `across`, and a message and resolution
|
|
69
|
+
(`dependency-rule`). Its violations are baselined like the others.
|
|
70
|
+
- **Checks of the architecture:** empty components, unused selectors, unused
|
|
71
|
+
or layer-contradicting `dependsOn` entries, declared cycles, components
|
|
72
|
+
above `maxObjects`, and dependencies on less stable components. Checks of
|
|
73
|
+
the configuration point at the component in `.bca.json`.
|
|
74
|
+
- **Severities:** `architecture.severities` sets the severity of each rule
|
|
75
|
+
or turns it off.
|
|
76
|
+
- New strategies `use-public-api`, `go-through-layer`, and `follow-rule`;
|
|
77
|
+
the report counts violations by rule.
|
|
78
|
+
- VS Code: the BC Atlas panel takes its design from the editor's color theme
|
|
79
|
+
(background, text, borders, accent, selection, status colors, and fonts),
|
|
80
|
+
for any theme including high contrast; the 3D explorer and the Docs page
|
|
81
|
+
inside the panel follow too. Exported pages keep the BC Atlas design.
|
|
82
|
+
- VS Code: the BC Atlas side bar is the panel's navigation and marks the page
|
|
83
|
+
it shows; the panel no longer repeats the pages in a navigation of its own.
|
|
84
|
+
- Microsoft's AL toolchain replaces BC Atlas's own analysis where it knows
|
|
85
|
+
better. With the AL Language extension or the AL Development Tools
|
|
86
|
+
installed (`al.compiler: auto`, the default), BC Atlas compiles a copy of the
|
|
87
|
+
workspace in dependency order and:
|
|
88
|
+
- resolves calls with the compiler's call graph (`al graph`): overloads,
|
|
89
|
+
variables, interfaces, and built-in methods, which no longer show up as
|
|
90
|
+
unresolved calls;
|
|
91
|
+
- reports compiler errors and warnings and CodeCop, UICop, AppSourceCop, and
|
|
92
|
+
PerTenantExtensionCop findings in `bca check`, with exact ranges and help
|
|
93
|
+
links; compiler syntax errors replace tree-sitter parse errors.
|
|
94
|
+
|
|
95
|
+
Results are cached by file content; nothing is written into the repository.
|
|
96
|
+
`--compiler auto|off|<path>`, `BCA_AL_COMPILER`, and the `al` section of
|
|
97
|
+
`.bca.json` choose the compiler; `--analyzers CodeCop,UICop` picks analyzers.
|
|
98
|
+
- `bca check --compiler-log <file|folder>` imports AL compiler error logs from
|
|
99
|
+
any build (alc `/errorlog`, `al workspace compile --errorlogdirectory`,
|
|
100
|
+
AL-Go, BcContainerHelper) without a compiler on the machine.
|
|
101
|
+
- `bca check --format sarif`: SARIF 2.1.0 with BC Atlas and AL findings for
|
|
102
|
+
GitHub code scanning and Azure DevOps.
|
|
103
|
+
- AL settings like the AL Language extension reads them: `al.packageCachePath`
|
|
104
|
+
(string or list) for symbols, `al.codeAnalyzers` with
|
|
105
|
+
`al.enableCodeAnalysis`, `al.ruleSetPath`, and `al.assemblyProbingPaths`
|
|
106
|
+
from `.vscode/settings.json` and `.code-workspace` files, whose `folders`
|
|
107
|
+
also define the projects. The same symbol package in several caches loads
|
|
108
|
+
once.
|
|
109
|
+
- VS Code: the extension uses the AL Language extension's compiler and the
|
|
110
|
+
editor's `al.*` settings, compiles in the background after each change, and
|
|
111
|
+
analyzes again after **AL: Download Symbols**, a new `.app`, or changed AL
|
|
112
|
+
settings. Settings `bcAtlas.alCompiler` and `bcAtlas.alAnalyzers`. Compiler
|
|
113
|
+
findings in the Problems panel are left to the AL Language extension.
|
|
114
|
+
- Generated GitHub Actions workflows and Azure Pipelines, and the BC Atlas
|
|
115
|
+
GitHub Action (`al-compiler` input), install the AL Development Tools.
|
|
116
|
+
- BC Atlas for VS Code (`vscode/`, `SchulzOli.bc-atlas`): everything BC Atlas
|
|
117
|
+
does, in the editor, with the engine inside. A panel with one look and feel
|
|
118
|
+
for all of it: an overview, health findings, the architecture (layers, work
|
|
119
|
+
items, components; adopt a proposal or accept violations with one click),
|
|
120
|
+
the 3D dependency explorer, diagrams for every view with zoom and pan, a
|
|
121
|
+
searchable object list with one page per object (dependencies, members,
|
|
122
|
+
violations; open the source at its line), and the UI-test documentation.
|
|
123
|
+
Findings in the Problems panel, CodeLens above AL objects, a status bar
|
|
124
|
+
item, a side bar, commands for export, documentation, setup, and tasks,
|
|
125
|
+
and the BC Atlas MCP server for agents in VS Code. The engine analyzes in
|
|
126
|
+
a background process and the panel refreshes when AL files change.
|
|
127
|
+
`bca setup --editor vscode` recommends the extension.
|
|
128
|
+
- `bca export`: one command for every file output. `--view app` (default)
|
|
129
|
+
writes the BC Atlas pages as one offline HTML file to share or publish from CI;
|
|
130
|
+
`report`, `explorer`, `catalog`, and the ten diagram views write what the
|
|
131
|
+
former commands wrote; `--watch` writes again on every change.
|
|
132
|
+
- The Git timeline can step by merged pull request (`--history-by prs`:
|
|
133
|
+
GitHub, Azure DevOps, GitLab, and squash merges, with the number of commits
|
|
134
|
+
each brought) or by release tag (`--history-by releases`, plus unreleased
|
|
135
|
+
commits); `--last n` keeps the most recent steps. The Dependencies page in
|
|
136
|
+
VS Code has the same choice.
|
|
137
|
+
- Explorer: a Spacing slider (50 % to 500 %) gives crowded graphs room:
|
|
138
|
+
longer links, longest between large nodes, stronger repulsion, and more
|
|
139
|
+
distance between clusters and floors.
|
|
140
|
+
- One design system (`src/ui/theme.css`) for the VS Code panel, the explorer, and the
|
|
141
|
+
HTML documentation, with light and dark themes.
|
|
142
|
+
|
|
143
|
+
- `bca architecture`: clean architecture for AL apps. Define components
|
|
144
|
+
(namespace, folder, app, module, type, or object selectors), layers, and
|
|
145
|
+
allowed dependencies in `.bca.json`, or let BC Atlas propose them from
|
|
146
|
+
today's dependencies (`--propose`, weighted feedback arc set and layering).
|
|
147
|
+
Every dependency that points outward, sideways, or undeclared becomes a work
|
|
148
|
+
item with a resolution strategy in AL terms: declare the dependency, move an
|
|
149
|
+
extension, subscriber, permissions, or navigation, move a related field into
|
|
150
|
+
a table extension, move an object, or invert the dependency with an
|
|
151
|
+
interface or event. Reports instability, abstractness, and distance per
|
|
152
|
+
component and which components can become apps of their own; text,
|
|
153
|
+
Markdown with a Mermaid diagram, and JSON.
|
|
154
|
+
- `--write` saves the architecture to `.bca.json`; `--update-baseline`
|
|
155
|
+
accepts today's violations. `bca check` fails on new violations, reports
|
|
156
|
+
fixed ones so the baseline only shrinks, and warns about component cycles.
|
|
157
|
+
- The dependency explorer shows the architecture: a Components level, violating edges
|
|
158
|
+
in red with their resolution, an Architecture panel with the largest work
|
|
159
|
+
items, violations per commit on the timeline, and architecture layers as a
|
|
160
|
+
layout. The MCP server offers `bc_atlas_architecture`.
|
|
161
|
+
|
|
162
|
+
- Dependency explorer (`bca export --view explorer`, and the Dependencies
|
|
163
|
+
page in VS Code): an interactive 3D dependency explorer in one
|
|
164
|
+
self-contained, offline HTML file. Dependencies inside one app are kept apart from
|
|
165
|
+
dependencies across apps, which are checked against `app.json`: `declared`,
|
|
166
|
+
`implicit` (Microsoft apps), `undeclared`, and `unresolved`. Switch between
|
|
167
|
+
an object level and an app level; filter by app, dependency class, object
|
|
168
|
+
type, and relation kind; search, isolate neighborhoods, and inspect the
|
|
169
|
+
evidence behind every edge.
|
|
170
|
+
- `--history` replays Git history as a fourth dimension: one frame per commit
|
|
171
|
+
that changed AL files or `app.json`, with added, changed, and removed
|
|
172
|
+
objects highlighted. Without Git, the timeline replays the build order.
|
|
173
|
+
- `--format json` writes the `bc-atlas.graph` document: a temporal graph with
|
|
174
|
+
presence spans, PageRank, Louvain communities, build layers, and cycles,
|
|
175
|
+
built with graphology. The MCP server offers it as `bc_atlas_explore`.
|
|
176
|
+
- `examples/multi-app`, a three-app workspace, and its explorer example.
|
|
177
|
+
- Nested `app.json` files are modules of the enclosing app, as in BCApps'
|
|
178
|
+
System Application and Base Application. The explorer adds a module level,
|
|
179
|
+
checks module dependencies against the module manifests, and marks
|
|
180
|
+
dependencies between modules of one app as `cross-module`.
|
|
181
|
+
- Platform system objects (`Integer`, `Date`, `Field`, `AllObjWithCaption`,
|
|
182
|
+
`Company`, ...) and `System "..."` permissions count as implicit
|
|
183
|
+
dependencies instead of unresolved ones.
|
|
184
|
+
- `--paths` analyzes and replays only some folders of a large
|
|
185
|
+
repository. Large explorer files embed their graph gzip-compressed and start
|
|
186
|
+
on the module level.
|
|
187
|
+
|
|
188
|
+
- `bca docs generate` draws every scenario as a flow of its clicks in BPMN
|
|
189
|
+
notation ("At a glance"): user tasks, milestones for `[THEN]` between
|
|
190
|
+
`[WHEN]` phases, loop markers for repeated blocks, and wrapping rows for long
|
|
191
|
+
flows.
|
|
192
|
+
- Every use case gets a process diagram with one lane per permission set, the
|
|
193
|
+
scenarios in `[NEXT]`/`[REQUIRES]` order, and an exclusive gateway where
|
|
194
|
+
`[ALTERNATIVE]` paths branch. In HTML, each scenario links to its guide.
|
|
195
|
+
- `--export bpmn`: `use-case-<feature>.bpmn`, a BPMN 2.0 file with diagram
|
|
196
|
+
layout and colors for Camunda Modeler, bpmn.io, and Signavio. Each scenario
|
|
197
|
+
is a collapsed sub-process; double-click it to see its clicks as user tasks.
|
|
198
|
+
|
|
199
|
+
### Changed
|
|
200
|
+
|
|
201
|
+
- `internal-access` is on by default: a configured architecture can report
|
|
202
|
+
new violations where a component uses an `Access = Internal` object of
|
|
203
|
+
another one. Accept them with `bca architecture --update-baseline`, or set
|
|
204
|
+
`"severities": { "internal-access": "off" }` when components are layers of
|
|
205
|
+
one app that never split.
|
|
206
|
+
- The *Publish VS Code extension* workflow signs in to the Marketplace with
|
|
207
|
+
Microsoft Entra ID (GitHub OIDC, `vsce --azure-credential`) instead of the
|
|
208
|
+
`VSCE_PAT` token, because Azure DevOps retires global personal access
|
|
209
|
+
tokens on December 1, 2026. It needs the secrets `AZURE_CLIENT_ID` and
|
|
210
|
+
`AZURE_TENANT_ID` and checks access to the publisher before publishing.
|
|
211
|
+
- A new BC Atlas icon and logo (an "A" drawn as a dependency graph with an
|
|
212
|
+
orbit), used by the extension, its activity bar, and the panel. The
|
|
213
|
+
extension has a Marketplace listing with screenshots, a banner, and a social
|
|
214
|
+
preview image; sources and the render script are in `vscode/marketing/`.
|
|
215
|
+
- Fewer commands: 8 instead of 15. `bca report`, `bca graph`, `bca watch`,
|
|
216
|
+
`bca inspect`, and `bca codegraph` are now `bca export --view report`,
|
|
217
|
+
`--view <view>`, `--watch`, `--format json`, and `--view catalog`; `-o`
|
|
218
|
+
replaces `--output-dir`. `bca init` is part of `bca setup`, and
|
|
219
|
+
`bca capabilities` is `bca help --format json`. `bca <app-root>` is no
|
|
220
|
+
longer a shortcut; the interactive views are in the VS Code extension. See
|
|
221
|
+
the table in the CLI reference.
|
|
222
|
+
- The journey diagram shows each scenario with its permission set and number
|
|
223
|
+
of steps. `[NEXT]` and `[REQUIRES]` between the same scenarios are one
|
|
224
|
+
arrow in flow direction; `[ALTERNATIVE]` and `[RELATED]` are dashed lines.
|
|
225
|
+
|
|
226
|
+
### Fixed
|
|
227
|
+
|
|
228
|
+
- The warehouse example declares `using BCA.Example.UI;` for the page its
|
|
229
|
+
permission set grants; the AL compiler reported it as missing.
|
|
230
|
+
- The 3D explorer inside the panel follows a dark theme: it now asks for the
|
|
231
|
+
theme once its graph is unpacked, instead of missing the message sent while
|
|
232
|
+
it was still loading.
|
|
233
|
+
- Namespace-qualified references such as
|
|
234
|
+
`Record Microsoft.Sales.Document."Sales Header"`,
|
|
235
|
+
`TableData Microsoft.Sales.Document."Sales Line" = R`, and
|
|
236
|
+
`Database::Microsoft.Sales.Document."Sales Header"` resolve to their object
|
|
237
|
+
instead of an unresolved object named `Microsoft`.
|
|
238
|
+
- The call view no longer slows down quadratically on large apps: resolving
|
|
239
|
+
calls in the Base Application takes about 2.5 instead of 70 seconds.
|
|
240
|
+
|
|
241
|
+
- Steps on quoted fields and actions, such as
|
|
242
|
+
`SalesOrder."Sell-to Customer No.".SetValue(...)`, are no longer dropped from
|
|
243
|
+
generated documentation.
|
|
244
|
+
|
|
245
|
+
## 0.7.0 - 2026-10-04
|
|
246
|
+
|
|
247
|
+
### Added
|
|
248
|
+
|
|
249
|
+
- Documentation website on GitHub Pages
|
|
250
|
+
(https://schulzoli.github.io/BC-Atlas/), built with VitePress from the
|
|
251
|
+
repository Markdown, with search, a sidebar by feature area, and the
|
|
252
|
+
generated examples.
|
|
253
|
+
- `bca setup`: guided setup of features, Git hooks (Husky or plain Git),
|
|
254
|
+
pipelines (GitHub Actions or Azure Pipelines), cron schedules, and sync of
|
|
255
|
+
generated files, as a terminal wizard or with `--yes`.
|
|
256
|
+
- `bca setup plan` and `bca setup apply`: the same setup as detectable facts,
|
|
257
|
+
questions with recommendations, and a validated, idempotent apply with
|
|
258
|
+
`--dry-run`.
|
|
259
|
+
- `bca setup --editor vscode`: VS Code tasks for the local loop: health check
|
|
260
|
+
with findings in the Problems panel, report and docs builds, hook dry runs,
|
|
261
|
+
a live architecture diagram, and the setup wizard. Existing tasks are kept.
|
|
262
|
+
- `bca setup agent --agent claude|copilot|cursor`: a `/bca-setup` command that
|
|
263
|
+
lets the user's AI agent guide the setup through the CLI.
|
|
264
|
+
- `bca run --trigger pre-commit|pre-push|ci|schedule`: one entry point for
|
|
265
|
+
every trigger, configured in the new `automation` section of `.bca.json`,
|
|
266
|
+
with `verify` and `stage` sync and `docs`, `codegraph`, and `diagrams` tasks.
|
|
267
|
+
- A GitHub Action (`uses: SchulzOli/BC-Atlas@v0.7.0`) with `outputs` and
|
|
268
|
+
`passed` outputs.
|
|
269
|
+
- MCP tools `bc_atlas_setup_plan`, `bc_atlas_setup_apply`, `bc_atlas_run`, and
|
|
270
|
+
`bc_atlas_update_check`.
|
|
271
|
+
- Update cycle: interactive commands show a notice when a newer version is
|
|
272
|
+
available (checked at most once a day in the background, off in CI, hooks,
|
|
273
|
+
`bca run`, and JSON output, or with `BCA_NO_UPDATE_CHECK`).
|
|
274
|
+
- `bca update`: release notes since the installed version, a confirmed update
|
|
275
|
+
of the global or project installation, and regenerated hooks, VS Code tasks,
|
|
276
|
+
pipelines, and agent commands. `--check` exits with `1` when an update exists.
|
|
277
|
+
- `bca setup --updates dependabot`: Dependabot pull requests for new
|
|
278
|
+
`bc-atlas` versions; `bca setup apply --from-config` reproduces an existing
|
|
279
|
+
setup.
|
|
280
|
+
- With a `package.json` that declares `bc-atlas`, generated pipelines and VS
|
|
281
|
+
Code tasks use that version (`npm ci`, `npx --no-install bca`).
|
|
282
|
+
- `bca docs generate` presents scenarios in the structure of an OASIS DITA 1.3
|
|
283
|
+
task topic (prerequisites, steps, step results, result, related links).
|
|
284
|
+
The AL tags are unchanged.
|
|
285
|
+
- `--export markdown,html,dita,ado-csv`: Markdown, one self-contained HTML
|
|
286
|
+
file, DITA 1.3 task topics with a map, and an Azure DevOps Test Plans CSV.
|
|
287
|
+
- `--as testcase`: test case specification with preconditions, an
|
|
288
|
+
action/expected result/pass-fail table, and a sign-off block.
|
|
289
|
+
- `--app`: real page, field, part, and action captions and tooltips from the
|
|
290
|
+
app's AL source, plus page and action coverage in the index.
|
|
291
|
+
- `--language`: German and English wording; captions and tooltips from the
|
|
292
|
+
app's XLIFF translations.
|
|
293
|
+
- Use-case pages per `[FEATURE]`, a journey diagram of scenario links, and
|
|
294
|
+
indexes by page and permission set.
|
|
295
|
+
- `[THEN]` between two `[WHEN]` phases becomes the result of that phase.
|
|
296
|
+
- The MCP tool `bc_atlas_docs_generate` accepts formats, mode, app, and
|
|
297
|
+
language.
|
|
298
|
+
- Generated example documentation in `examples/docs`.
|
|
299
|
+
|
|
300
|
+
### Changed
|
|
301
|
+
|
|
302
|
+
- Instructions follow Business Central help conventions ("Choose the 🔍
|
|
303
|
+
icon, enter ...", "In the **Field** field, enter ...", "Choose the
|
|
304
|
+
**Action** action."). Scenarios with one `[WHEN]` phase list their
|
|
305
|
+
instructions as top-level steps; repeated blocks become sub-steps.
|
|
306
|
+
- Node.js 22 or later is required; Node.js 20 reached end of life in April 2026.
|
|
307
|
+
The Docker image and generated pipelines use Node.js 24.
|
|
308
|
+
- CI runs once per pull request instead of twice, starts with one fast check
|
|
309
|
+
job, then tests Node.js 22 and 24 on Linux and Node.js 24 on Windows.
|
|
310
|
+
|
|
311
|
+
## 0.6.0 - 2026-10-04
|
|
312
|
+
|
|
313
|
+
### Added
|
|
314
|
+
|
|
315
|
+
- `bca init` creates a `.bca.json` tailored to the project: app title, excluded
|
|
316
|
+
test folders, and source links for GitHub, GitLab, or Azure DevOps remotes.
|
|
317
|
+
- `bca report` writes a static Markdown architecture report with an
|
|
318
|
+
at-a-glance table, diagrams for six views, the health summary, and optional
|
|
319
|
+
object catalog and JSON model.
|
|
320
|
+
- `bca check` evaluates architecture health (diagnostics, forbidden
|
|
321
|
+
dependencies, cycles, fan-in/fan-out hot spots, orphans, unresolved
|
|
322
|
+
references) with `--fail-on` levels and text, JSON, or Markdown output.
|
|
323
|
+
- `bca mcp` starts the MCP server; new MCP tools `bc_atlas_check` and
|
|
324
|
+
`bc_atlas_report`.
|
|
325
|
+
- `bca help <command>` and per-command `--help` with grouped options and
|
|
326
|
+
examples; `bca` without arguments shows all features by area.
|
|
327
|
+
- Feature areas and views in the `bca capabilities` contract.
|
|
328
|
+
- `check` and `report` sections in `.bca.json`.
|
|
329
|
+
- Example report in `examples/report`, regenerated by `npm run examples`.
|
|
330
|
+
- Public contribution, support, conduct, and security policies.
|
|
331
|
+
- Reproducible example project, generated diagrams, and feature screenshots.
|
|
332
|
+
|
|
333
|
+
### Changed
|
|
334
|
+
|
|
335
|
+
- Every command is defined once in `src/capabilities.js`; help, parsing, enum
|
|
336
|
+
validation, the JSON contract, and generated docs derive from it.
|
|
337
|
+
- Commands only accept their own options and validate enum values; invalid
|
|
338
|
+
usage exits with code `2`, failed operations and checks with `1`.
|
|
339
|
+
- `[app-root]` defaults to the current directory.
|
|
340
|
+
- Clearer errors for missing paths, empty results, and unknown commands.
|
|
341
|
+
- Several views of one project share a single parse.
|
|
342
|
+
- Documentation reorganized by feature area; repository URLs point to
|
|
343
|
+
`SchulzOli/BC-Atlas`.
|
|
344
|
+
- The npm package ships only runtime files.
|
|
345
|
+
- Updated `@modelcontextprotocol/server`, `zod`, and `web-tree-sitter` (0.27).
|
|
346
|
+
|
|
347
|
+
### Removed
|
|
348
|
+
|
|
349
|
+
- The local web Control Center: `bca serve`, `bca docs serve`, and the
|
|
350
|
+
`marked` and `dompurify` dependencies. Use `bca report` for a browsable
|
|
351
|
+
overview.
|
|
352
|
+
|
|
353
|
+
### Fixed
|
|
354
|
+
|
|
355
|
+
- Rendering more than one SVG in a single process could exit early because the
|
|
356
|
+
D2 worker was unreferenced between renders.
|
|
357
|
+
- `bca-mcp` did not start when invoked through an npm bin symlink.
|
|
358
|
+
- `codegraph` no longer deletes a non-empty output directory that it did not
|
|
359
|
+
generate.
|
|
360
|
+
|
|
361
|
+
## 0.5.0 - 2026-07-30
|
|
362
|
+
|
|
363
|
+
### Added
|
|
364
|
+
|
|
365
|
+
- Project, module, object, data, call, boundary, contracts, events, UI, and
|
|
366
|
+
workflow diagram views.
|
|
367
|
+
- D2, JSON, and WebAssembly-rendered SVG output.
|
|
368
|
+
- AL UI-test-to-Markdown documentation generation.
|
|
369
|
+
- Configuration, watch mode, diagnostics, dependency policies, and Docker
|
|
370
|
+
support.
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 BC Atlas contributors
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 BC Atlas contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|