Skip to content
ALWasp
Menu
ALWasp field guidev0.2.4

Build AL without breaking your flow.

The commands, config decisions, release clock, and CI signals worth keeping within arm’s reach.

Jump to commands
Fast path4 steps
  1. 01alwasp init
  2. 02alwasp config validate
  3. 03alwasp build ci
  4. 04alwasp validate compatibility

01 / Commands

The working set

Start

Set up a repository

Install
dotnet tool install --global left-code.AlWasp
Discover projects
alwasp init
Validate config
alwasp config validate
Build default target
alwasp build

Build

Compile with intent

Target or profile
alwasp build ci
One profile
alwasp build --profile appsource
Changed projects
alwasp build ci --changed-since latest:v*
Write manifest
alwasp build ci --manifest output/build.json

Maintain

Versions and tools

Apply versions
alwasp version apply release
Check AL tools
alwasp tools update --check
Update AL tools
alwasp tools update --clean
Fresh package ID
alwasp app set-package-id MyApp.app

Verify

Analyze and gate releases

Impact of a change
alwasp analyze ci --changed-since latest
Translation coverage
alwasp validate translations --fail-on needs-review
Compare packages
alwasp compare old.app new.app --json out.json
Structured output
alwasp restore --format json

02 / Config anatomy

Inventory → profiles → targets

{
  "$schema": "https://alwasp.dev/schema/alwasp.schema.json",
  "version": 1,
  "defaultTarget": "ci",
  "apps": [{ "id": "Core", "path": "./Core" }],
  "tests": [{ "id": "CoreTest", "path": "./CoreTest", "app": "Core" }],
  "profiles": {
    "appsource": { "include": "apps", "appSourceCop": true },
    "test": { "include": "tests", "needsProfile": "appsource" }
  },
  "targets": { "ci": ["appsource", "test"] }
}

Merge order

defaultsprofileproject override

Lists merge. Most strings and booleans use the most specific value.

Temporary transforms

versiondependenciesresourceExposurePolicyApplication InsightspreprocessorSymbols

Build restores the original app.json. version apply writes version changes permanently.

03 / Git changes

Choose a baseline

latestNewest local tag
latest:v*Newest local tag matching a glob
latest-merge:<text>Nearest matching first-parent merge
<git-ref>Explicit tag, branch, or commit
Use includeDependents: true to expand downstream. The older changeDetection.includeDependencies name is deprecated.

04 / Release clock

Friday nearest the 15th

The switch is inclusive. Repeated calculations in the same target month increment the build number.

When
Release
Preview
Before
Previous month
Current month
On / after
Current month
Next month

Hotfix was removed; repeated Release calculations cover that workflow.

05 / Compatibility

Two gates, different jobs

Compare packages

No compiler
alwasp compare old.app new.app \
  --json output/compare.json

Informational public-symbol change log between two compiled apps — always exits 0.

Validate source

AppSourceCop
alwasp validate compatibility \
  --project-root ./src \
  --baseline-directory ./latest

Recompiles current source against historical packages and validates in dependency order.

Authentication

Private feeds

ALWASP_PAT
Fallback token for authenticated feeds
--feed-token-env
Per-feed URL=ENV_VAR mapping
--auth-mode
Auto, Interactive, or NonInteractive

Outputs

Know the artifacts

.alpackages/
Restored symbol packages
.alwasp-packages
Incremental restore manifest
.output/build-manifest.json
Default requested build manifest

Exit signals

Make CI decisive

0Success / compare completed / no threshold hit1Invalid input or operation failed2Translation gate failed or tool update found
ALWasp cheatsheet · documentation for v0.2.4