From 5f30729bb62907cc44414202cba3ff1d33d7bb98 Mon Sep 17 00:00:00 2001 From: Tom Bursch Date: Mon, 1 Dec 2025 12:46:17 +0100 Subject: [PATCH 01/12] Add Website --- .github/workflows/prepare_pages.yml | 52 +++ docs/GettingStarted/Editor.md | 21 ++ docs/GettingStarted/HelloWorld.md | 3 + docs/GettingStarted/Setup.md | 27 ++ docs/GettingStarted/index.md | 17 + docs/Usage/error.md | 12 + docs/Usage/index.md | 20 ++ docs/assets/images/icon-mono.png | Bin 0 -> 4421 bytes docs/assets/images/icon.png | Bin 0 -> 5390 bytes docs/assets/images/waves.svg | 55 ++++ docs/index.md | 146 +++++++++ docs/overrides/landingpage.html | 107 +++++++ docs/overrides/main.html | 24 ++ docs/overrides/partials/tabs-item.html | 43 +++ docs/stylesheets/extra.css | 103 ++++++ docs/stylesheets/landingpage.css | 420 +++++++++++++++++++++++++ mkdocs.yml | 75 +++++ 17 files changed, 1125 insertions(+) create mode 100644 .github/workflows/prepare_pages.yml create mode 100644 docs/GettingStarted/Editor.md create mode 100644 docs/GettingStarted/HelloWorld.md create mode 100644 docs/GettingStarted/Setup.md create mode 100644 docs/GettingStarted/index.md create mode 100644 docs/Usage/error.md create mode 100644 docs/Usage/index.md create mode 100644 docs/assets/images/icon-mono.png create mode 100644 docs/assets/images/icon.png create mode 100644 docs/assets/images/waves.svg create mode 100644 docs/index.md create mode 100644 docs/overrides/landingpage.html create mode 100644 docs/overrides/main.html create mode 100644 docs/overrides/partials/tabs-item.html create mode 100644 docs/stylesheets/extra.css create mode 100644 docs/stylesheets/landingpage.css create mode 100644 mkdocs.yml diff --git a/.github/workflows/prepare_pages.yml b/.github/workflows/prepare_pages.yml new file mode 100644 index 00000000..fdedf92b --- /dev/null +++ b/.github/workflows/prepare_pages.yml @@ -0,0 +1,52 @@ +# (c) https://github.com/MontiCore/monticore + +# .github/workflows/prepare_pages.yml +name: Prepare and deploy pages + +# Preprocess the docs, build a site directory and push its contents to the gh-pages branch + +concurrency: # run this test workflow only once per branch + group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + push: + branches: + - master + paths: + - docs/** + - mkdocs.yml + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + env: + GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }} + name: Build and Push + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup python + uses: actions/setup-python@v4 + with: + python-version: '3.9' + + - name: Install python packages + run: | + python -m pip install --upgrade pip + pip install mkdocs mkdocs-material mike + git clone https://monticore:$GITLAB_TOKEN@git.rwth-aachen.de/se/infrastructure/monticore-pygments-highlighting.git + pip install -r ./monticore-pygments-highlighting/requirements.txt + pip install ./monticore-pygments-highlighting + + - name: Configure Git user + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + + - name: Build and deploy pages + run: mkdocs gh-deploy --force diff --git a/docs/GettingStarted/Editor.md b/docs/GettingStarted/Editor.md new file mode 100644 index 00000000..52e42d34 --- /dev/null +++ b/docs/GettingStarted/Editor.md @@ -0,0 +1,21 @@ +--- +hide: + - toc +--- + +# Tools & Editors + +You have multiple options to choose from for working with MontiArc. +You can build MontiArc models with any text editor or integrated development environment (IDE) in combination with the [CLI](./Setup.md#run-the-cli). + +Though there are some editors that provide a better experience for SysML. + + +## Visual Studio Code + +1. To install VS Code, follow their [instructions](https://code.visualstudio.com/docs/setup/setup-overview). +2. Install the MontiArc extension. + 1. [Download](https://github-registry-files.githubusercontent.com/758456656/1b847700-819d-11f0-8dad-cb32a1bfe312?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20250916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250916T120634Z&X-Amz-Expires=300&X-Amz-Signature=8856e041f06680f48963357fe24467e82f549ab877f3902d9bbe5dc381c649c8&X-Amz-SignedHeaders=host&response-content-disposition=filename%3Dlanguage-server-7.6.1-10-vscode.vsix&response-content-type=application%2Foctet-stream) the `.vsix` extension. + 2. Start VS Code. + 3. Go to the extension tab → Click `...` → Install from VSIX → Select the previously downloaded extension. + diff --git a/docs/GettingStarted/HelloWorld.md b/docs/GettingStarted/HelloWorld.md new file mode 100644 index 00000000..9d3cf517 --- /dev/null +++ b/docs/GettingStarted/HelloWorld.md @@ -0,0 +1,3 @@ + +# Hello, World! +You're now ready to start with your first system. diff --git a/docs/GettingStarted/Setup.md b/docs/GettingStarted/Setup.md new file mode 100644 index 00000000..52c2f3f9 --- /dev/null +++ b/docs/GettingStarted/Setup.md @@ -0,0 +1,27 @@ + +# Setup SysML v2 + +SysML v2 runs on any platform. In the following tutorials, we will use the CLI. + + +#### Run the CLI + +To run the CLI manually, you need to have [Java 21](https://www.oracle.com/de/java/technologies/downloads/#java21) installed. +Next, download the [SysML v2 Tool jar](https://www.monticore.de/download/MCSysMLv2.jar). + +You can then run the tool with: + +```bash +java -jar MCSysMLv2.jar +``` + +exemplary usage: + +``` +java -jar MCSysMLv2.jar -h +java -jar MCSysMLv2.jar -i Car.sysml -pp +``` + +--- + +You can find detailed descriptions and available parameters in the [usage](../Usage/index.md) section. diff --git a/docs/GettingStarted/index.md b/docs/GettingStarted/index.md new file mode 100644 index 00000000..bce121f5 --- /dev/null +++ b/docs/GettingStarted/index.md @@ -0,0 +1,17 @@ +--- +icon: material/rocket-launch +hide: + - toc +--- + +# Getting Started + +Let's start your SysML journey! In this chapter, we will show you how to start your first Project and introduce you to the basic concepts of SysML. + + +!!! info "Tip" + Simply click on *next (Setup)* on the bottom right to go to the next step of installing our SysML tooling. + +!!! question "Found a problem with the documentation?" + If you find an error or something is not understandable, please file an [issue](../index.md#found-an-issue) for it. + This will help others reading the documentation in the future. \ No newline at end of file diff --git a/docs/Usage/error.md b/docs/Usage/error.md new file mode 100644 index 00000000..ad7c1610 --- /dev/null +++ b/docs/Usage/error.md @@ -0,0 +1,12 @@ +**Note**: These codes are preliminary for now. + +| Code | Reason | +|---------|----------------------------------------------------| +| 0x00xxx | CLI Tool | +| 0x10xxx | CoCos | +| 0xD0xxx | ST serialization | +| 0x80xxx | Type Check (CoCo) | +| 0x81xxx | Type Derivation (might happen while ST completion) | +| 0x90xxx | Refinement related | +| 0xFFxxx | Verification-specific | +| 0xA0xxx | Internal error | diff --git a/docs/Usage/index.md b/docs/Usage/index.md new file mode 100644 index 00000000..336a8d3c --- /dev/null +++ b/docs/Usage/index.md @@ -0,0 +1,20 @@ +--- +hide: + - toc +--- + + +# Usage + +`java -jar MCSysMLv2.jar [-h] -i [-path

] [-pp []] [-s []]` + +| Option | Explanation | +|--------------------------|--------------------------------------------------------------------------------------------| +| -ex,--extended | Runs additional checks assuring models are fit for semantic analysis using [MontiBelle][https://www.se-rwth.de/projects/#MontiBelle] | +| -h,--help | Prints this help dialog | +| -i,--input | Reads the source file (mandatory) and parses the contents | +| -path | Sets the artifact path for imported symbols, space separated. | +| -pp,--prettyprint | Prints the AST to stdout or the specified file (optional) | +| -r,--report

| Prints reports of the artifact to the specified directory. | +| -s,--symboltable | Serialized the Symbol table of the given artifact. | +| -v,--version | Prints version information | \ No newline at end of file diff --git a/docs/assets/images/icon-mono.png b/docs/assets/images/icon-mono.png new file mode 100644 index 0000000000000000000000000000000000000000..9e735d0978ed5459b09fc02cd25fc4e39b495bc4 GIT binary patch literal 4421 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/icon.png b/docs/assets/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdb22a3edd4546d8c2ad2bf050ecee7e0db53a3 GIT binary patch literal 5390 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 YBE39#WGqQx{1Ifr8Jc6N(9Y5S1G!zyfdBvi literal 0 HcmV?d00001 diff --git a/docs/assets/images/waves.svg b/docs/assets/images/waves.svg new file mode 100644 index 00000000..b3eaa79d --- /dev/null +++ b/docs/assets/images/waves.svg @@ -0,0 +1,55 @@ + + + + + + + + diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..01990ede --- /dev/null +++ b/docs/index.md @@ -0,0 +1,146 @@ +--- +template: landingpage.html +title: Modeling Systems +hide: + - navigation + - toc +--- + + +

+ + SysMLv2 + +

+ +# The Systems Modeling Language v2 + +One of the interesting new capabilities is the exchange of models +between tools using a really human readable textual form of the SysML +language in the spirit of a modern programming language (even though it +has a number of special constructs that resemble modelling concepts). + +```sysmlv2 +standard library package 'Vehicles' { + import ISQ::TorqueValue; + import ScalarValues::*; + part def Automobile; + alias Car for Automobile; + alias Torque for ISQ::TorqueValue; +} +``` + +This textual form will play a major role in the exchange of models +between tools thus allowing to build toolchains, as well as in the +versioning of models, e.g., in Github, and also in the efficient +definition of models by people who prepare textual notations. + +It is therefore highly relevant to have consistent parsing mechanisms +available. The [SysML v2 +Pilot-Implementation](https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation) +contains a parser for this textual notation. + +We know from the definition of programming languages, that it is, +however, helpful to provide a second source parser, such that parsing +results can be compared and therefore compilers, linters, checkers of +context conditions and other advanced tooling, receive the level of +quality desired for industrial use. + +
+ +- :material-rocket-launch:   + __Getting Started__ + + --- + + Is this your first time using SysML? Set up a project and start modeling. + + --- + + [:octicons-arrow-right-24: Take the Tour](./GettingStarted/index.md)
+ [:octicons-arrow-right-24: Installation & Setup](./GettingStarted/Setup.md) + +- :material-tools:   + __Usage__ + + --- + + Learn how to use the tooling.

+ + --- + + [:octicons-arrow-right-24: Read more](./Usage/index.md) + +- :material-license:   + __License__ + + --- + + Learn about the license and how you can use the generated code. + + --- + + [:octicons-arrow-right-24: Read more](https://monticore.github.io/monticore/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/) + +
+ +
+
+

Get Started with SysML Today!

+Discover Component-Based Modeling + + + Take the Tour + + + + +
+
+ +## Found an issue? + +This SysML v2 tooling is actively maintained by the [Chair of Software Engineering](https://www.se-rwth.de/). +There are multiple ways in which you can improve it to help you and others who might encounter the same issues in the future. + +
+ +- :material-lightbulb-on-20:   + __Want to submit an idea?__ + + --- + + Propose a change, feature request, or suggest an improvement + + --- + + [:octicons-arrow-right-24: Request a change](https://github.com/MontiCore/sysmlv2/issues/new) + +- :material-source-pull:   + __Want to create a pull request?__ + + --- + + Open an issue first and then create a comprehensive and useful pull request + + --- + + [:octicons-arrow-right-24: Set up your development environment](https://github.com/MontiCore/sysmlv2/blob/dev/README.md)
+ [:octicons-arrow-right-24: Create a pull request](https://github.com/MontiCore/sysmlv2/pulls) +
+ +!!! info "Hint" + Before submitting an issue, make sure to: + + - Check that no similar issue already exists [here](https://github.com/MontiCore/sysmlv2/issues) + - You provided all the information needed to understand the issue + +## Further Information + +Find more information about MontiArc and other projects and publications by the Chair of Software Engineering under the following links: + +* [Setup](./GettingStarted/Setup.md) +* [Publications](https://www.se-rwth.de/publications/) +* [SysML v2](https://www.omg.org/sysml/sysmlv2/) +* [MontiArc](https://github.com/MontiCore/montiarc) +* [License](https://github.com/MontiCore/monticore/blob/HEAD/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL.md) diff --git a/docs/overrides/landingpage.html b/docs/overrides/landingpage.html new file mode 100644 index 00000000..e77aec5b --- /dev/null +++ b/docs/overrides/landingpage.html @@ -0,0 +1,107 @@ +{% extends "main.html" %} + + +{% block tabs %} +{{ super() }} + + + +
+
+
+
+

+ Modeling Systems with SysML v2 +

+ +

+ A standard compliant SysML v2 parser and model checker with a strong type system and semantic + foundation. +

+ +
+
+ + + + + Model validation +
+
+ + + + + Simulation Framework +
+
+ + +
+ +
+
+
+
+ + + +
+
Door.arc
+
+
+
package elevator;
+
+component Door {
+  port in boolean shouldOpen;
+
+  automaton {
+    initial state Closed;
+    state Open;
+
+    Closed -> Open [shouldOpen == true] shouldOpen / {
+      System.out.println("Door has opened");
+    }
+    Open -> Closed [shouldOpen == false] shouldOpen / {
+      System.out.println("Door has closed");
+    }
+  }
+}
+
+
+ +
+
+
+
+
+
+
+
+ +
+{% endblock %} + +{% block footer %} + +{{ super() }} +{% endblock %} diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 00000000..11db0eec --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,24 @@ + +{% extends "base.html" %} + +{% block extrahead %} + {{ super() }} + + + +{% endblock %} + + diff --git a/docs/overrides/partials/tabs-item.html b/docs/overrides/partials/tabs-item.html new file mode 100644 index 00000000..4228f564 --- /dev/null +++ b/docs/overrides/partials/tabs-item.html @@ -0,0 +1,43 @@ + +{% macro render_content(nav_item, ref = nav_item) %} + + + + {{ ref.title }} +{% endmacro %} + + +{% macro render(nav_item, ref = nav_item) %} + + + {% set class = "md-tabs__item" %} + {% if ref.active %} + {% set class = class ~ " md-tabs__item--active" %} + {% endif %} + + + {% if nav_item.children %} + {% set first = nav_item.children | first %} + + + {% if first.children %} + {{ render(first, ref) }} + + + {% else %} +
  • + + {{ render_content(first, ref) }} + +
  • + {% endif %} + + + {% else %} +
  • + + {{ render_content(nav_item) }} + +
  • + {% endif %} +{% endmacro %} diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 00000000..189af426 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,103 @@ +html { + scroll-behavior: smooth; +} + +:root { + --rwth-blau: #00549F; + --rwth-blau-50: #8EBAE5; + --rwth-blau-10: #E8F1FA; + --rwth-magenta: #E30066; + --rwth-gelb: #FFED00; + --rwth-petrol: #006165; + --rwth-tuerkis: #0098A1; + --rwth-gruen: #57AB27; + --rwth-maigruen: #BDCD00; + --rwth-orange: #F6A800; + --rwth-rot: #CC071E; + --rwth-bordeaux: #A11035; + --rwth-violet: #612158; + --rwth-lila: #7A6FAC; + + --md-primary-fg-color: var(--rwth-blau); + --md-primary-fg-color--light: var(--rwth-blau); + --md-primary-fg-color--dark: var(--rwth-blau); + --md-accent-fg-color: var(--rwth-blau-50); + --md-accent-fg-color--transparent: #00549F25; + + --md-code-hl-color: var(--rwth-blau-50); + --md-code-hl-color--light: var(--rwth-blau-50); + --md-code-hl-number-color: var(--rwth-rot); + --md-code-hl-special-color: var(--rwth-bordeaux); + --md-code-hl-function-color: var(--rwth-violet); + --md-code-hl-constant-color: var(--rwth-lila); + --md-code-hl-keyword-color: var(--rwth-blau); + --md-code-hl-string-color: var(--rwth-gruen); +} + +.md-main { + overflow-x: hidden; +} + +.md-typeset .admonition.info, +.md-typeset details.info { + border-color: var(--md-accent-fg-color); +} + +.md-typeset .info>.admonition-title, +.md-typeset .info>summary { + background-color: var(--rwth-blau-10); +} + +.md-typeset .info>.admonition-title::before, +.md-typeset .info>summary::before { + background-color: var(--md-accent-fg-color); +} + +.md-header__topic { + height: inherit; +} + +@media screen and (min-width:60em) { + .md-search__form { + border-radius: 500px; + } +} + +.full-width { + width: 100vw; + max-width: 100vw; + left: 50%; + position: relative; + margin-left: -50vw; + margin-top: 3rem; + margin-bottom: 3rem; + padding: 1.5rem 0.8rem; +} + +.bg-primary { + background-color: var(--md-primary-fg-color); + color: #fffffff0; + --md-default-fg-color--lightest: #ffffff12; + --md-admonition-bg-color: #ffffff08; + --md-admonition-fg-color: #fffffff0; + --md-typeset-a-color: var(--rwth-orange); +} + +.section-card { + margin-left: -5%; + margin-right: -5%; + padding: 5px 5% 1em 5%; + border-radius: 20px; + background-color: var(--md-primary-fg-color); + box-shadow: 10px 10px 10px #5a5a5a22, 0px 0px 10px #5a5a5a22; + color: #fffffff0; + --md-default-fg-color--lightest: #ffffff12; + --md-admonition-bg-color: #ffffff08; + --md-admonition-fg-color: #fffffff0; + --md-typeset-a-color: var(--rwth-orange); +} + +.section-card a:hover, +.section-card a:focus { + color: var(--rwth-gelb); +} \ No newline at end of file diff --git a/docs/stylesheets/landingpage.css b/docs/stylesheets/landingpage.css new file mode 100644 index 00000000..fa47ba16 --- /dev/null +++ b/docs/stylesheets/landingpage.css @@ -0,0 +1,420 @@ +/* Root styles for proper mobile handling */ +.hero-section { + background: linear-gradient(var(--rwth-blau), var(--rwth-blau-50)); + width: 100%; + overflow-x: hidden; + display: flex; + flex-direction: column; +} + +.hero-container { + max-width: 100%; + margin: auto; + padding: 0 1rem 1rem; + box-sizing: border-box; +} + +.hero-content { + display: grid; + grid-template-columns: 4fr 3fr; + gap: 3rem; + align-items: center; + max-width: 61rem; + margin: 0 auto; + box-sizing: border-box; +} + +.hero-text { + width: 100%; + min-width: 0; + box-sizing: border-box; +} + +.hero-title { + font-size: clamp(1.75rem, 4vw, 3.5rem); + font-weight: 700; + line-height: 1.1; + color: white; + margin-bottom: 1.5rem; + word-wrap: break-word; + overflow-wrap: break-word; + hyphens: auto; +} + +.hero-title-highlight { + background: linear-gradient(45deg, var(--rwth-gelb) 0%, var(--rwth-orange) 90%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + word-wrap: break-word; +} + +.hero-subtitle { + font-size: clamp(1rem, 2.5vw, 1.25rem); + line-height: 1.6; + color: rgba(255, 255, 255, 0.9); + margin-bottom: 2rem; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.hero-features { + display: flex; + flex-direction: column; + gap: 0.75rem; + margin-bottom: 2.5rem; +} + +.hero-feature { + display: flex; + align-items: center; + gap: 0.75rem; + color: rgba(255, 255, 255, 0.9); + font-size: clamp(0.875rem, 2vw, 1rem); + word-wrap: break-word; + overflow-wrap: break-word; +} + +.hero-feature-icon { + width: 1.25rem; + height: 1.25rem; + color: var(--rwth-gelb); + flex-shrink: 0; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +.btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.875rem 1.5rem; + border-radius: 8px; + font-weight: 600; + text-decoration: none; + transition: all 0.3s ease; + border: none; + cursor: pointer; + font-size: clamp(0.875rem, 2vw, 1rem); + white-space: nowrap; + min-width: 0; +} + +.btn-primary { + background: linear-gradient(45deg, var(--rwth-gelb), var(--rwth-orange)); + color: #333 !important; +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 10px 20px rgba(255, 215, 0, 0.3); +} + +.btn-secondary { + background: rgba(255, 255, 255, 0.1); + color: white; + border: 1px solid rgba(255, 255, 255, 0.3); + backdrop-filter: blur(10px); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.2); + transform: translateY(-2px); +} + +.btn-icon { + width: 1rem; + height: 1rem; + flex-shrink: 0; +} + +.hero-stats { + display: flex; + flex-wrap: wrap; + gap: 2rem; + justify-content: center; + margin-top: 2rem; +} + +.hero-stat { + text-align: center; + min-width: 0; +} + +.hero-stat-number { + font-size: clamp(1.5rem, 3vw, 2rem); + font-weight: 700; + color: #fff; + margin-bottom: 0.25rem; +} + +.hero-stat-label { + font-size: clamp(0.75rem, 1.5vw, 0.875rem); + color: rgba(255, 255, 255, 0.8); + word-wrap: break-word; +} + +.hero-visual { + position: relative; + width: 140%; + min-width: 0; + box-sizing: border-box; + perspective: 1000px; +} + +.hero-scroll-indicator { + display: flex; + margin: 0 auto; +} + +.hero-code-sample { + background: rgba(0, 0, 0, 0.8); + border-radius: 12px; + overflow: hidden; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); + backdrop-filter: blur(10px); + width: 100%; + box-sizing: border-box; + max-width: 100%; +} + +.code-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; + background: rgba(255, 255, 255, 0.05); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + box-sizing: border-box; +} + +.code-dots { + display: flex; + gap: 0.5rem; +} + +.code-dot { + width: 12px; + height: 12px; + border-radius: 50%; + flex-shrink: 0; +} + +.code-dot-red { + background: #ff5f56; +} + +.code-dot-yellow { + background: var(--rwth-orange); +} + +.code-dot-green { + background: var(--rwth-gruen); +} + +.code-filename { + color: rgba(255, 255, 255, 0.8); + font-size: clamp(0.75rem, 1.5vw, 0.875rem); + font-family: 'Monaco', 'Consolas', monospace; + word-wrap: break-word; +} + +.code-content { + padding: 1.5rem; + box-sizing: border-box; + overflow-x: auto; + /* Allow horizontal scrolling for code */ + overflow-y: hidden; + max-width: 100%; + --md-code-hl-keyword-color: var(--rwth-blau-50); + --md-code-hl-name-color: #bdbdbd; + --md-code-hl-variable-color: #e6e6e6; + --md-code-hl-operator-color: #e6e6e6; + --md-code-hl-punctuation-color: #e6e6e6; + --md-code-hl-function-color: var(--rwth-orange); + --md-code-hl-string-color: var(--rwth-maigruen); +} + +.code-content pre { + margin: 0; + font-family: 'Monaco', 'Consolas', monospace; + font-size: clamp(0.7rem, 1.5vw, 0.875rem); + line-height: 1.5; + white-space: pre; + /* Prevent code wrapping */ + overflow-x: visible; + min-width: max-content; + /* Ensure content doesn't compress */ +} + +.code-content code { + white-space: pre; + /* Prevent code wrapping */ + display: block; + min-width: max-content; +} + +.hero-decorations { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; +} + +.decoration { + position: absolute; + border-radius: 50%; + background: rgba(255, 255, 255, 0.1); + animation: float 6s ease-in-out infinite; +} + +.decoration-1 { + width: 60px; + height: 60px; + top: 20%; + right: 10%; + animation-delay: 0s; +} + +.decoration-2 { + width: 80px; + height: 80px; + top: 60%; + right: 20%; + animation-delay: 2s; +} + +.decoration-3 { + width: 40px; + height: 40px; + top: 40%; + right: 5%; + animation-delay: 4s; +} + +@keyframes float { + + 0%, + 100% { + transform: translateY(0px); + } + + 50% { + transform: translateY(-20px); + } +} + +/* Large Desktop breakpoint */ +@media (max-width: 1600px) { + .hero-stats { + justify-content: flex-start; + } +} + +/* Tablet breakpoint */ +@media (max-width: 1200px) { + .hero-content { + grid-template-columns: 1fr 1fr; + /* Equal columns on medium screens */ + gap: 2rem; + } +} + +/* Mobile breakpoint */ +@media (max-width: 968px) { + .hero-content { + grid-template-columns: 1fr; + /* Single column on mobile */ + gap: 2rem; + } + + .hero-container { + padding: 0 1rem 2rem; + } + + .hero-actions { + justify-content: flex-start; + } + + .hero-stats { + justify-content: center; + } + + .code-content { + padding: 1rem; + } + + .hero-visual { + width: 100%; + } +} + +/* Small mobile breakpoint */ +@media (max-width: 640px) { + .hero-section { + padding: 1.5rem 0 0; + } + + .hero-container { + padding: 0 0.75rem 2rem; + } + + .hero-content { + gap: 1.5rem; + } + + .hero-actions { + flex-direction: column; + align-items: stretch; + } + + .btn { + justify-content: center; + text-align: center; + } + + .hero-stats { + gap: 1rem; + justify-content: space-between; + } + + .hero-stat { + flex: 1; + min-width: 0; + } + + .code-content { + padding: 0.75rem; + } + + .hero-decorations { + display: none; + } +} + +/* Extra small mobile devices */ +@media (max-width: 480px) { + .hero-container { + padding: 0 0.5rem; + } + + .hero-content { + gap: 1rem; + } + + .hero-stats { + flex-direction: column; + gap: 0.75rem; + align-items: center; + } + + .hero-stat { + width: 100%; + } +} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..9fbd13b0 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,75 @@ +site_name: SysMLv2 +theme: + pallete: + primary: custom + accent: custom + name: 'material' + custom_dir: docs/overrides + features: + - navigation.tabs + - navigation.sections + - navigation.footer + - navigation.instant + - navigation.instant.progress + - navigation.indexes + - toc.follow + - content.tabs.link + - social + - content.code.copy + - content.code.annotate + logo: assets/images/icon-mono.png + favicon: assets/images/icon.png + icon: + annotation: material/help-circle + +site_url: https://monticore.github.io/sysml/ +repo_url: https://github.com/MontiCore/sysmlv2/ + +copyright: "© https://github.com/MontiCore/monticore" + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/MontiCore/sysmlv2 + - icon: fontawesome/solid/paper-plane + link: mailto:webmaster@se-rwth.de + +extra_css: + - stylesheets/extra.css + +markdown_extensions: + - def_list + - attr_list + - md_in_html + - admonition + - footnotes + - pymdownx.blocks.caption + - pymdownx.extra + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.details + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.snippets + - pymdownx.tabbed: + alternate_style: true + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + +nav: + - Home: 'index.md' + - Getting Started: + - Getting Started: 'GettingStarted/index.md' + - Setup: 'GettingStarted/Setup.md' + - Tools & Editors: 'GettingStarted/Editor.md' + - Hello World!: 'GettingStarted/HelloWorld.md' + - Usage: + - Usage: 'Usage/index.md' + - Errors: 'Usage/error.md' + - License: https://monticore.github.io/monticore/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/ From d2988934a258beee71ac0f821f6198bd8817ff5b Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Sun, 14 Dec 2025 19:59:58 +0100 Subject: [PATCH 02/12] remove ma landing --- docs/overrides/landingpage.html | 36 ++------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/docs/overrides/landingpage.html b/docs/overrides/landingpage.html index e77aec5b..bc7bf875 100644 --- a/docs/overrides/landingpage.html +++ b/docs/overrides/landingpage.html @@ -25,14 +25,14 @@

    - Model validation + Model Validation
    - Simulation Framework + SpesML Functional Modeling
    @@ -48,38 +48,6 @@

    - -
    -
    -
    -
    - - - -
    -
    Door.arc
    -
    -
    -
    package elevator;
    -
    -component Door {
    -  port in boolean shouldOpen;
    -
    -  automaton {
    -    initial state Closed;
    -    state Open;
    -
    -    Closed -> Open [shouldOpen == true] shouldOpen / {
    -      System.out.println("Door has opened");
    -    }
    -    Open -> Closed [shouldOpen == false] shouldOpen / {
    -      System.out.println("Door has closed");
    -    }
    -  }
    -}
    -
    -
    -
    From 39173b25a5424f19d405c6c1cd7f9d38f87bd57b Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 17:52:04 +0200 Subject: [PATCH 03/12] test release vsix file --- .github/workflows/gradle.yml | 37 +++++++++++++++++++++++++++++++++++- settings.gradle | 6 ++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index d7398851..a0417e31 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -48,6 +48,23 @@ jobs: name: junit-test-results path: '**/target/test-results/test/TEST-*.xml' retention-days: 1 + - name: Create Snapshot Release + #if: github.ref == 'refs/heads/master' + uses: softprops/action-gh-release@v2 + with: + tag_name: snapshot + name: "Snapshot Release" + prerelease: true + files: | + language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-7.9.0-SNAPSHOT.vsix + body: | + Automated Snapshot Release + + This release contains the latest development version of the SysML v2 tool and VSCode plugin. + + Built from commit: ${{ github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} parser-performance: runs-on: ubuntu-latest @@ -89,11 +106,12 @@ jobs: deploy: permissions: + contents: write packages: write runs-on: ubuntu-latest needs: build if: - github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release') + github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release')) steps: - name: Checkout project sources uses: actions/checkout@v4 @@ -116,3 +134,20 @@ jobs: -PgithubToken=${{secrets.GITHUB_TOKEN}} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create Snapshot Release + if: github.ref == 'refs/heads/master' + uses: softprops/action-gh-release@v2 + with: + tag_name: snapshot + name: "Snapshot Release" + prerelease: true + files: | + language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-7.9.0-SNAPSHOT.vsix + body: | + Automated Snapshot Release + + This release contains the latest development version of the SysML v2 tool and VSCode plugin. + + Built from commit: ${{ github.sha }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/settings.gradle b/settings.gradle index b1f37b1f..de8ae235 100644 --- a/settings.gradle +++ b/settings.gradle @@ -26,8 +26,10 @@ if(("true").equals(getProperty('isPipelineFullBuild'))) { // Wrapper for the Github-publication of the official vizualizer include 'visualization' + + // Visualization-Plugin for VSCode + include 'visualization-plugin' } -// Visualization-Plugin for VSCode -include 'visualization-plugin' + From cb5f3499abaa88ee3ccb4c4ab2e7f806cb8e4e31 Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 18:39:07 +0200 Subject: [PATCH 04/12] test release vsix 2 --- .github/workflows/gradle.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a0417e31..5e2abe82 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -41,6 +41,7 @@ jobs: run: gradle build ${{env.GRADLE_CLI_OPTS}} -PgithubUser=${{env.GITHUB_ACTOR}} -PgithubToken=${{secrets.GITHUB_TOKEN}} + -PisPipelineFullBuild=true - name: Upload Test Report uses: actions/upload-artifact@v4 if: always() # always run even if the previous step fails @@ -59,9 +60,9 @@ jobs: language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-7.9.0-SNAPSHOT.vsix body: | Automated Snapshot Release - + This release contains the latest development version of the SysML v2 tool and VSCode plugin. - + Built from commit: ${{ github.sha }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -145,9 +146,9 @@ jobs: language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-7.9.0-SNAPSHOT.vsix body: | Automated Snapshot Release - + This release contains the latest development version of the SysML v2 tool and VSCode plugin. - + Built from commit: ${{ github.sha }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From f268137fbd8f5a81d8135bf581d2374b00055e02 Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 18:52:03 +0200 Subject: [PATCH 05/12] test release vsix 3 --- .github/workflows/gradle.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 5e2abe82..286a3676 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -24,6 +24,9 @@ permissions: jobs: build: + permissions: + contents: write + packages: write runs-on: ubuntu-latest steps: - name: Checkout project sources From 45b3a3845f0190f320de7db9161355a42ceaaa7a Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 19:35:32 +0200 Subject: [PATCH 06/12] test release vsix 4 --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 286a3676..c9760ab8 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -60,7 +60,7 @@ jobs: name: "Snapshot Release" prerelease: true files: | - language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-7.9.0-SNAPSHOT.vsix + 'language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-*-SNAPSHOT.vsix' body: | Automated Snapshot Release From 422aa6a4fc4b2fe99a42697c9f83324712ebe67a Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 19:49:47 +0200 Subject: [PATCH 07/12] test release vsix 5 --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index c9760ab8..cf06c825 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -60,7 +60,7 @@ jobs: name: "Snapshot Release" prerelease: true files: | - 'language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-*-SNAPSHOT.vsix' + **/*.vsix body: | Automated Snapshot Release From 3c0a9bb6b302f9b688bcfdbaf0e826ffb283ee01 Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 20:23:18 +0200 Subject: [PATCH 08/12] fix vsix deployment --- .github/workflows/gradle.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index cf06c825..0bd0231c 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -136,6 +136,7 @@ jobs: -PnexusUser=${{ secrets.SE_NEXUS_USER }} -PgithubUser=${{env.GITHUB_ACTOR}} -PgithubToken=${{secrets.GITHUB_TOKEN}} + -PisPipelineFullBuild=true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Create Snapshot Release @@ -146,7 +147,7 @@ jobs: name: "Snapshot Release" prerelease: true files: | - language-server/target/generated-sources/SysMLv2/plugins/sysmlv2-vscode-plugin/sysmlv2-7.9.0-SNAPSHOT.vsix + **/*.vsix body: | Automated Snapshot Release From d2c08682f61d2ee0f45f6ae52c1e2b73a2927dd7 Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 20:28:40 +0200 Subject: [PATCH 09/12] revert publishing of vsix to pre test values --- .github/workflows/gradle.yml | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 0bd0231c..1716a0eb 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -24,9 +24,6 @@ permissions: jobs: build: - permissions: - contents: write - packages: write runs-on: ubuntu-latest steps: - name: Checkout project sources @@ -44,7 +41,6 @@ jobs: run: gradle build ${{env.GRADLE_CLI_OPTS}} -PgithubUser=${{env.GITHUB_ACTOR}} -PgithubToken=${{secrets.GITHUB_TOKEN}} - -PisPipelineFullBuild=true - name: Upload Test Report uses: actions/upload-artifact@v4 if: always() # always run even if the previous step fails @@ -52,23 +48,6 @@ jobs: name: junit-test-results path: '**/target/test-results/test/TEST-*.xml' retention-days: 1 - - name: Create Snapshot Release - #if: github.ref == 'refs/heads/master' - uses: softprops/action-gh-release@v2 - with: - tag_name: snapshot - name: "Snapshot Release" - prerelease: true - files: | - **/*.vsix - body: | - Automated Snapshot Release - - This release contains the latest development version of the SysML v2 tool and VSCode plugin. - - Built from commit: ${{ github.sha }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} parser-performance: runs-on: ubuntu-latest @@ -115,7 +94,7 @@ jobs: runs-on: ubuntu-latest needs: build if: - github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release')) + github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release') steps: - name: Checkout project sources uses: actions/checkout@v4 From 928efa80f7571c2aa02de5672a1238252f8c085a Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Tue, 21 Apr 2026 20:39:08 +0200 Subject: [PATCH 10/12] update website --- README.md | 2 +- docs/GettingStarted/Developers.md | 30 +++++++ docs/GettingStarted/Editor.md | 10 +-- docs/GettingStarted/Setup.md | 2 +- .../index.md => GettingStarted/Users.md} | 28 ++++-- docs/GettingStarted/index.md | 5 +- docs/Reference/StreamLibrary.md | 20 +++++ docs/Reference/index.md | 8 ++ docs/SpesML/index.md | 42 +++++++++ docs/assets/models/SumUp.bmp | Bin 0 -> 547578 bytes docs/assets/models/Vehicle.bmp | Bin 0 -> 379270 bytes docs/index.md | 36 +++----- docs/overrides/landingpage.html | 83 ++++++++++++++++-- docs/stylesheets/extra.css | 3 + docs/stylesheets/landingpage.css | 6 +- mkdocs.yml | 23 ++--- 16 files changed, 240 insertions(+), 58 deletions(-) create mode 100644 docs/GettingStarted/Developers.md rename docs/{Usage/index.md => GettingStarted/Users.md} (67%) create mode 100644 docs/Reference/StreamLibrary.md create mode 100644 docs/Reference/index.md create mode 100644 docs/SpesML/index.md create mode 100644 docs/assets/models/SumUp.bmp create mode 100644 docs/assets/models/Vehicle.bmp diff --git a/README.md b/README.md index d359144d..063ea677 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ standard library package 'Vehicles' { This textual form will play a major role in the exchange of models between tools thus allowing to build toolchains, as well as in the -versioning of models, e.g., in Github, and also in the efficient +versioning of models, e.g., in GitHub, and also in the efficient definition of models by people who prepare textual notations. It is therefore highly relevant to have consistent parsing mechanisms diff --git a/docs/GettingStarted/Developers.md b/docs/GettingStarted/Developers.md new file mode 100644 index 00000000..442d974b --- /dev/null +++ b/docs/GettingStarted/Developers.md @@ -0,0 +1,30 @@ + +# For Developers + +## Building the Tool from the Sources + +As alternative to a download, it is possible to build an executable JAR of the +tool from the source files located in GitHub. In order to build an executable +Jar of the tool with Bash from the source files available in GitHub, execute the +following commands. + +First, clone the repository: +```bash +git clone https://github.com/MontiCore/sysmlv2.git +``` + +Change the directory to the root directory of the cloned sources: +```bash +cd sysmlv2 +``` + +Then build the source files with gradle. To this effect, execute the following +two command: + +```bash +./gradlew :language:shadowJar +``` +Please ensure that you have Java 21 JRE installed and gradle is set up to use it. + +Congratulations! The executable JAR file `language-7.*.*-SNAPSHOT-mc-tool.jar` is +now in the directory `language/target/libs`. diff --git a/docs/GettingStarted/Editor.md b/docs/GettingStarted/Editor.md index 52e42d34..3a37ef0a 100644 --- a/docs/GettingStarted/Editor.md +++ b/docs/GettingStarted/Editor.md @@ -5,17 +5,17 @@ hide: # Tools & Editors -You have multiple options to choose from for working with MontiArc. -You can build MontiArc models with any text editor or integrated development environment (IDE) in combination with the [CLI](./Setup.md#run-the-cli). +You have multiple options to choose from for working with SysML v2. +You can build SysML v2 models with any text editor or integrated development environment (IDE) in combination with the [CLI](./Setup.md#run-the-cli). -Though there are some editors that provide a better experience for SysML. +Though there are some editors that provide a better experience for SysML such as SysON and SysIDE. ## Visual Studio Code 1. To install VS Code, follow their [instructions](https://code.visualstudio.com/docs/setup/setup-overview). -2. Install the MontiArc extension. - 1. [Download](https://github-registry-files.githubusercontent.com/758456656/1b847700-819d-11f0-8dad-cb32a1bfe312?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20250916%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250916T120634Z&X-Amz-Expires=300&X-Amz-Signature=8856e041f06680f48963357fe24467e82f549ab877f3902d9bbe5dc381c649c8&X-Amz-SignedHeaders=host&response-content-disposition=filename%3Dlanguage-server-7.6.1-10-vscode.vsix&response-content-type=application%2Foctet-stream) the `.vsix` extension. +2. Install the SysML v2 extension. + 1. Download the `.vsix` extension from the [releases page](https://github.com/MontiCore/sysmlv2/releases/tag/snapshot). 2. Start VS Code. 3. Go to the extension tab → Click `...` → Install from VSIX → Select the previously downloaded extension. diff --git a/docs/GettingStarted/Setup.md b/docs/GettingStarted/Setup.md index 52c2f3f9..4eb4d488 100644 --- a/docs/GettingStarted/Setup.md +++ b/docs/GettingStarted/Setup.md @@ -24,4 +24,4 @@ java -jar MCSysMLv2.jar -i Car.sysml -pp --- -You can find detailed descriptions and available parameters in the [usage](../Usage/index.md) section. +You can find detailed descriptions and available parameters in the [usage](./Users.md) section. diff --git a/docs/Usage/index.md b/docs/GettingStarted/Users.md similarity index 67% rename from docs/Usage/index.md rename to docs/GettingStarted/Users.md index 336a8d3c..38a84f21 100644 --- a/docs/Usage/index.md +++ b/docs/GettingStarted/Users.md @@ -1,20 +1,34 @@ ---- -hide: - - toc ---- +# For Users -# Usage +## Tool Download and Use + +* [**Download SysML v2 Tool**](https://www.monticore.de/download/MCSysMLv2.jar) + +The SysML v2 tool offers options for processing SysML v2 models. It provides through the CLI as follows: `java -jar MCSysMLv2.jar [-h] -i [-path

    ] [-pp []] [-s []]` +where the arguments are: + | Option | Explanation | |--------------------------|--------------------------------------------------------------------------------------------| -| -ex,--extended | Runs additional checks assuring models are fit for semantic analysis using [MontiBelle][https://www.se-rwth.de/projects/#MontiBelle] | +| -ex,--extended | Runs additional checks assuring models are fit for semantic analysis using [MontiBelle](https://www.se-rwth.de/projects/#MontiBelle) | | -h,--help | Prints this help dialog | | -i,--input | Reads the source file (mandatory) and parses the contents | | -path | Sets the artifact path for imported symbols, space separated. | | -pp,--prettyprint | Prints the AST to stdout or the specified file (optional) | | -r,--report

    | Prints reports of the artifact to the specified directory. | | -s,--symboltable | Serialized the Symbol table of the given artifact. | -| -v,--version | Prints version information | \ No newline at end of file +| -v,--version | Prints version information | + +exemplary usage: + +```bash +java -jar MCSysMLv2.jar -h +java -jar MCSysMLv2.jar -i Car.sysml -pp +``` + +##### Prerequisites + +To run the tool, it is required to install a Java 21 JRE. diff --git a/docs/GettingStarted/index.md b/docs/GettingStarted/index.md index bce121f5..6fed499b 100644 --- a/docs/GettingStarted/index.md +++ b/docs/GettingStarted/index.md @@ -8,9 +8,10 @@ hide: Let's start your SysML journey! In this chapter, we will show you how to start your first Project and introduce you to the basic concepts of SysML. +We provide documentation for both **users** who want to use the SysML v2 tool and **developers** who want to build or extend it. -!!! info "Tip" - Simply click on *next (Setup)* on the bottom right to go to the next step of installing our SysML tooling. +* [For Users](./Users.md): Download and run the CLI tool. +* [For Developers](./Developers.md): Build the tool from source and set up your development environment. !!! question "Found a problem with the documentation?" If you find an error or something is not understandable, please file an [issue](../index.md#found-an-issue) for it. diff --git a/docs/Reference/StreamLibrary.md b/docs/Reference/StreamLibrary.md new file mode 100644 index 00000000..3e3cd39b --- /dev/null +++ b/docs/Reference/StreamLibrary.md @@ -0,0 +1,20 @@ +# Stream Library + +The Stream Library provides standard components and definitions for working with streams in SpesML. +Here you can find [stream expressions](https://monticore.github.io/monticore/monticore-grammar/src/main/grammars/de/monticore/Grammars/#streamexpressionsmc4-stable) +and the [stream method library](https://github.com/MontiCore/monticore/tree/dev/monticore-libraries/stream-symbols/src/main/symtabdefinition). +The modeling with SpesML v2 works seamlessly with the MontiCore parser. + +## Specifying Timing +Timing can be specified in multiple ways using user defined keywords: + +1. At the interface level over ports: + +```#event port x;``` + +2. On the behavioral level: + +```#sync satisfy requirement {...}``` + +!!! warning + Note that 1. & 2. are **mutually** exclusive. diff --git a/docs/Reference/index.md b/docs/Reference/index.md new file mode 100644 index 00000000..46e03c97 --- /dev/null +++ b/docs/Reference/index.md @@ -0,0 +1,8 @@ +# SpesML v2 Reference + +Welcome to the SpesML v2 reference documentation. The SpesML v2 is constituted of a methodology and a SysML v2 language +profile. From a technical perspective, the profile is an extension of the SysML expressions with: + +- [Stream Library](StreamLibrary.md) +- [OCL expressions](https://github.com/MontiCore/ocl) +- [MontiCore type system based on Java types](https://monticore.github.io/monticore/monticore-grammar/src/main/java/de/monticore/types3/TypeSystem3/) diff --git a/docs/SpesML/index.md b/docs/SpesML/index.md new file mode 100644 index 00000000..5a4d0622 --- /dev/null +++ b/docs/SpesML/index.md @@ -0,0 +1,42 @@ +# SpesML v2 + +SpesML v2 is a modeling language based on the [SPES framework](https://www.se-rwth.de/publications/Model-Based-Systems-Engineering-with-the-SPES-Modeling-Language-A-SysML-Workbench-for-the-SPES-Methodology.pdf) +currently in development. The SPES methodology defines a rigorous formal semantic +applicable on the SysML v2 centered around specifying components through complete +communication histories and stream-processing functions . The language shown +below is a SysML v2 profile. There are currently two types of specifications +supported: black-box through history-oriented specifications and glass-box +through state machines. + +## Exemplary Model: SumUp + +The following model demonstrates a simple `SumUp` component specified in SpesML v2: + +![SumUp](../assets/models/SumUp.bmp) + +```sysmlv2 +port def Naturals { + in attribute val: nat; +} + +part def SumUp { + #untimed port x: Naturals; + #untimed port y: ~Naturals; + + satisfy requirement { + assume constraint InfStream { + x.hasInfiniteLen() + } + + require constraint IncrementInplace { + forall nat t: + y.nth(t+1) == x.nth(t) + y.nth(t) + } + } +} +``` + +The SpesML v2 leverages underspecification as a core asset for high-level specifications, +which can be thoroughly expressed through history-oriented stream-processing specifications. +To this end we provide a [stream library](../Reference/StreamLibrary.md) for +stream processing functions which can be applied to streams. diff --git a/docs/assets/models/SumUp.bmp b/docs/assets/models/SumUp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..96a858bbc22a1e392db6c071b8a1dcaa29750486 GIT binary patch literal 547578 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 G+W!GU*MWQh literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 01990ede..fc4c6a00 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,29 +7,21 @@ hide: --- + -# The Systems Modeling Language v2 +# The Systems Modeling Language v2 {: #more } One of the interesting new capabilities is the exchange of models between tools using a really human readable textual form of the SysML language in the spirit of a modern programming language (even though it has a number of special constructs that resemble modelling concepts). -```sysmlv2 -standard library package 'Vehicles' { - import ISQ::TorqueValue; - import ScalarValues::*; - part def Automobile; - alias Car for Automobile; - alias Torque for ISQ::TorqueValue; -} -``` - This textual form will play a major role in the exchange of models between tools thus allowing to build toolchains, as well as in the versioning of models, e.g., in Github, and also in the efficient @@ -54,22 +46,22 @@ quality desired for industrial use. --- Is this your first time using SysML? Set up a project and start modeling. - + --- - [:octicons-arrow-right-24: Take the Tour](./GettingStarted/index.md)
    - [:octicons-arrow-right-24: Installation & Setup](./GettingStarted/Setup.md) + [:octicons-arrow-right-24: For Users](./GettingStarted/Users.md)
    + [:octicons-arrow-right-24: For Developers](./GettingStarted/Developers.md) -- :material-tools:   - __Usage__ +- :material-book-open-variant:   + __SpesML__ --- - Learn how to use the tooling.

    + Learn more about SpesML and the SPES framework.

    --- - [:octicons-arrow-right-24: Read more](./Usage/index.md) + [:octicons-arrow-right-24: Read more](./SpesML/index.md) - :material-license:   __License__ @@ -100,7 +92,7 @@ Discover Component-Based Modeling ## Found an issue? -This SysML v2 tooling is actively maintained by the [Chair of Software Engineering](https://www.se-rwth.de/). +This SysML v2 tooling is actively maintained by the [Chair of Software Engineering](https://www.se-rwth.de/). There are multiple ways in which you can improve it to help you and others who might encounter the same issues in the future.
    @@ -125,7 +117,7 @@ There are multiple ways in which you can improve it to help you and others who m --- - [:octicons-arrow-right-24: Set up your development environment](https://github.com/MontiCore/sysmlv2/blob/dev/README.md)
    + [:octicons-arrow-right-24: Set up your development environment](./GettingStarted/Developers.md)
    [:octicons-arrow-right-24: Create a pull request](https://github.com/MontiCore/sysmlv2/pulls)
    @@ -137,7 +129,7 @@ There are multiple ways in which you can improve it to help you and others who m ## Further Information -Find more information about MontiArc and other projects and publications by the Chair of Software Engineering under the following links: +Find more information about SysML v2 and other projects and publications by the Chair of Software Engineering under the following links: * [Setup](./GettingStarted/Setup.md) * [Publications](https://www.se-rwth.de/publications/) diff --git a/docs/overrides/landingpage.html b/docs/overrides/landingpage.html index bc7bf875..70623c90 100644 --- a/docs/overrides/landingpage.html +++ b/docs/overrides/landingpage.html @@ -11,11 +11,11 @@

    - Modeling Systems with SysML v2 + An Alternative Parser for the SysML v2

    - A standard compliant SysML v2 parser and model checker with a strong type system and semantic + A standard-compliant SysML v2 parser and model validator with a strong type system and semantic foundation.

    @@ -34,6 +34,45 @@

    SpesML Functional Modeling

    +
    + + + + + Formal Verification +
    +
    + +
    +

    Coming Soon

    +
    + + + + + Pilot API Compatibility +
    +
    + + + + + Runtime Verification +
    +
    + + + + + Behavioral Simulation +
    +
    + + + + + Advanced Code Generation +
    -
    -
    -
    -
    +
    +
    +
    + Vehicle Model +
    +
    +
    +
    +
    +
    +
    +
    + Vehicle.sysml +
    +
    +
    part def Vehicle {
    +  attribute mass :> ISQ::mass;
    +  attribute dryMass;
    +  attribute cargoMass;
    +  attribute electricalPower;
    +
    +  port pwrCmdPort;
    +  port vehicleToRoadPort;
    +
    +  perform action providePower;
    +  perform action provideBraking;
    +
    +  exhibit vehicleStates;
    +}
    +
    +
    diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 189af426..ab8e794c 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -61,6 +61,9 @@ html { .md-search__form { border-radius: 500px; } + .md-main__inner { + max-width: 55rem; + } } .full-width { diff --git a/docs/stylesheets/landingpage.css b/docs/stylesheets/landingpage.css index fa47ba16..23402560 100644 --- a/docs/stylesheets/landingpage.css +++ b/docs/stylesheets/landingpage.css @@ -16,10 +16,10 @@ .hero-content { display: grid; - grid-template-columns: 4fr 3fr; + grid-template-columns: 1fr 1fr; gap: 3rem; align-items: center; - max-width: 61rem; + max-width: 70rem; margin: 0 auto; box-sizing: border-box; } @@ -160,7 +160,7 @@ .hero-visual { position: relative; - width: 140%; + width: 100%; min-width: 0; box-sizing: border-box; perspective: 1000px; diff --git a/mkdocs.yml b/mkdocs.yml index 9fbd13b0..33f79f58 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: SysMLv2 +site_name: SysML v2 theme: pallete: primary: custom @@ -17,8 +17,8 @@ theme: - social - content.code.copy - content.code.annotate - logo: assets/images/icon-mono.png - favicon: assets/images/icon.png + # logo: assets/images/icon-mono.png + # favicon: assets/images/icon.png icon: annotation: material/help-circle @@ -65,11 +65,14 @@ markdown_extensions: nav: - Home: 'index.md' - Getting Started: - - Getting Started: 'GettingStarted/index.md' - - Setup: 'GettingStarted/Setup.md' - - Tools & Editors: 'GettingStarted/Editor.md' - - Hello World!: 'GettingStarted/HelloWorld.md' - - Usage: - - Usage: 'Usage/index.md' - - Errors: 'Usage/error.md' + - Overview: 'GettingStarted/index.md' + - For Users: + - Tool Download & Use: 'GettingStarted/Users.md' + - Errors: 'Usage/error.md' + - For Developers: + - Building from Source: 'GettingStarted/Developers.md' + - Setup: 'GettingStarted/Setup.md' + - Tools & Editors: 'GettingStarted/Editor.md' + - Hello World!: 'GettingStarted/HelloWorld.md' + - SpesML: 'SpesML/index.md' - License: https://monticore.github.io/monticore/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/ From 21fed78fc5118bc35bf142856d70701240519eb1 Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Thu, 23 Apr 2026 19:46:00 +0200 Subject: [PATCH 11/12] added more SpesML doc --- docs/Reference/StreamLibrary.md | 91 ++++++++++++++++++++++++++++++++- mkdocs.yml | 8 ++- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/docs/Reference/StreamLibrary.md b/docs/Reference/StreamLibrary.md index 3e3cd39b..4d797bed 100644 --- a/docs/Reference/StreamLibrary.md +++ b/docs/Reference/StreamLibrary.md @@ -1,4 +1,4 @@ -# Stream Library +# Stream Library & Writing Stream Specifications The Stream Library provides standard components and definitions for working with streams in SpesML. Here you can find [stream expressions](https://monticore.github.io/monticore/monticore-grammar/src/main/grammars/de/monticore/Grammars/#streamexpressionsmc4-stable) @@ -18,3 +18,92 @@ Timing can be specified in multiple ways using user defined keywords: !!! warning Note that 1. & 2. are **mutually** exclusive. + +The default timing is `event`. + +Stream specifications contain properties written over the input and output of components' ports. + +## Components +Components use standard syntax and must declare its ports (packages beind optional): +``` +part def A { + port input: PortType1; + port output: ~PortType1; + + ... +} +``` +## Ports +Port types must exist and feature at least one attribute: +``` +port def PortType1 { + attribute value: int; +} +``` +Attribute types have to be standardized java types (int, double, float, short, long, boolean, byte, + char, String), nat or user defined: +``` +attribute def UserDefinedType1 { + attribute field1: int; +} +``` + +``` +enum def UserDefinedEnum1 { + enum E1; + enum E2; +} +``` + +## Stream Specifications +Stream specifications can be expressed in SysML v2 as asserted constraints if there are no assumptions about the environment. +``` +assert constraint c1 { + input.value == <1,2> +} +``` +The stream of messages over a port can be recalled by field accesses over the port usage attribute. When accessed in specifications these field accesses have an +implicit stream type. For example `input.value` in component `A` has the type `EventStream`. +In the case of port definitions with singular attributes we provide syntactic sugar by writing `output` instead of `output.value` +as it is unambiguous that a stream access is. +This is especially useful when chaining methods over streams. + +More complex specifications can be written as assumption/guarantee pairs through requirements. Multiple assumptions and multiple guarantees are allowed. +Each requirement corresponds to a property. +``` +satisfy requirement r1 { + assume constraint c2 { + input.value == <1> + } + require constraint c3 { + output.value == input.value + } +} +``` + +## Parameters +Stream specifications can also be parametrized with the parameter being set at initialization of the part. +``` +part A { + ... + + final attribute maxValue: int; + + assert constraint c4 { + input.value.first() >= maxValue; + } +} +``` + +## Methods +The stream method library and all stream expressions can be used inside specifications: +``` +output.value.length() == (input.value()^^<2>).length() +``` + +## OCLExpressions +It is usual to use first-order logic expressions in specifications. These can be embedded through OCLExpressions (which also include SetExpressions): +``` +forall t in nat: + !input.value.nth(t).isEmpty() || input.values.nth(t) isIn {0} +``` diff --git a/mkdocs.yml b/mkdocs.yml index 33f79f58..0afa81b2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,11 +8,13 @@ theme: features: - navigation.tabs - navigation.sections + - navigation.expand - navigation.footer - navigation.instant - navigation.instant.progress - navigation.indexes - toc.follow + - toc.integrate - content.tabs.link - social - content.code.copy @@ -74,5 +76,9 @@ nav: - Setup: 'GettingStarted/Setup.md' - Tools & Editors: 'GettingStarted/Editor.md' - Hello World!: 'GettingStarted/HelloWorld.md' - - SpesML: 'SpesML/index.md' + - SpesML: + - Overview: 'SpesML/index.md' + - Reference: + - Overview: 'Reference/index.md' + - Stream Library: 'Reference/StreamLibrary.md' - License: https://monticore.github.io/monticore/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/ From e81497e97896c604921eaa69a5c81ef2fd2477a6 Mon Sep 17 00:00:00 2001 From: adriancostin-sd Date: Wed, 29 Apr 2026 18:32:54 +0200 Subject: [PATCH 12/12] add feedback --- .gitignore | 4 ++++ README.md | 20 ++++++++++---------- docs/GettingStarted/Editor.md | 8 +++----- docs/GettingStarted/HelloWorld.md | 3 --- docs/GettingStarted/Users.md | 24 ++++++++++++------------ docs/Reference/StreamLibrary.md | 8 ++++++-- docs/index.md | 4 ++-- docs/overrides/landingpage.html | 28 ++++++++++++++-------------- mkdocs.yml | 1 - 9 files changed, 51 insertions(+), 49 deletions(-) delete mode 100644 docs/GettingStarted/HelloWorld.md diff --git a/.gitignore b/.gitignore index c24328de..b5ae8550 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,10 @@ bin/ .settings/ .classpath/ .gradle/ +# in gradle 8.14 "build" is currently hardcoded for the problem-reports +build/ + +site/ # Ignore Intellij files *.iml diff --git a/README.md b/README.md index 063ea677..359b5d22 100644 --- a/README.md +++ b/README.md @@ -154,16 +154,16 @@ models. It provides through the CLI as follows: where the arguments are: -| Option | Explanation | -|--------------------------|--------------------------------------------------------------------------------------------| -| -ex,--extended | Runs additional checks assuring models are fit for semantic analysis using [MontiBelle][1] | -| -h,--help | Prints this help dialog | -| -i,--input | Reads the source file (mandatory) and parses the contents | -| -path | Sets the artifact path for imported symbols, space separated. | -| -pp,--prettyprint | Prints the AST to stdout or the specified file (optional) | -| -r,--report | Prints reports of the artifact to the specified directory. | -| -s,--symboltable | Serialized the Symbol table of the given artifact. | -| -v,--version | Prints version information | +| Option | Explanation | +|--------------------------|------------------------------------------------------------------------------------| +| -ex,--extended | Runs additional checks assuring the semantic soundness of models according to Spes | +| -h,--help | Prints this help dialog | +| -i,--input | Reads the source file (mandatory) and parses the contents | +| -path | Sets the artifact path for imported symbols, space separated. | +| -pp,--prettyprint | Prints the AST to stdout or the specified file (optional) | +| -r,--report | Prints reports of the artifact to the specified directory. | +| -s,--symboltable | Serialized the Symbol table of the given artifact. | +| -v,--version | Prints version information | exemplary usage: diff --git a/docs/GettingStarted/Editor.md b/docs/GettingStarted/Editor.md index 3a37ef0a..abd4ce89 100644 --- a/docs/GettingStarted/Editor.md +++ b/docs/GettingStarted/Editor.md @@ -5,13 +5,11 @@ hide: # Tools & Editors -You have multiple options to choose from for working with SysML v2. -You can build SysML v2 models with any text editor or integrated development environment (IDE) in combination with the [CLI](./Setup.md#run-the-cli). +We currently offer modeling support through a Visual Studio Code extension, +integrating the MontiCore parser and applying well-formedness checks. -Though there are some editors that provide a better experience for SysML such as SysON and SysIDE. - -## Visual Studio Code +## Setup 1. To install VS Code, follow their [instructions](https://code.visualstudio.com/docs/setup/setup-overview). 2. Install the SysML v2 extension. diff --git a/docs/GettingStarted/HelloWorld.md b/docs/GettingStarted/HelloWorld.md deleted file mode 100644 index 9d3cf517..00000000 --- a/docs/GettingStarted/HelloWorld.md +++ /dev/null @@ -1,3 +0,0 @@ - -# Hello, World! -You're now ready to start with your first system. diff --git a/docs/GettingStarted/Users.md b/docs/GettingStarted/Users.md index 38a84f21..656caa44 100644 --- a/docs/GettingStarted/Users.md +++ b/docs/GettingStarted/Users.md @@ -7,20 +7,20 @@ The SysML v2 tool offers options for processing SysML v2 models. It provides through the CLI as follows: -`java -jar MCSysMLv2.jar [-h] -i [-path

    ] [-pp []] [-s []]` +`java -jar MCSysMLv2.jar [-h] -i <fileName> [-path <p>] [-pp [<file>]] [-s [<file>]]` where the arguments are: -| Option | Explanation | -|--------------------------|--------------------------------------------------------------------------------------------| -| -ex,--extended | Runs additional checks assuring models are fit for semantic analysis using [MontiBelle](https://www.se-rwth.de/projects/#MontiBelle) | -| -h,--help | Prints this help dialog | -| -i,--input | Reads the source file (mandatory) and parses the contents | -| -path | Sets the artifact path for imported symbols, space separated. | -| -pp,--prettyprint | Prints the AST to stdout or the specified file (optional) | -| -r,--report

    | Prints reports of the artifact to the specified directory. | -| -s,--symboltable | Serialized the Symbol table of the given artifact. | -| -v,--version | Prints version information | +| Option | Explanation | +|--------------------------|------------------------------------------------------------------------------------| +| -ex,--extended | Runs additional checks assuring the semantic soundness of models according to Spes | +| -h,--help | Prints this help dialog | +| -i,--input <file> | Reads the source file (mandatory) and parses the contents | +| -path <arg> | Sets the artifact path for imported symbols, space separated. | +| -pp,--prettyprint <file> | Prints the AST to stdout or the specified file (optional) | +| -r,--report <dir> | Prints reports of the artifact to the specified directory. | +| -s,--symboltable <file> | Serialized the Symbol table of the given artifact. | +| -v,--version | Prints version information | exemplary usage: @@ -29,6 +29,6 @@ java -jar MCSysMLv2.jar -h java -jar MCSysMLv2.jar -i Car.sysml -pp ``` -##### Prerequisites +## Prerequisites To run the tool, it is required to install a Java 21 JRE. diff --git a/docs/Reference/StreamLibrary.md b/docs/Reference/StreamLibrary.md index 4d797bed..a6d42ec2 100644 --- a/docs/Reference/StreamLibrary.md +++ b/docs/Reference/StreamLibrary.md @@ -10,11 +10,15 @@ Timing can be specified in multiple ways using user defined keywords: 1. At the interface level over ports: -```#event port x;``` + ``` + #event port x; + ``` 2. On the behavioral level: -```#sync satisfy requirement {...}``` + ``` + #sync satisfy requirement {...} + ``` !!! warning Note that 1. & 2. are **mutually** exclusive. diff --git a/docs/index.md b/docs/index.md index fc4c6a00..9c3281b2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,7 +18,7 @@ hide: # The Systems Modeling Language v2 {: #more } One of the interesting new capabilities is the exchange of models -between tools using a really human readable textual form of the SysML +between tools using a really human-readable textual form of the SysML language in the spirit of a modern programming language (even though it has a number of special constructs that resemble modelling concepts). @@ -134,5 +134,5 @@ Find more information about SysML v2 and other projects and publications by the * [Setup](./GettingStarted/Setup.md) * [Publications](https://www.se-rwth.de/publications/) * [SysML v2](https://www.omg.org/sysml/sysmlv2/) -* [MontiArc](https://github.com/MontiCore/montiarc) +* [MontiArc](https://monticore.github.io/montiarc/) * [License](https://github.com/MontiCore/monticore/blob/HEAD/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL.md) diff --git a/docs/overrides/landingpage.html b/docs/overrides/landingpage.html index 70623c90..86c27a5d 100644 --- a/docs/overrides/landingpage.html +++ b/docs/overrides/landingpage.html @@ -11,11 +11,11 @@

    - An Alternative Parser for the SysML v2 + A Semantically Well-Founded Full Parser for the SysML v2

    - A standard-compliant SysML v2 parser and model validator with a strong type system and semantic + A semantically well-founded standard-compliant SysML v2 parser and model validator with a strong type system and semantic foundation.

    @@ -25,21 +25,14 @@

    - Model Validation + Model Validation via Fully Checked Context Conditions

    - SpesML Functional Modeling -
    -
    - - - - - Formal Verification + SpesML Functional Modeling Profile
    @@ -50,21 +43,28 @@

    - Pilot API Compatibility + API Access +

    +
    + + + + + Formal Verification via a Connection to the Theorem Prover Isabelle
    - Runtime Verification + Runtime Verification and Monitoring Capabilities
    - Behavioral Simulation + Simulation Capabilities
    diff --git a/mkdocs.yml b/mkdocs.yml index 0afa81b2..db0b1078 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,7 +75,6 @@ nav: - Building from Source: 'GettingStarted/Developers.md' - Setup: 'GettingStarted/Setup.md' - Tools & Editors: 'GettingStarted/Editor.md' - - Hello World!: 'GettingStarted/HelloWorld.md' - SpesML: - Overview: 'SpesML/index.md' - Reference: