Windseeker
Windseeker is a command-line tool for SysML v2 dependency analysis, notebook generation, execution, and view extraction.
It scans .sysml files, analyzes package dependencies, generates a dependency-ordered SysML Jupyter notebook, executes that notebook using a SysML kernel, and extracts rendered views as images.
AI Assisted Development
This project has used generative AI to assist in the development of the tool.
✨ Features
Model Analysis
- Recursively scans
.sysmlfiles - Extracts top-level packages only
- Detects
importdependencies - Builds a directed dependency graph
- Fails fast on:
- Import cycles
- Imports referencing missing packages
Notebook Generation
- Generates a single-kernel SysML Jupyter notebook
- One code cell per top-level package
- Cells ordered by dependency order
- Nested packages remain embedded in their parent cell
- Appends additional cells for each discovered
view- Uses
%view Fully::Qualified::ViewName
- Uses
Notebook Execution
- Executes the generated notebook programmatically
- Supports:
nbclient(preferred)jupyter nbconvert --execute(fallback)
- Detects errors via:
- Jupyter
erroroutputs - SysML kernel
stderr(ERROR,Exception,Traceback)
- Jupyter
View Image Extraction
- Extracts rendered views from executed notebooks
- Supports:
- SVG (raw XML)
- PNG (transparent or solid background)
- Optional JPG
- Automatically rescales oversized SVGs to avoid Cairo rendering errors
🚀 Quick Start
1) Install Windseeker
Clone the repository and install locally:
pip install -e .
This installs the windseeker CLI command.
2) Install Python Dependencies
If you prefer manual installation:
pip install -r requirements.txt
3) Ensure a SysML Jupyter Kernel Is Installed
Windseeker requires a SysML kernel registered with Jupyter.
Verify:
jupyter kernelspec list
You must see a kernel such as:
sysml
Kernel installation is tool-specific and cannot be handled via
requirements.txtorpyproject.toml.
4) Minimal Example Model
Create tests/simple.sysml:
package DemoSystem {
port def DbPort {
in item query : String;
out item result : String;
}
part def UI {
out port db : DbPort;
}
part def ElasticDB {
in port api : ~DbPort;
}
part def System {
part ui : UI;
part db : ElasticDB;
connect ui.db to db.api;
}
package Views {
view uiDbConnection {
expose DemoSystem::System::ui;
expose DemoSystem::System::db;
}
}
}
5) Run Windseeker
windseeker run
This performs:
- SysML file scanning
- Dependency graph construction
- Cycle and missing-import validation
- Notebook generation
- Notebook execution
- View image extraction
🧰 CLI Usage
Show help
windseeker --help
Run the full pipeline
windseeker run
Common CLI Examples
Disable graph image generation
windseeker run --no-graph
Specify a custom graph output
windseeker run --graph --graph-png my_graph.png
Skip notebook execution (generate only)
windseeker run --no-execute
Extract views with an opaque PNG background
windseeker run --png-opaque --png-bg "#ffffff"
Change input folder
windseeker run --folder ./models
Print dependency order only
windseeker order
This prints the topological package order without generating any output artifacts.
📂 Output Artifacts
| File / Folder | Description |
|---|---|
packages_in_dependency_order.sysml |
Concatenated SysML source in dependency order |
packages_in_dependency_order.ipynb |
Generated SysML Jupyter notebook |
packages_in_dependency_order_executed.ipynb |
Executed notebook with outputs |
views/ |
Extracted view images (.svg, .png, optional .jpg) |
🧠 Design Principles
- Top-level packages = notebook cells
- Nested packages stay embedded in their parent
- Imports are resolved at the top-level package granularity
- Views are fully qualified (e.g.
System::Views::MyView) - Fail early, fail clearly
🧠 CLI Design Notes
- The CLI is implemented using Typer (Click-based) for:
- Strong typing
- Clear
--helpoutput - Explicit boolean flags (
--flag / --no-flag)
- Boolean toggles are always separated from path arguments
(e.g.
--graphvs--graph-png) - All validation failures (cycles, missing packages, execution errors) result in a non-zero exit code, making the tool CI-friendly
⚠️ Common Errors & Fixes
No such kernel named sysml
- The SysML kernel is not registered
- Run
jupyter kernelspec list - Install and register the kernel
Cairo INVALID_SIZE error
- SVG view is too large
- Automatically handled via scaling logic
- Tunable via
max_dim_px/max_pixels
Missing package error
- An
importreferences a package not found in the scanned files - Either add the package or ignore it explicitly
🧩 Extensibility
Windseeker is designed to be extended easily:
- Additional CLI commands
- CI integration
- JSON dependency reports
- Multiple view renderers
- Alternative image formats
- View grouping or filtering
📜 License
This project is intended as a tooling and analysis aid for SysML v2 models. No official affiliation with OMG or any SysML v2 tool vendor is implied.
Development setup (recommended)
Install dev dependencies and enable pre-commit hooks:
pip install -e ".[dev]"
pre-commit install
Metadata
Release files for windseeker 1.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| windseeker-1.1.3.tar.gz | 18.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| windseeker-1.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.9 kB
Release files / windseeker-1.1.3.tar.gz
| Download URL | windseeker-1.1.3.tar.gz |
|---|---|
| Size | 18.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7ddb66bf8210641d04877d2788dd467a6b6764ad5dcf78174affbec265fe8e0d
|
|
BLAKE2b-256 checksum How to use checksums |
ff054f856d8110badf666a7fdf209d31a1c26d68b4333044fee1898c9e38885d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.6
|
Release files / windseeker-1.1.3-py3-none-any.whl
| Download URL | windseeker-1.1.3-py3-none-any.whl |
|---|---|
| Size | 15.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
291f8785885fdc84855f517ae6a9c9a8e44a4ac39ad653bccfbd7e0061bcda9b
|
|
BLAKE2b-256 checksum How to use checksums |
5e65b918a71d592933b4cf638768bb28ae4b5bfe015b4c1e6ee574cc17141f57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.6
|