Open-source: Apache-2.0 + public repository
The project is now open-source under the Apache-2.0 License and public on
GitHub (Mustry-Solutions/mustry-perspective-component-module). The module is
free (isFreeModule = true), so source and binary are both open. The
install-time notice (license.html) was rewritten to align with Apache-2.0
(dropping the old no-redistribute / no-reverse-engineer clauses) and finalized:
legal entity Mustry Solutions BV (BE 0790.722.422), professional/business
use, sharpened safety-critical language (not certified for safety-instrumented
/ life-safety functions), "to the maximum extent permitted by applicable law"
and non-excludable-liability carve-outs, and a no-data-collection statement.
Added THIRD-PARTY-NOTICES.md listing the ~222 bundled open-source
components and their licenses (mostly MIT/BSD/ISC). Added community-health
files (CONTRIBUTING with a DCO flow,
CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS), README badges and
a "Licensing & support" section, Dependabot config (minor/patch + security;
majors taken deliberately), and least-privilege CI permissions.
Documentation
Refreshed the user manual (§ Branching) and code comments to match the current
layered layout and feature set (arrows, orientation, edge styling, markdown
info card, output.warnings); fixed stale identity/links.
Dependencies
Gradle 8→9 (verified: signed build + e2e pass); GitHub Actions bumped
(checkout/setup-java/cache/upload-artifact); @inductiveautomation/perspective-client
2.3.7→2.3.8 and other npm minor/patch updates.
Branching Diagram: richer edge model (per-edge colour / style / width)
data.edgeLabels entries now carry optional color, style
(solid/dashed/dotted) and width alongside label — so an edge
can be, say, a dashed red fallback branch instead of inheriting the source
node's colour and the global config.lineWidth. Purely additive (existing
{from, to, label} entries are unchanged; no override = the old defaults),
so it passes the additive-only schema guard. Each connector SVG also gains a
data-edge="<from>-<to>" attribute for targeting. Demo /branching-labels
now colours/dashes its branches; +1 e2e.
Branching Diagram: layered layout (replaces BFS + forward-push)
The layout is now layered/Sugiyama-style: a DFS cycle-break classifies
back-edges, then longest-path layer assignment sets each node's column.
The original BFS pushed a re-referenced node and its whole subtree right to
keep every arrow pointing forward — a single rework loop inflated the graph
(a long empty connector, nodes clustered far right). Longest-path keeps the
layers compact and draws the loop as a backward connector (which already
routes clear of intervening nodes). Same data contract and category→row
model; only the column assignment changed. This is a deliberate divergence
from the ported original (whose loop handling stays as-is). +1 jest case
(a loop no longer inflates maxX); the existing demos render more compactly.