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.
Files changed (122) hide show
  1. package/.bca.example.json +98 -10
  2. package/CHANGELOG.md +370 -0
  3. package/LICENSE +21 -21
  4. package/README.md +227 -260
  5. package/THIRD_PARTY_NOTICES.md +17 -0
  6. package/package.json +34 -16
  7. package/src/al/compiler.js +349 -0
  8. package/src/al/index.js +184 -0
  9. package/src/al/settings.js +166 -0
  10. package/src/al/toolchain.js +234 -0
  11. package/src/analyzer.js +683 -90
  12. package/src/app/page.js +54 -0
  13. package/src/app/service.js +63 -0
  14. package/src/app/snapshot.js +82 -0
  15. package/src/app/ui/app.css +281 -0
  16. package/src/app/ui/app.js +1023 -0
  17. package/src/app/ui/index.html +53 -0
  18. package/src/app/worker.js +32 -0
  19. package/src/app/workspace.js +362 -0
  20. package/src/architecture.js +169 -0
  21. package/src/automation/agent.js +72 -0
  22. package/src/automation/config.js +119 -0
  23. package/src/automation/dependabot.js +36 -0
  24. package/src/automation/git.js +47 -0
  25. package/src/automation/pipelines.js +229 -0
  26. package/src/automation/run.js +137 -0
  27. package/src/automation/setup.js +556 -0
  28. package/src/automation/starter.js +88 -0
  29. package/src/automation/vscode.js +113 -0
  30. package/src/blueprint/annotate.js +50 -0
  31. package/src/blueprint/baseline.js +54 -0
  32. package/src/blueprint/components.js +176 -0
  33. package/src/blueprint/evaluate.js +546 -0
  34. package/src/blueprint/extract.js +321 -0
  35. package/src/blueprint/index.js +114 -0
  36. package/src/blueprint/ownership.js +54 -0
  37. package/src/blueprint/propose.js +401 -0
  38. package/src/blueprint/report.js +253 -0
  39. package/src/blueprint/resolutions.js +151 -0
  40. package/src/blueprint/surface.js +212 -0
  41. package/src/call-analysis.js +103 -0
  42. package/src/capabilities.js +631 -0
  43. package/src/cli/args.js +76 -0
  44. package/src/cli/errors.js +24 -0
  45. package/src/cli/help.js +146 -0
  46. package/src/cli.js +94 -338
  47. package/src/codegraph.js +454 -0
  48. package/src/commands/blueprint.js +69 -0
  49. package/src/commands/check.js +61 -0
  50. package/src/commands/explore.js +32 -0
  51. package/src/commands/export.js +170 -0
  52. package/src/commands/refactor.js +55 -0
  53. package/src/commands/report.js +183 -0
  54. package/src/commands/run.js +28 -0
  55. package/src/commands/setup.js +179 -0
  56. package/src/commands/update.js +144 -0
  57. package/src/d2.js +147 -46
  58. package/src/docs/al-ui-source.js +201 -133
  59. package/src/docs/al-ui-writer.js +141 -0
  60. package/src/docs/automation.js +109 -0
  61. package/src/docs/captions.js +201 -0
  62. package/src/docs/cli.js +139 -34
  63. package/src/docs/export.js +143 -0
  64. package/src/docs/markdown.js +18 -64
  65. package/src/docs/model.js +147 -0
  66. package/src/docs/phrases.js +291 -0
  67. package/src/docs/process.js +419 -0
  68. package/src/docs/render/bpmn.js +131 -0
  69. package/src/docs/render/csv.js +24 -0
  70. package/src/docs/render/dita.js +84 -0
  71. package/src/docs/render/format.js +46 -0
  72. package/src/docs/render/html.js +212 -0
  73. package/src/docs/render/markdown.js +243 -0
  74. package/src/docs/render/process-svg.js +142 -0
  75. package/src/docs/steps.js +166 -0
  76. package/src/docs/tags.js +107 -0
  77. package/src/docs/task.js +317 -0
  78. package/src/graph/coupling.js +44 -0
  79. package/src/graph/document.js +149 -0
  80. package/src/graph/history.js +286 -0
  81. package/src/graph/html.js +51 -0
  82. package/src/graph/lenses/dependency.js +418 -0
  83. package/src/graph/lenses/index.js +19 -0
  84. package/src/graph/metrics.js +118 -0
  85. package/src/graph/temporal.js +99 -0
  86. package/src/graph/viewer/template.html +76 -0
  87. package/src/graph/viewer/viewer.css +198 -0
  88. package/src/graph/viewer/viewer.js +1470 -0
  89. package/src/health.js +339 -0
  90. package/src/insights.js +1 -1
  91. package/src/mcp.js +440 -0
  92. package/src/operation-semantics.js +15 -0
  93. package/src/output.js +89 -0
  94. package/src/permission-semantics.js +71 -0
  95. package/src/refactor/diff.js +72 -0
  96. package/src/refactor/move.js +288 -0
  97. package/src/refactor/surface.js +107 -0
  98. package/src/relation-aggregation.js +33 -0
  99. package/src/resolver.js +97 -15
  100. package/src/sarif.js +65 -0
  101. package/src/svg.js +33 -8
  102. package/src/symbols.js +163 -0
  103. package/src/ui/theme.css +143 -0
  104. package/src/update-worker.js +9 -0
  105. package/src/update.js +131 -0
  106. package/src/views.js +357 -79
  107. package/src/workflow.js +24 -65
  108. package/docs/al-ui-test-documentation.md +0 -126
  109. package/docs/cli-reference.md +0 -242
  110. package/examples/README.md +0 -32
  111. package/examples/output/project.d2 +0 -86
  112. package/examples/output/project.svg +0 -225
  113. package/examples/output/ui.d2 +0 -47
  114. package/examples/output/ui.svg +0 -166
  115. package/examples/output/workflow.d2 +0 -56
  116. package/examples/output/workflow.svg +0 -194
  117. package/examples/warehouse-app/Automation.al +0 -24
  118. package/examples/warehouse-app/Inventory.al +0 -46
  119. package/examples/warehouse-app/WarehouseUI.al +0 -29
  120. package/examples/warehouse-app/app.json +0 -8
  121. package/scripts/generate-examples.js +0 -56
  122. 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
- "namespaces": ["Contoso.**"],
7
- "exclude": ["**/test/**"],
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": ["ProcessDocument"],
24
+ "entries": [
25
+ "ProcessDocument"
26
+ ],
14
27
  "depth": 8,
15
28
  "maxNodes": 100,
16
29
  "maxEdges": 250,
17
- "edgeTypes": ["calls", "events", "writes"],
30
+ "edgeTypes": [
31
+ "calls",
32
+ "events",
33
+ "writes"
34
+ ],
18
35
  "phases": {
19
- "Validation": ["Validate*"],
20
- "Processing": ["Process*", "Post*"]
36
+ "Validation": [
37
+ "Validate*"
38
+ ],
39
+ "Processing": [
40
+ "Process*",
41
+ "Post*"
42
+ ]
21
43
  },
22
- "stop": ["Finalize*"],
23
- "collapse": ["*Telemetry*"]
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/main/{file}#L{line}",
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.