CLI Reference
Oidis Builder is invoked via the oidis command (Windows: oidis.cmd). The general form is:
oidis <command> [options]
All commands are executed in the context of the current working directory, which must be the project root
(the folder containing package.conf.jsonp). Use --base to override this.
Main Commands
| Command | Description |
|---|---|
oidis install | Check and prepare project dependencies, run initial setup |
oidis build <type> | Build the project with the specified release type |
oidis test <type> | Run tests or linting |
oidis run | Build a development release and open it in the browser |
oidis docs | Generate TypeDoc / Doxygen documentation |
oidis clean | Remove all files generated by builder tasks |
oidis deploy[:<type>] | Deploy the built package to a configured server |
oidis update | Self-update Oidis Builder to the latest version |
oidis <task_name> | Execute any named builder task directly |
oidis install
Prepares the project for development:
- Downloads and installs all dependencies defined in
package.conf.jsonp - Validates and updates the project configuration
It does not update ForceCompile.ts; that happens in every oidis build <type> (see below).
oidis install
oidis build <type>
Compiles the project into a release package. The compile step of every type adds each project source file
containing @Extern(, @Resolver( or @Route( to the generated block of ForceCompile.ts
(details).
oidis build <type> [--with-test] [--skip-test]
| Type | Description |
|---|---|
prod | Production build — all tests run, no dev markers, full optimization |
eap | Early Access Preview — dev markers removed, optimization on, tests skipped |
dev | Development build — fast, no optimization |
alpha | Alias for eap |
beta | Alias for eap |
Options:
| Option | Description |
|---|---|
--with-test | Run tests as part of the build |
--skip-test | Explicitly skip tests (overrides project defaults) |
Shortcut forms (without the build keyword):
oidis prod # equivalent to: oidis build prod
oidis eap # equivalent to: oidis build eap
oidis dev # equivalent to: oidis build dev
Rebuild variants — force full rebuild, ignoring caches:
oidis rebuild # full clean rebuild
oidis rebuild-dev # clean rebuild, dev type
oidis rebuild-dev-skip-test # clean rebuild, dev type, no tests
oidis rebuild-eap # clean rebuild, EAP type
oidis rebuild-eap-skip-test # clean rebuild, EAP type, no tests
oidis test <type>
Runs tests and code quality checks.
oidis test <type> [--ignore-tests=<list>]
| Type | Task executed | Description |
|---|---|---|
all | test:all | Run all implemented tests |
lint | test:lint | Run all linters (TS, SASS, JS, C++, Java, Python) |
unit | run-unit-test | Run TypeScript unit tests |
coverage | run-coverage-test | Run code coverage analysis |
selenium | test:selenium | Run Selenium integration tests |
Running a single unit test file:
oidis test unit path/to/MyTest.spec.ts
Options:
| Option | Description |
|---|---|
--ignore-tests=<list> | Comma-separated list of test file paths to ignore |
oidis run
Builds the development release and starts a local server with hot reload.
oidis run [--run-config=<name>]
| Option | Description |
|---|---|
--run-config=<name> | Specify which run configuration to use (default: "default") |
Named run configurations are defined in package.conf.jsonp under run section.
The builder supports local runs, remote runs via Hub/Service, and cloud-synced runs.
oidis run # run with default configuration
oidis run --run-config=demo # run with 'demo' configuration
oidis run:demo # shortcut for --run-config=demo
oidis docs
Generates project documentation.
oidis docs
- TypeScript projects → TypeDoc HTML output
- C++ projects → Doxygen HTML output
- Output location:
build/target/docs/
oidis clean
Removes all files generated by builder tasks (compiled output, build cache, target folder).
oidis clean
Equivalent to running the project-cleanup:all internal task.
oidis deploy[:<type>]
Deploys the built package to a configured deploy server.
oidis deploy
oidis deploy:<type>
oidis deploy:<type> --action=<action> [--id=<id>] [--filter=<filter>] [--upload-to=<target>]
| Type | Description |
|---|---|
dev | Deploy to development server |
eap | Deploy to EAP server |
prod | Deploy to production server |
Options:
| Option | Values | Description |
|---|---|---|
--action=<value> | list, geturl, redeploy, getmethods | Perform a specific deploy action instead of uploading |
--id=<value> | — | Model ID for targeted operations |
--upload-to=<value> | dev, eap, prod, or URL | Override the deploy target |
--filter=<value> | name, version, platform, id, release, buildtime | Comma-separated filter for list/query operations |
Examples:
oidis deploy:dev # deploy to dev server
oidis deploy:prod --action=list # list deployed packages on prod
oidis deploy:prod --action=list --filter=name,version
oidis deploy:prod --action=redeploy --id=42
oidis deploy:eap --upload-to=https://custom.server.io
oidis update
Self-updates the Oidis Builder installation to the latest version.
oidis update
Global Options
These options can be combined with any command:
| Option | Description |
|---|---|
-h, --help | Print help message |
-v, --version | Print builder version |
-p, --path | Print current Oidis Builder installation location |
--base=<path> | Override the project base path (default: current working directory) |
--info=<property> | Print a metadata property from the target project (default property: version) |
--force | Force-execute the task, bypassing cache checks |
--solution=<name>, -s <name> | Specify a named solution from package.conf.jsonp (default: "default") |
Examples:
oidis --version
oidis --info=version
oidis --info=name
oidis --base=../other-project build dev
oidis build prod --solution=arm
oidis build prod --force
Service & Agent Mode
Oidis Builder can run as a background service or connect to Oidis Hub as a remote agent.
| Command | Description |
|---|---|
oidis service | Start the Builder service in the background |
oidis service stop | Stop the running Builder service |
oidis agent | Connect the Builder service to Oidis Hub as an agent |
| Option | Description |
|---|---|
--port=<value> | Specify the port for the service (default from private.conf.jsonp) |
--agent-name=<name> | Specify a label for this agent instance |
Task Forwarding
Commands can be forwarded to a running service or to Oidis Hub instead of executing locally:
| Option | Description |
|---|---|
--service | Forward the task to the running Builder service |
--hub | Forward the task to Oidis Hub |
oidis build prod --service # run the build on the Builder service
oidis test lint --hub # run linting via Oidis Hub
Linting Scope
oidis test lint always lints the whole project. Neither the CLI nor any task option accepts a
file path or glob — the TypeScript file set is a code-level constant
(TypeScriptLint.getConfig(), group project = source/**/*.{ts,tsx} + test/**/*.{ts,tsx}),
and the only other key in that config is the reserved options.
oidis test lint # all linters (ts, sass, js, xcpp, java, python), whole project
oidis test:tslint # TypeScript linter only - saves ~3%, not the file set
oidis tslint:project # the same file set, invoked directly
--file= is silently ignored by lint tasksoidis test lint --file=<path> and oidis tslint:project --file=<path> exit 0 having linted every
file. Nothing warns you. The option exists for other tasks (e.g. unit), not for linting.
Passing a path as the task option fails loudly instead, which is the safer mistake:
oidis tslint:<path> → tslint config "<path>" has not been found.
test-lint-stagged-only is not a scoping tool either. It wraps the lint chain between
git-manager:backup and git-manager:restore, which reverse-applies git diff so the working tree
temporarily matches the index. It still lints all files — the scope is by content, not by file set,
and it is slower than a plain lint run. It also rewrites the working tree, so never run it with
uncommitted work you care about unless you understand the backup/restore pair.
Scoping to one file through a project module
Single-file linting is achievable via the builder's module hook, which can inject an extra src group
into the task config before tslint runs:
{ "lint-scope": { "script": "bin/project/scripts/LintScope.js", "events": { "before": ["tslint"] } } }
ProcessAsync = async ($cwd, $args) => {
const target = Io.Oidis.Builder.Loader.getInstance().getProgramArgs().getOptions().file;
if (target) {
Io.Oidis.Builder.Tasks.TypeScript.TypeScriptLint.getConfig().scoped = [target, "!**/*.d.ts"];
}
};
oidis tslint:scoped --file=source/typescript/Io/Oidis/Labs/Loader.ts
oidis tslint:scoped --file=source/typescript/Io/Oidis/Labs/Utils/**/*.ts
Registering through modules.register.json keeps package.conf.jsonp untouched. Setting
config.options.fix = true in the same hook gives a single-file auto-fix.
Measured on a ~150-file project: 13.9 s for the whole project, 8.6 s for one file. tslint runs
tseslint.configs.recommendedTypeChecked with parserOptions.projectService: true, so ESLint builds
the full TypeScript program for type-aware rules regardless of how few files it then reports on. That
~8 s floor is irreducible without giving up typed linting. The builder passes no ESLint cache
option and has no lint watch mode.
A scoped run is a faithful subset, not a weakened config: the same planted errors are reported by
tslint:scoped and tslint:project alike. Exit codes are script-friendly — 0 on pass, 127 on
lint failure.
Direct Task Execution
Any named internal task can be run directly by name. Use the task pseudo-command:
oidis task <task_name>
oidis task <task_name>:<option>
Or simply pass the task name as the first argument (if it is not a recognized main command):
oidis typescript # run TypeScript compilation task
oidis sass-compress # run SASS minification
oidis version-update # run version update task
oidis project-cleanup:all # run cleanup with 'all' option
See Tasks Reference for the complete list of available tasks.
Toolchain Passthrough
Use -- to forward arguments directly to an underlying toolchain (Node.js, compiler, etc.):
oidis -- <command> [args]
This bypasses task resolution entirely. The target project is not loaded.
Advanced Options
| Option | Description |
|---|---|
--with-dependencies | Include project dependencies in the operation |
--with-products-sync | Sync products during the operation |
--no-server | Do not start the local server |
--no-sudo | Skip sudo in commands that would normally use it (Linux/Mac) |
--no-target | Run without loading a target project |
--chain-id=<id> | Internal: identifier for chained task execution across services |
--run-config=<name> | Select a named run configuration |
--file=<path> | Specify a file path (used with some tasks like unit test) |
--to=<path> | Specify a destination path (used with copy/deploy tasks) |
--new-version=<value> | Specify a new version string (used with version-update) |
--description=<text> | Specify a description (used with deploy tasks) |
Option Syntax
Options follow two forms depending on whether they have a value:
--option-name # boolean flag
--option-name=value # named value
Many tasks accept a subtype via the colon syntax: task:option. For example:
build:prod— build task, prod optiontest:lint— test task, lint optionproject-cleanup:all— cleanup task, all option
This syntax works both in the CLI and in modules.register.json hooks.
See also: Tasks Reference | Configuration | Troubleshooting