Note
This toolchain component is designed for creating, testing, and deploying plugins to the Nexus N3 Core edge architecture.
Developer tooling for creating, preparing, testing, and packaging Nexus N3 plugins.
This repository provides the shared SDK and CLI used to author Nexus N3 sensor and algorithm plugins.
Repository:
https://github.com/Nexus-N3/nexus-n3-plugin-tooling
This repository provides:
nexus-n3-plugin-sdk: shared authoring contracts for Nexus N3 pluginsnexus-n3-plugin-cli: thenexus-n3-plugincommand-line tool- scaffolding for sensor and algorithm plugins
- isolated per-plugin environment creation
- local source-tree validation
- Phase 1
.rsnxpluginbundle packaging compatible withnexus-n3-core - a focused sensor-plugin harness for source-tree development checks
- CSV capture output from harness test runs for offline inspection
The main idea is simple:
Install the plugin tooling once.
Use nexus-n3-plugin to create plugins.
Each plugin gets its own isolated .venv.
Build and test commands use the plugin's own .venv.
The CLI is not installed into every plugin .venv.
This project is in early development.
The current implemented scope is:
- plugin scaffolding
- local source-tree validation
- Phase 1
.rsnxpluginbundle packaging fornexus-n3-core
Live isolated plugin runtime execution still belongs to nexus-n3-core.
nexus-n3-plugin-tooling owns the developer-side workflow for creating and building plugins.
nexus-n3-core owns plugin installation, cataloging, runtime discovery, and runtime execution.
Nexus N3 plugin development uses three separate environments.
The tooling environment belongs to this repository.
Example location:
nexus-n3-plugin-tooling/.venv
It contains:
- the
nexus-n3-pluginCLI - the plugin SDK source
- scaffold/build/test orchestration code
It is used to:
- scaffold plugins
- create plugin environments
- launch plugin builds
- run plugin validation commands
The tooling environment is installed once.
Each plugin owns its own isolated Python environment.
Example location:
nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dot/.venv
It contains:
- the plugin package
- the plugin's runtime dependencies
- the plugin's build dependencies
- the Nexus N3 plugin SDK dependency required by the plugin
It is used to:
- develop the plugin
- test the plugin
- build the plugin wheel
- collect dependencies for
.rsnxpluginbundles
Each plugin gets its own .venv to avoid dependency conflicts between plugins.
The nexus-n3-plugin CLI should not be installed into every plugin .venv.
The runtime environment belongs to nexus-n3-core.
Example location:
nexus-n3-core/.venv
It contains:
nexus-n3-core- installed
.rsnxpluginbundles - plugin discovery and runtime execution code
It is used to:
- install plugin bundles
- discover installed plugins
- run plugins inside Nexus N3 OS
Recommended layout:
<workspace>/
nexus-n3-plugin-tooling/
nexus-n3-core/
nexus-n3-plugin-catalog/
sensors/
algorithms/
plugin-builds/
sensors/
algorithms/
Example:
nexus-n3-project/
nexus-n3-plugin-tooling/
nexus-n3-core/
nexus-n3-plugin-catalog/
sensors/
nexus-n3-sensor-movella-dot/
.venv/
algorithms/
nexus-n3-algorithm-standard-loading-intensity/
.venv/
plugin-builds/
sensors/
algorithms/
Directory conventions:
- sensor plugin repositories live under
nexus-n3-plugin-catalog/sensors/ - algorithm plugin repositories live under
nexus-n3-plugin-catalog/algorithms/ - built sensor bundles go under
nexus-n3-plugin-catalog/plugin-builds/sensors/ - built algorithm bundles go under
nexus-n3-plugin-catalog/plugin-builds/algorithms/
- Python 3.10 or newer
- Python
venvsupport pipgit
Clone this repository and run the installer:
git clone https://github.com/Nexus-N3/nexus-n3-plugin-tooling.git
cd nexus-n3-plugin-tooling
./install.sh
on windows
./install_win.sh
on windows if the nexus-n3-plugin command is not available reload the Git Bash configuration:
source ~/.bashrcThe installer creates or reuses .venv inside the tooling repository.
It installs the SDK and CLI in editable mode and validates that nexus-n3-plugin can start.
Plugin .venv directories are local development artifacts and are not
committed to the catalog. After cloning the catalog, prepare an individual
plugin with:
nexus-n3-plugin prepare \
--plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dotThe command creates the plugin environment and installs its build tooling, the local Nexus N3 plugin SDK, and the plugin itself. It supports native Windows and POSIX virtual-environment layouts.
The build command also prepares a plugin automatically when its .venv is
missing. To build every sensor and algorithm in the catalog:
nexus-n3-plugin build \
--catalog-root /path/to/nexus-n3-plugin-catalog \
--output-dir /path/to/nexus-n3-plugin-catalog/plugin-builds \
--target winBundles are written below plugin-builds/sensors/ and
plugin-builds/algorithms/.
Activate the tooling environment:
# Linux, macOS, or WSL
source .venv/bin/activate
# Native Windows from Git Bash
source .venv/Scripts/activate
nexus-n3-plugin --helpAlternatively, add the tooling environment to your PATH:
export PATH="/path/to/nexus-n3-plugin-tooling/.venv/bin:$PATH"
nexus-n3-plugin --helpTo install into a different tooling virtual environment path:
NEXUS_N3_PLUGIN_TOOLING_VENV=/path/to/venv ./install.shTo choose a specific Python executable:
PYTHON=/path/to/python3 ./install.shWhen the SDK or CLI changes, rerun the installer from the tooling repository:
cd /path/to/nexus-n3-plugin-tooling
./install.shThis refreshes the tooling .venv, reinstalls the SDK and CLI in editable
mode, and validates that nexus-n3-plugin still starts.
The intended workflow is:
1. Install nexus-n3-plugin-tooling once.
2. Use nexus-n3-plugin init to scaffold a plugin.
3. The init command creates the plugin source tree and the plugin's isolated .venv.
4. Edit the plugin code as needed.
5. Build a .rsnxplugin bundle using nexus-n3-plugin build.
6. Install the bundle into nexus-n3-core.
7. Run nexus-n3-core, which discovers installed plugins from the configured plugin root.
The tooling CLI is shared.
The plugin .venv is isolated.
The runtime consumes the final bundle.
Use this flow while developing a sensor plugin:
1. Install or refresh nexus-n3-plugin-tooling with ./install.sh.
2. Scaffold a plugin with nexus-n3-plugin init.
3. Implement the plugin inside its own source repository and .venv.
4. Run the sensor harness against the plugin source tree.
5. Inspect the captured CSV output.
6. Build the final .rsnxplugin bundle once the harness run is satisfactory.
Create the shared development directories:
mkdir -p /path/to/nexus-n3-plugin-catalog/sensors
mkdir -p /path/to/nexus-n3-plugin-catalog/algorithms
mkdir -p /path/to/nexus-n3-plugin-catalog/plugin-builds/sensors
mkdir -p /path/to/nexus-n3-plugin-catalog/plugin-builds/algorithmsAssuming a workspace layout like:
<workspace>/
nexus-n3-plugin-tooling/
nexus-n3-plugin-catalog/
sensors/
nexus-n3-sensor-movesense/
refresh the tooling first:
cd /path/to/nexus-n3-plugin-tooling
./install.shThen run the Movesense harness from the workspace root or from the tooling repository:
nexus-n3-plugin test sensor \
--plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movesense \
--adapter-backend nexus_ble_gateway \
--gateway-serial-port /dev/serial/by-id/your_gateway_port \
--duration 15 \
--fail-on-no-dataIf you want direct host BLE instead of the gateway backend:
nexus-n3-plugin test sensor \
--plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movesense \
--adapter-backend bleak \
--duration 15 \
--fail-on-no-dataOptional useful flags:
--identifyto call the plugin identify path after connect--sensor-count Nto instantiate more than one expected sensor--attribute KEY=VALUEto override sensor attributes during the run--output-dir /path/to/capture-dirto control where captured files are written
By default the harness writes captured output under the plugin repository:
nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movesense/
plugin-test/
ecg.csv
hr.csv
temp.csv
errors.log
These CSV files are intended for developer inspection after the run. The developer can analyze them with spreadsheets, Python, plotting tools, or any other preferred workflow.
The test sensor command is provided by the shared tooling CLI. It launches
the harness in the tooling environment and adds the plugin .venv
site-packages for plugin-side dependencies. This keeps the CLI and harness out
of plugin environments while still using plugin-local dependencies during the
test run.
By default, nexus-n3-plugin test sensor does not reinstall the SDK or rebuild
the plugin. It is intended for source-mode testing before bundle creation. Use
--refresh-env only when you explicitly want to resync the plugin .venv.
This command is not currently a built-bundle validation command. Validation of
the final .rsnxplugin can be done locally with nexus-n3-plugin test sensor-bundle or after installation into nexus-n3-core.
Built bundle example:
nexus-n3-plugin test sensor-bundle \
--bundle-path /path/to/nexus-n3-plugin-catalog/plugin-builds/sensors/nexus-n3-sensor-movella-dot-0.1.0.rsnxplugin \
--adapter-backend bleak \
--duration 15 \
--fail-on-no-dataBy default built-bundle capture files are written under:
/path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dot/
plugin-test/
Algorithm plugin example:
nexus-n3-plugin test algorithm \
--plugin-root /path/to/nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-standard-loading-intensity \
--sensor-plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movesense \
--adapter-backend nexus_ble_gateway \
--gateway-serial-port /dev/serial/by-id/your_gateway_port \
--duration 15 \
--fail-on-no-resultsThe algorithm harness uses the selected sensor plugin to generate source-mode samples, feeds those samples through a reduced compute-manager flow, prints compute events in the terminal, and writes JSONL outputs under:
nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-standard-loading-intensity/
plugin-test/
sensor-data/
<sample-type>.csv
errors.log
computed/
real_time.jsonl
intermediate.jsonl
consolidated.jsonl
The harness is intended to mirror nexus-n3-core compute-result behavior:
- sensor samples flow into a compute-manager style path
- emitted compute results are split by
stage real_timeoutputs are sensor-level compute resultsintermediateandconsolidatedoutputs are algorithm-stage aggregates- algorithm payload bodies are not normalized across plugins
This is deliberate. Different algorithms emit different result content. The
shared contract is the compute-result routing envelope, especially stage, not
a single shared payload schema for all algorithms.
Built algorithm bundle example with a built sensor bundle:
nexus-n3-plugin test algorithm-bundle \
--bundle-path /path/to/nexus-n3-plugin-catalog/plugin-builds/algorithms/nexus-n3-algorithm-standard-loading-intensity-0.1.0.rsnxplugin \
--sensor-bundle-path /path/to/nexus-n3-plugin-catalog/plugin-builds/sensors/nexus-n3-sensor-movesense-0.1.2.rsnxplugin \
--adapter-backend nexus_ble_gateway \
--gateway-serial-port /dev/serial/by-id/your_gateway_port \
--duration 15 \
--fail-on-no-resultstest algorithm accepts either:
--sensor-plugin-root /path/to/source-plugin--sensor-bundle-path /path/to/built-sensor.rsnxplugin
test algorithm-bundle accepts the same sensor input choices while loading the
algorithm itself from --bundle-path.
Run the command from anywhere using the shared tooling CLI:
nexus-n3-plugin init sensor movella-dot --output-dir /path/to/nexus-n3-plugin-catalogWhen --output-dir points at the shared nexus-n3-plugin-catalog workspace, sensor plugins are placed under:
nexus-n3-plugin-catalog/sensors/
Example with additional metadata:
nexus-n3-plugin init sensor movella-dot \
--output-dir /path/to/nexus-n3-plugin-catalog \
--manufacturer-id 2182 \
--sample-type imuThis creates the plugin source tree and its isolated .venv.
Example output:
nexus-n3-plugin-catalog/
sensors/
nexus-n3-sensor-movella-dot/
.venv/
pyproject.toml
plugin.json
src/
nexus_n3_sensor_movella_dot/
plugin.json
parser.py
sensor.py
samples.py
tests/
specs/
Canonical sensor naming:
repo name:
nexus-n3-sensor-<plugin-id>
Python package:
nexus_n3_sensor_<plugin_id>
--package-name remains available as an override, but the default convention is the expected layout for new sensor plugins.
Run the command from anywhere using the shared tooling CLI:
nexus-n3-plugin init algorithm standard-loading-intensity --output-dir /path/to/nexus-n3-plugin-catalogWhen --output-dir points at the shared nexus-n3-plugin-catalog workspace, algorithm plugins are placed under:
nexus-n3-plugin-catalog/algorithms/
Intermediate and consolidation executor files are always scaffolded.
By default, their schedules are disabled and the generated executor classes are no-op placeholders.
Use these flags when you want the scaffold to enable those stages in plugin.json and config.yaml and provide example implementations:
nexus-n3-plugin init algorithm generic-data-summary \
--output-dir /path/to/nexus-n3-plugin-catalog \
--with-intermediate \
--with-consolidationThis creates the plugin source tree and its isolated .venv.
Example output:
nexus-n3-plugin-catalog/
algorithms/
nexus-n3-algorithm-generic-data-summary/
.venv/
pyproject.toml
plugin.json
src/
nexus_n3_algorithm_generic_data_summary/
plugin.json
core.py
core_schema.py
processing.py
config.yaml
intermediate_executor.py
consolidation_executor.py
tests/
Canonical algorithm naming:
repo name:
nexus-n3-algorithm-<plugin-id>
Python package:
nexus_n3_algorithm_<plugin_id>
The init command is responsible for creating a usable plugin development repository.
It should:
1. Create the plugin directory.
2. Write the standard plugin source layout.
3. Write pyproject.toml.
4. Write plugin.json.
5. Write package-level plugin metadata.
6. Write starter tests.
7. Create <plugin-root>/.venv.
8. Install or upgrade pip.
9. Install setuptools, wheel, and build.
10. Install the local Nexus N3 plugin SDK into the plugin .venv.
11. Install the generated plugin package into the plugin .venv.
The plugin .venv belongs to the plugin.
The tooling .venv belongs to the shared CLI.
The CLI should not need to be installed into the plugin .venv.
Each plugin declares and owns its own dependencies.
Those dependencies should be installed into the plugin's own .venv.
For example, an algorithm plugin may need:
cd /path/to/nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-example
source .venv/bin/activate
python -m pip install numpy scipyA sensor plugin may need different dependencies:
cd /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-example
source .venv/bin/activate
python -m pip install pydanticOnly install the dependencies required by that plugin.
Do not use a shared plugin development environment for multiple plugins.
The build command produces a Phase 1 .rsnxplugin ZIP bundle compatible with the nexus_n3.plugins installer in nexus-n3-core.
If a bundle with the same filename already exists in the output directory, it is replaced automatically.
Basic usage:
nexus-n3-plugin build \
--plugin-root /path/to/plugin \
--output-dir /path/to/plugin-buildsSensor example:
nexus-n3-plugin build \
--plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dot \
--output-dir /path/to/nexus-n3-plugin-catalog/plugin-builds/sensors
nexus-n3-plugin build \
--plugin-root /home/mike/Desktop/apps/dev/nexus-n3-project/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movesense \
--output-dir /home/mike/Desktop/apps/dev/nexus-n3-project/nexus-n3-plugin-catalog/plugin-builds/sensors
nexus-n3-plugin build \
--plugin-root /home/mike/Desktop/apps/dev/rs-nexus-project/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-x-imu3 \
--output-dir /home/mike/Desktop/apps/dev/rs-nexus-project/nexus-n3-plugin-catalog/plugin-builds/sensorsAlgorithm example:
nexus-n3-plugin build \
--plugin-root /path/to/nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-standard-loading-intensity \
--output-dir /path/to/nexus-n3-plugin-catalog/plugin-builds/algorithmsThe build command should use the plugin's own environment:
<plugin-root>/.venv
It should not depend on whichever virtual environment is active in the shell.
Conceptually:
nexus-n3-plugin build
-> locate plugin root
-> locate plugin .venv
-> use the platform-specific Python in <plugin-root>/.venv
-> build the plugin wheel
-> include the SDK wheel
-> collect bundle artifacts
-> write .rsnxplugin
If the plugin environment is missing or incomplete, the CLI prepares it before building. Preparation can also be run explicitly:
nexus-n3-plugin prepare --plugin-root /path/to/pluginExample output:
/path/to/nexus-n3-plugin-catalog/plugin-builds/sensors/
nexus-n3-sensor-movella-dot-0.1.0.rsnxplugin
The .rsnxplugin archive is a normal ZIP container.
It contains:
manifest.json
checksums.json
artifacts/
plugin wheel
SDK wheel
metadata/
optional copied metadata
Depending on the plugin type, metadata may include:
- sensor spec files
- algorithm config files
- other plugin-declared metadata
Each plugin .venv is the source of truth for that plugin's dependency set.
This avoids dependency conflicts between plugins.
A plugin with one version of a dependency and another plugin with a different version should be able to build independently because each has its own environment.
The bundle process should support two modes.
The bundle includes:
- plugin wheel
- SDK wheel
- manifest
- checksums
- metadata
Third-party dependencies are expected to be resolved by the target runtime environment.
The bundle includes:
- plugin wheel
- SDK wheel
- third-party dependency wheels
- manifest
- checksums
- metadata
This is preferred for offline or controlled deployments.
Expected command:
nexus-n3-plugin build \
--plugin-root /path/to/plugin \
--output-dir /path/to/plugin-builds \
--include-dependenciesWhen the build host and deploy host differ, target the deployment runtime explicitly. For a Raspberry Pi 5 deployment using Python 3.12:
nexus-n3-plugin build \
--plugin-root /path/to/plugin \
--output-dir /path/to/plugin-builds \
--include-dependencies \
--target-platform manylinux2014_aarch64 \
--target-python-version 3.12 \
--target-implementation cp \
--target-abi cp312Manual artifact inclusion should remain supported:
nexus-n3-plugin build \
--plugin-root /path/to/plugin \
--output-dir /path/to/plugin-builds \
--artifact /path/to/dist/numpy.whl \
--artifact /path/to/dist/scipy.whlGenerated plugins use nexus-n3-plugin-sdk contracts for base classes and shared types.
During init, the plugin .venv should install the SDK from the local tooling checkout.
During bundle creation, the CLI should include an SDK wheel when it can resolve the SDK source.
If needed, point explicitly at the SDK source:
nexus-n3-plugin build \
--plugin-root /path/to/plugin \
--output-dir /path/to/plugin-builds \
--sdk-root /path/to/nexus-n3-plugin-tooling/packages/sdkUse --no-sdk only when you intentionally do not want the SDK wheel included.
After building a bundle, install it from nexus-n3-core:
cd /path/to/nexus-n3-core
python -m nexus_n3.plugins install \
/path/to/nexus-n3-plugin-catalog/plugin-builds/sensors/nexus-n3-sensor-movella-dot-0.1.0.rsnxpluginFor local development against nexus-n3-plugin-catalog, nexus-n3-core also provides:
python -m nexus_n3.plugins install-dev \
--nexus-n3-plugin-catalog-root /path/to/nexus-n3-plugin-catalog \
--plugin movella-dotList local development plugins:
python -m nexus_n3.plugins install-dev-listnexus-n3-plugin-tooling builds bundles.
nexus-n3-core installs and runs bundles.
Generated plugins use:
- a
pyproject.tomlbuild definition - a root-level
plugin.jsonmanifest for source review - a packaged
src/<package>/plugin.jsonmanifest included in the built wheel - a
src/package layout nexus-n3-plugin-sdkcontracts for base classes and shared types- Python entry points for future runtime discovery
Current entry point groups are:
nexus_n3.sensors
nexus_n3.algorithms
Algorithm plugins may include:
- core processing code
- schema definitions
- processing helpers
- intermediate executor
- consolidation executor
- plugin config
Executor file presence is not the capability contract.
Runtime support for intermediate and consolidation stages is declared by:
plugin.json
config.yaml
For example:
plugin.json:
supports_intermediate
supports_consolidation
config.yaml:
schedules.intermediate.enabled
schedules.consolidated.enabled
nexus-n3-core should use those declarations when deciding whether to schedule or load optional executor stages.
Sensor plugins may declare and implement a consume_input hook when they accept forwarded data from another sensor plugin through the runtime.
Algorithm plugins already receive per-sensor data through their existing sample pipeline.
Sensor plugins should not need to depend directly on BLE backends such as bleak for normal packaging.
Runtime BLE operations belong to nexus-n3-core in deployment and to the CLI harness adapter layer during source-mode plugin testing.
To validate a sensor plugin while developing it, without booting the full server:
nexus-n3-plugin test sensor \
--plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-exampleThe harness should use the plugin's own .venv.
The harness:
- loads the plugin from src/
- resolves the manifest entry point
- instantiates the sensor class
- uses the SDK sensor manager with the selected BLE adapter backend
- exercises discovery, connection, streaming, stop, and disconnect
- captures emitted data to CSV for developer inspection
- probes the optional consume_input hook
If the plugin .venv is missing, the plugin should be recreated or the environment should be repaired.
The normal path is for nexus-n3-plugin init to create the .venv.
Current reference migration plugins:
Sensor:
nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dot
Algorithm:
nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-standard-loading-intensity
Build sensor example:
nexus-n3-plugin build \
--plugin-root ./nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dot \
--output-dir ./nexus-n3-plugin-catalog/plugin-builds/sensorsBuild algorithm example:
nexus-n3-plugin build \
--plugin-root ./nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-standard-loading-intensity \
--output-dir ./nexus-n3-plugin-catalog/plugin-builds/algorithmsExpected outputs:
nexus-n3-plugin-catalog/plugin-builds/sensors/
nexus-n3-sensor-movella-dot-0.1.0.rsnxplugin
nexus-n3-plugin-catalog/plugin-builds/algorithms/
nexus-n3-algorithm-standard-loading-intensity-0.1.0.rsnxplugin
Install tooling once:
cd /path/to/nexus-n3-plugin-tooling
./install.sh
source .venv/bin/activateScaffold a sensor plugin:
nexus-n3-plugin init sensor movella-dot --output-dir /path/to/nexus-n3-plugin-catalogScaffold an algorithm plugin:
nexus-n3-plugin init algorithm standard-loading-intensity --output-dir /path/to/nexus-n3-plugin-catalogBuild a sensor plugin:
nexus-n3-plugin build \
--plugin-root /path/to/nexus-n3-plugin-catalog/sensors/nexus-n3-sensor-movella-dot \
--output-dir /path/to/nexus-n3-plugin-catalog/plugin-builds/sensorsBuild an algorithm plugin:
nexus-n3-plugin build \
--plugin-root /path/to/nexus-n3-plugin-catalog/algorithms/nexus-n3-algorithm-standard-loading-intensity \
--output-dir /path/to/nexus-n3-plugin-catalog/plugin-builds/algorithmsInstall bundle into Nexus N3 OS:
cd /path/to/nexus-n3-core
python -m nexus_n3.plugins install \
/path/to/nexus-n3-plugin-catalog/plugin-builds/sensors/nexus-n3-sensor-movella-dot-0.1.0.rsnxpluginDo not require this:
cd /path/to/plugin
source .venv/bin/activate
pip install -e /path/to/nexus-n3-plugin-tooling/packages/cliThe plugin .venv is for the plugin and its dependencies.
The tooling .venv is for the shared CLI.
The CLI should call into the plugin .venv when it needs to build or test the plugin.
The SDK and CLI packages currently use setup.py because editable local installs are the main development workflow.
Scaffolded plugin projects use pyproject.toml.
The build path should avoid relying on the caller's active Python environment.
Preferred behavior:
nexus-n3-plugin build
uses the platform-specific Python in <plugin-root>/.venv
Avoid this behavior:
nexus-n3-plugin build
uses whichever python happens to be active in the shell
This makes the build process more predictable and keeps plugin dependencies isolated.
Do not commit local runtime artifacts.
Examples:
.venv/
__pycache__/
*.pyc
build/
dist/
*.egg-info/
plugin-build/
*.rsnxplugin
These should be covered by .gitignore.
This repository should not contain:
- device credentials
- cloud connection strings
- SAS tokens
- API keys
- private keys
- site-specific configuration
- customer-specific deployment configuration
If a generated plugin needs deployment credentials or runtime configuration, provide those through the target runtime environment rather than committing them to the plugin source repository.
nexus-n3-plugin-tooling
creates, prepares, validates, and builds plugins
plugin repositories
contain plugin code, manifests, configs, tests, and isolated dependencies
nexus-n3-core
installs, catalogs, discovers, and runs plugins
This boundary should stay clear.
The tooling should make plugin development easy.
The plugin environment should keep dependencies isolated.
The runtime should consume built bundles.