Skip to main content

Amctl

CLI for Project Amrita — scaffold, manage, and maintain Python projects with the Amrita ecosystem.

Python License


Installation

# From PyPI
uv tool install amctl

# By uv
uv tool install amctl

# From GitHub
uv tool install git+https://github.com/AmritaBot/Amctl.git

Quick Start

# List available templates
amctl list

# Create a new project
amctl create -t amrita_core -n myapp
cd myapp
uv sync

Commands

amctl create

Scaffold a new project from a template.

amctl create -t amrita_core -n myapp
amctl create -t amrita_core -n myapp --description="My awesome project"
amctl create -t amrita_core -n myapp -V 0.8.0 -o /tmp

# Bypass Python version resolution
amctl create -t amrita_core -n myapp --frozen

# Force a specific version not in the known list
amctl create -t amrita_core -n myapp --force-version 3.0-beta
Option Description
-t, --type Template type (e.g. amrita_core)
-n, --name Project name
-V, --version Template version (default: latest)
-o, --output Output directory (default: .)
-f, --force Overwrite existing directory
--force-version Use any version string, bypassing validation
--frozen Skip Python version selection and .python-version

Template-specific fields (declared via __tmpl_fields__) are passed as dynamic CLI flags:

amctl create -t amrita_core -n myapp --description="Hello" --port=8080

After scaffolding, you are prompted to choose a license interactively:

[?] Choose a license for your project:
  [1] MIT
  [2] Apache-2.0
  [3] GPL-3.0
  [4] None (skip)
License [4]: _

A LICENSE file is written to the project root when a known license is selected.


amctl list

List all registered templates.

amctl list            # compact (first 5 versions shown)
amctl list -v         # verbose — full version lists

amctl info

Show detailed information about a template.

amctl info amrita_core

Output includes description, available versions (with source labels), declared fields (name/type/default/required/description), and the expected template file tree.


amctl fix

Check for missing template files and restore them.

amctl fix --check     # dry-run — report missing files only
amctl fix             # interactive [Y/N/M] confirmation
amctl fix --force     # restore all missing files without prompting
amctl fix --exclude '["README.md",".gitignore"]'   # skip specific files
Option Description
--check Dry-run — show what would be restored
--force, -f Skip confirmation, restore everything
--exclude JSON array or single path to exclude

amctl man

Run project scripts defined in pyproject.toml under [tool.amctl.scripts].

# pyproject.toml
[tool.amctl.scripts]
lint = "uv run ruff check ."
test = "uv run pytest -v"
start = "uv run uvicorn myapp.main:app --reload"
amctl man lint
amctl man test -- --cov
amctl man start

Extra arguments after -- are forwarded to the script.


amctl tmpl

Template-specific sub-commands. Each registered template is a sub-group.

amctl tmpl amrita_core     # show field summary (if no commands registered)

Templates can register custom commands via get_tmpl_commands().


amctl self

Manage amctl itself.

amctl self cache show       # display version cache contents
amctl self cache fresh      # refresh cache from PyPI
amctl self cache clean      # delete the cache file
amctl self tmpl-upd         # check for template package updates

Version Resolution

Amctl resolves available template versions through a cache-first fallback chain:

fresh cache (24h TTL) → PyPI → expired cache (warn) → hardcoded fallback

Cache location (in priority order):

  1. $AMCTL_TMPL_CACHEPATH — explicit path
  2. .venv/.amctl/versions_cache.json — inside a virtualenv project
  3. ~/.amctl/versions_cache.json — global

Environment variables:

Variable Description
AMCTL_TMPL_CACHEPATH Custom cache directory
AMCTL_TMPL_USECACHE=false Disable local cache (still uses PyPI)
AMCTL_TMPL_NOPYPI=true Block all PyPI requests (air-gapped)
AMCTL_LOG_LEVEL=debug Enable debug logging for network diagnostics
AMCTL_DEBUG=true Print each loaded template name at startup

Each version carries a requires_python constraint obtained from PyPI. Amctl attempts to resolve a compatible Python interpreter using uv python list and writes a .python-version file to the project root.


Creating a Template

Templates are auto-discovered from src/amctl/templ/<name>/. Define a class with the required dunder attributes:

from amctl.templating import BaseTemplate, field

class MyTemplate(BaseTemplate):
    __template_name__ = "my_template"
    __template_description__ = "A custom project template"
    __core_package__ = "my-core-lib"         # PyPI package for version discovery
    __python_requires__ = ">=3.11"           # Python version constraint
    __versions__ = ("1.0",)                  # hardcoded fallback
    __tmpl_fields__ = {
        "description": field(default="desc"),
        "port": field(default=8000, type=int, required=True),
    }

    def on_create(self, project_dir, name, version=None, **fields):
        super().on_create(project_dir, name, version=version, **fields)

__template_export__ = MyTemplate

Template files go in the same directory and use the .tmpl extension for Jinja2 rendering. Files ending with .pre (e.g. .gitignore.pre, .env.pre) are copied verbatim (no Jinja2 processing) with the .pre suffix stripped from the destination name. Directory names containing {{ }} markers are also rendered (e.g. src/{{ name }}/__init__.py.tmpl).


Development

uv sync
uv run ruff check src/     # lint
uv run pyright src/        # type-check
uv run amctl --help

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

amctl-0.1.4.tar.gz (72.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

amctl-0.1.4-py3-none-any.whl (78.4 kB view details)

Uploaded Python 3

File details

Details for the file amctl-0.1.4.tar.gz.

File metadata

  • Download URL: amctl-0.1.4.tar.gz
  • Upload date:
  • Size: 72.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for amctl-0.1.4.tar.gz
Algorithm Hash digest
SHA256 476c353da583a31b06f446112fcd529930080f30aeb6f415cd6e4eb63b3ae1d1
MD5 2392c5089f1f350f3a6033faa3858e0d
BLAKE2b-256 b28697f9dc0f7b773664fb209ad8c24b9cb8e5f0c86b83c6aad9ed1ead079d26

See more details on using hashes here.

File details

Details for the file amctl-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: amctl-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 78.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for amctl-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5009c68e76fe88578bdcdede9ff365f70b51fe1b06468cf6fc76941e1312e2db
MD5 5bcfcd7b812776919baf0a8f8742ae56
BLAKE2b-256 5582e1969887ca8a921e28e419e2f7a37ec0220c4edc276e045b301f8bec33e2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page