A compiler-pipeline dependency resolver and installer for the Cpyte programming language.
import @std.json
↓
Resolve → Lower → Optimize → Execute
pip install cpyte-cpmNote: CPM uses the Cpyte package registry at https://cypackage.5gnew.io.vn/ as the default package source for Cpyte packages. The default registry is configured in pyproject.toml.
cpm init # create cpytoml
cpm add @std/json@^2.0 # add a dependency
cpm install # install all from manifest| Command | Description |
|---|---|
cpm init |
Initialize a new project (cpytoml) |
cpm add <pkg> |
Add packages to manifest + install |
cpm remove <pkg> |
Remove packages + uninstall |
cpm install |
Install all dependencies from manifest |
cpm install <pkg> |
Install specific packages |
cpm update |
Re-resolve and update all packages |
cpm update <pkg> |
Re-resolve specific packages |
cpm build |
Build the project (via the Cpyte compiler) |
cpm run <script> |
Run a named script (Python or .cpy) |
cpm exec <file.cpy> |
Execute a .cpy file with the Cpyte compiler JIT |
cpm doctor |
Diagnose the Cpyte compiler toolchain + project |
cpm info <pkg> |
Show detailed package information |
cpm list |
List installed packages |
cpm validate |
Validate project manifest and lockfile |
cpm search <query> |
Search for packages in registry |
cpm publish |
Publish a package to the registry (validated against the compiler's manifest rules) |
cpm unpublish |
Remove a package from the registry |
-v, --verbose Verbose output
-q, --quiet Suppress output
-y, --yes Auto-confirm prompts
--offline Offline mode (skip network)
--no-cache Disable cache
--config <path> Custom config / repo URL
--target <platform> Target platform (e.g. linux/x86_64)
--llvm-version <V> LLVM version for prebuilt packages
[cpm]
name = "my-app"
version = "1.0"
prebuilt = false
llvm_version = "18.1.0"
[cpm.target]
os = "linux"
arch = "x86_64"
features = ["gui", "ssl"]
[cpm.dependencies]
"@std/json" = "^2.0"
"@std/http" = "1.0"
"package_a" = "latest"Packages declare platform support; CPM filters based on your target.
Package metadata (registry):
{
"name": "win32-api",
"claims": { "os": ["windows"], "arch": ["x86_64"] }
}Resolution:
| Target | win32-api (windows) |
posix-api (linux) |
@std/json (any) |
|---|---|---|---|
linux/x86_64 |
skip | install | install |
windows/x86_64 |
install | skip | install |
Auto-detects from current platform when no target is specified.
When the registry serves precompiled LLVM IR:
[cpm]
prebuilt = true
llvm_version = "18.1.0"CPM fetches .ll artifacts from metadata/prebuilt/... and skips source packages
with incompatible LLVM versions (major version must match).
Auto-generated. Pins exact versions for reproducible builds.
[[package]]
name = "@std/json"
version = "2.0.3"
resolved = "https://repo.example.com/group/std/json/2.0.3.tar.gz"
checksum = "sha256:abc123..."
dependencies = ["@std/encoding@1.2.0"]
llvm_version = "18.1.0"
cpyte_version = "2.6.0"Prebuilt packages are also filtered by the Cpyte compiler version: a prebuilt
artifact whose cpyte_version differs in major version from the detected
compiler is skipped during resolution.
CPM is a compiler-pipeline package manager: it feeds the Cpyte compiler.
cpm buildcompiles your project through the Cpyte compiler toolchain (cpybinary, falling back topython -m cpyte) rather than an internal build script.cpm exec <file.cpy>JIT-runs any.cpyfile through the compiler.cpm run <script>resolves<script>.cpyscripts through the compiler JIT before falling back to plain Python.cpm publishvalidatespackage.jsonwith the compiler's ownManifestParser/ManifestValidatorbefore uploading, and auto-pins the detected compiler version for prebuilt artifacts.- Prebuilt dependency resolution checks the compiler version (major must match).
cpm doctorreports the detected compiler, module path, LLVM version, and project state in a single panel.- Installed extension packages are auto-discovered by the compiler from
.cpm/modules/, including scoped packages like@std/json.
┌─ Toolchain Diagnostics ──────────────┐
│ detected : yes │
│ version : 2.6.0 │
│ binary : /…/.venv/bin/cpy │
│ module : /…/site-packages/cpyte │
│ llvm : 18.1.8 │
└──────────────────────────────────────┘
┌─ Project ────────────────────────────┐
│ name : my-app │
│ manifest : /…/cpytoml │
│ .cpm dir : present │
└──────────────────────────────────────┘
✓ Toolchain looks good
CPM ships a pure-ANSI effect layer (cpyte_cpm.cli.style) with TTY detection
and NO_COLOR / FORCE_COLOR support:
- Gradient banner (
cpmwith no command) — ASCII-art logo in a blue→green gradient - Pipeline diagram —
Resolve ▸ Lower ▸ Optimize ▸ Execute - Animated spinner — threaded
◐ ◓ ◑ ◒animation for long operations - Inline progress bar —
████████░░░░░ 5/10 installing - Box panels — bordered diagnostic panels (
cpm doctor) - Gradient text, rainbow, pulse effects plus the full status glyph set (✓ ✗ ⚠ ▸ ●)
All effects disable automatically on non-TTY output, --quiet, or NO_COLOR.
~/.cpm/
├── cache/<name>/<version>/ # downloaded archives
└── modules/<name>/<version>/ # extracted packages
cpm info @std/json # Show package metadata and detailsDisplays:
- Package version and URL
- Platform claims (OS, architecture, features)
- Dependencies
- Installation status
cpm list # List all installed packages in current projectShows installed packages with versions from the lockfile, with status indicators.
cpm validate # Validate manifest and lockfileChecks:
- Manifest TOML syntax
- Required fields (name, version)
- Dependency declarations
- Lockfile presence and consistency
- Target platform configuration
cpm search json # Search for packages matching a querySearches both local installed packages and remote registry.
CPM supports extension packages that extend the Cpyte compiler with custom syntax, keywords, operators, and compiler hooks. Extension packages use a package.json manifest to declare their capabilities.
.cpm/modules/
├── package_name/ # unscoped packages
│ └── version/
│ ├── package.json # Extension manifest
│ ├── parser_hooks.py # Custom syntax parsing
│ ├── semantic_hooks.py # Type checking extensions
│ ├── codegen_hooks.py # LLVM IR generation
│ ├── runtime_hooks.py # Runtime code injection
│ ├── *.cpy # Main entry point (optional)
│ └── *.ll # Prebuilt LLVM IR (optional)
└── @scope/ # scoped packages (e.g. @std)
└── name/ # e.g. json
└── version/
└── package.json
{
"name": "package_name",
"version": "1.0.0",
"capabilities": {
"keywords": ["async", "await", "defer"],
"operators": ["~~"],
"tags": ["@async", "@callback"],
"macros": ["async_def"],
"custom_types": ["Promise", "Future"]
},
"extensions": {
"parser_hooks": ["parser_hooks.py"],
"semantic_hooks": ["semantic_hooks.py"],
"codegen_hooks": ["codegen_hooks.py"],
"runtime_hooks": ["runtime_hooks.py"]
},
"dependencies": [],
"metadata": {
"description": "Package description",
"author": "Author name",
"license": "MIT"
}
}- Keywords: Custom language keywords that extend the lexer
- Operators: Custom operators for expressions
- Tags: Custom tags for annotations and metadata
- Macros: Compile-time macro definitions
- Custom Types: New type definitions
- Parser Hooks: Extend the parser with custom syntax rules
- Semantic Hooks: Add custom type checking and analysis rules
- Codegen Hooks: Extend LLVM IR generation
- Runtime Hooks: Inject runtime code and libraries
Packages can provide only extensions without any .cpy or .ll files. These packages:
- Provide keywords, operators, and compiler hooks
- Can be imported successfully by the compiler
- Are useful for language feature extensions
cpm info package_name # Shows extension capabilities if availableThe cpm info command displays extension capabilities for installed packages:
Extension Capabilities:
Keywords: async, await, defer
Operators: ~~
Tags: @async, @callback
Custom Types: Promise, Future
Extension Hooks:
Parser: parser_hooks.py
Semantic: semantic_hooks.py
Codegen: codegen_hooks.py
Runtime: runtime_hooks.py
Extension packages are discovered automatically by the Cpyte compiler:
- Pre-loaded before compilation from
.cpm/modules/ - Keywords registered during lexing
- Hooks loaded during appropriate compilation phases
- No CPM configuration required
MIT