PAX is the official package manager for XCX, integrated directly into the xcx binary. It manages dependencies, project scaffolding, registry publishing, and build automation.
Every PAX project must have a project.pax file in its root directory. It uses a custom declarative format.
---
PAX Project Configuration
*---
/
name :: "my_project",
version :: "1.0.0",
author :: "yourname",
description :: "A short description of the project",
main :: "src/main.xcx",
tags :: ["tag1", "tag2"],
files :: ["src/main.xcx", "src/lib.xcx"],
deps :: [
"somelib@1.0.0",
"author/repo@latest",
"https://example.com/lib.xcx"
]
/
| Field | Required | Description |
|---|---|---|
name |
Yes | Logical name of the project/package. |
version |
Yes | Semantic version string (e.g. "1.0.0"). |
author |
No | Author name, shown on the registry. |
description |
No | Short description of the project. |
main |
No | Custom entry point. Defaults to src/main.xcx if omitted. |
tags |
No | List of tags for registry discoverability. |
files |
No | Explicit list of files to include when publishing. If omitted, PAX excludes known non-code files automatically. |
deps |
No | List of dependencies. Supports versioned names, author/repo shortcuts, and direct URLs. |
deps :: [
"mylib@1.0.0", --- versioned registry package
"mylib@latest", --- latest registry package
"author/mylib@2.1.0", --- with author prefix
"https://example.com/lib.xcx" --- direct URL
]
PAX automatically maintains a pax.lock file after each install. It records the exact resolved version and local path of every installed dependency.
{
"mylib": { "version": "mylib@1.0.0", "file": "lib/mylib/" },
"otherlib": { "version": "otherlib@latest", "file": "lib/otherlib/" }
}- Do not edit
pax.lockmanually. - Commit it to version control for reproducible builds.
A standard PAX project follows this layout:
my_project/
├── project.pax # Project configuration
├── pax.lock # Auto-generated lockfile
├── src/
│ └── main.xcx # Main entry point
├── lib/ # Installed dependencies (managed by PAX)
└── tests/ # Project-specific tests
PAX is invoked via xcx pax <command>.
| Command | Description |
|---|---|
xcx pax new <name> |
Scaffold a new project structure. |
xcx pax install |
Fetch all dependencies into lib/. |
xcx pax add <dep> |
Add a dependency and install it immediately. |
xcx pax remove <name> |
Remove a dependency from project.pax. |
xcx pax clone <package> |
Download a published package as a local project. |
xcx pax run [path] |
Execute the project entry point. |
xcx pax search <query> |
Search the registry for available packages. |
xcx pax login <token> |
Store a registry authentication token. |
xcx pax logout |
Remove the stored authentication token. |
xcx pax whoami |
Verify your current registry account. |
xcx pax publish |
Publish the project to the PAX registry. |
Scaffolds a new project with the standard directory layout.
xcx pax new my_projectCreates:
my_project/
├── project.pax
├── src/
│ └── main.xcx
└── README.md
Reads project.pax, resolves all deps, and downloads them into lib/. Skips packages already present (by name).
xcx pax install- Only installs files declared in the dependency's own
filesfield. - If the dependency has no
filesfield, PAX automatically excludesREADME.md,LICENSE,tests/,docs/,.git*, andproject.pax. - Updates
pax.lockafter each successful fetch.
Adds a dependency to project.pax and immediately runs install.
xcx pax add mylib@1.0.0
xcx pax add author/mylib@latestRemoves a dependency entry from project.pax.
xcx pax remove mylibNote:
lib/folders andpax.lockentries are not automatically cleaned up. Re-runxcx pax installor remove them manually.
Downloads a published package from the PAX registry as a full local project, ready to run or modify.
xcx pax clone snake_game
xcx pax clone author/snake_game- Creates a directory named after the package in the current working directory.
- Copies the full project structure including
project.pax,src/, and all declared files. - Does not install dependencies automatically.
Typical workflow:
xcx pax clone snake_game
cd snake_game
xcx pax install
xcx pax runExecutes the project. Entry point resolution order:
- Path provided as argument (e.g.
xcx pax run other/main.xcx) mainfield inproject.pax- Default:
src/main.xcx
xcx pax run
xcx pax run src/alt.xcxSearches the PAX registry for packages matching the query.
xcx pax search jsonOutput format:
- json_utils (v1.2.0) by alice
- fast_json (v0.9.1) by bob
Stores a registry authentication token locally in .pax_token.
xcx pax login your_token_hereRemoves the stored authentication token.
xcx pax logoutVerifies your current registry session and prints your account info.
xcx pax whoami
# Account: alice [developer]Publishes the current project to the PAX registry. Requires login.
xcx pax publish- Reads
project.paxfor metadata (name,version,description). - Scans and uploads all project files (excluding
.zip,.pax_token,.git). - Sends a compressed archive + file manifest to the registry.
Note: Bump
versioninproject.paxbefore each publish. The registry may reject duplicate versions.
By default PAX connects to pax.xcxlang.com. You can override this via a .pax_config file in the project root:
{
"registry": "https://my-custom-registry.example.com"
}- HTTP is used automatically for
localhostand127.0.0.1. - HTTPS is used for all other hosts.