Skip to main content

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​

CommandDescription
oidis installCheck 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 runBuild a development release and open it in the browser
oidis docsGenerate TypeDoc / Doxygen documentation
oidis cleanRemove all files generated by builder tasks
oidis deploy[:<type>]Deploy the built package to a configured server
oidis updateSelf-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]
TypeDescription
prodProduction build — all tests run, no dev markers, full optimization
eapEarly Access Preview — dev markers removed, optimization on, tests skipped
devDevelopment build — fast, no optimization
alphaAlias for eap
betaAlias for eap

Options:

OptionDescription
--with-testRun tests as part of the build
--skip-testExplicitly 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>]
TypeTask executedDescription
alltest:allRun all implemented tests
linttest:lintRun all linters (TS, SASS, JS, C++, Java, Python)
unitrun-unit-testRun TypeScript unit tests
coveragerun-coverage-testRun code coverage analysis
seleniumtest:seleniumRun Selenium integration tests

Running a single unit test file:

oidis test unit path/to/MyTest.spec.ts

Options:

OptionDescription
--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>]
OptionDescription
--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>]
TypeDescription
devDeploy to development server
eapDeploy to EAP server
prodDeploy to production server

Options:

OptionValuesDescription
--action=<value>list, geturl, redeploy, getmethodsPerform a specific deploy action instead of uploading
--id=<value>—Model ID for targeted operations
--upload-to=<value>dev, eap, prod, or URLOverride the deploy target
--filter=<value>name, version, platform, id, release, buildtimeComma-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:

OptionDescription
-h, --helpPrint help message
-v, --versionPrint builder version
-p, --pathPrint 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)
--forceForce-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.

CommandDescription
oidis serviceStart the Builder service in the background
oidis service stopStop the running Builder service
oidis agentConnect the Builder service to Oidis Hub as an agent
OptionDescription
--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:

OptionDescription
--serviceForward the task to the running Builder service
--hubForward 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 tasks

oidis 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:

resource/configs/modules.register.json
{ "lint-scope": { "script": "bin/project/scripts/LintScope.js", "events": { "before": ["tslint"] } } }
bin/project/scripts/LintScope.js
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.

The saving is bounded at roughly 40%

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​

OptionDescription
--with-dependenciesInclude project dependencies in the operation
--with-products-syncSync products during the operation
--no-serverDo not start the local server
--no-sudoSkip sudo in commands that would normally use it (Linux/Mac)
--no-targetRun 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
Task:Option Syntax

Many tasks accept a subtype via the colon syntax: task:option. For example:

  • build:prod — build task, prod option
  • test:lint — test task, lint option
  • project-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