magus-spell
Build, publish, pull and list spells as OCI artifacts, and pin them in magus.lock
Synopsis
magus spell <build|push|pull|ls|lock> [args] [flags]
Description
A spell as an artifact: what one workspace publishes so another imports it by registry path, pinned by digest in magus.lock and versioned apart from the magus binary. Authoring a spell is magus init spell.
Subcommands (the first argument):
build Pack <dir> exactly as push would and print the manifest digest the push would produce, without touching the network. --out writes the layer tar too. push Pack <dir> as one uncompressed tar layer and push it to <ref>, a <registry>/<repository>:<tag>, then under each --tag with no second upload. Prints <registry>/<repository>@sha256:<digest>. pull Fetch <ref> by tag or digest, verify the manifest and layer digests, and print the pinned reference and the directory holding the files: [<dir>] when given, otherwise the user cache. A bare registry path, as a magusfile imports it, pulls the digest magus.lock pins. ls List <registry>/<repository>'s tags, following pagination. lock Check that magus.lock pins every remote spell magus.yaml declares, for its declared tag, and verify each pinned digest; no tag is resolved. --update resolves each tag and rewrites magus.lock, and is what the update charm on the lock-owning target runs. The workspace is not loaded, so credentials resolve through the environment.
Only files the VCS tracks are packed, each with a fixed mode, owner and time, and the manifest carries org.opencontainers.image.{title,source,revision,created}, created being the revision's commit time (SOURCE_DATE_EPOCH overrides), so one commit builds to one digest on every machine. <dir> must hold a tracked spell.buzz; a tracked symlink is refused.
Credentials: the spells.registries entry in magus.yaml for the reference's host names a username and a secret reference, resolved through the workspace's secret provider. --username overrides it and reads the password from stdin. With neither, requests are anonymous. A new GHCR package is private until someone makes it public.
spell build options
- --out string
- Also write the packed layer (an uncompressed tar) to this file
- --source string
- The org.opencontainers.image.source URL; default: the VCS remote as https
spell push options
- --source string
- The org.opencontainers.image.source URL; default: the VCS remote as https
- --tag string
- Another tag to write the same manifest under; repeatable
- --username string
- The registry username; the password is then read from stdin, overriding spells.registries
spell pull options
- --username string
- The registry username; the password is then read from stdin, overriding spells.registries
spell ls options
- --username string
- The registry username; the password is then read from stdin, overriding spells.registries
spell lock options
- --update
- Ask the registry what each declared tag names now, and rewrite magus.lock
Subcommands
- build
- Pack a spell directory and print the manifest digest a push would produce
- push
- Push a spell directory's tracked files as an OCI artifact and print its pinned reference
- pull
- Fetch and verify a published spell into the cache or a directory
- ls
- List a spell repository's tags
- lock
- Check magus.lock against magus.yaml, or rewrite it with --update
Examples
Print the digest a push of this commit would produce
magus spell build spells/harness/cursor
Publish under a version and a floating tag
magus spell push spells/harness/cursor ghcr.io/owner/repo/spells/cursor:v1.2.0 --tag latest
Pull a published spell into a directory
magus spell pull ghcr.io/owner/repo/spells/cursor:v1.2.0 ./vendor/cursor
List a spell repository's tags
magus spell ls ghcr.io/owner/repo/spells/cursor
Pin every declared remote spell's tag in magus.lock
magus spell lock --update
See Also
magus(1), magus-ls(1), magus-describe(1), magus-run(1), magus-x(1), magus-where(1), magus-affected(1), magus-graph(1), magus-query(1), magus-explain(1), magus-path(1), magus-refs(1), magus-watch(1), magus-events(1), magus-status(1), magus-clean(1), magus-shell(1), magus-vcs(1), magus-queue(1), magus-doctor(1), magus-config(1), magus-session(1), magus-memory(1), magus-job(1), magus-notes(1), magus-diff(1), magus-server(1), magus-broker(1), magus-mcp(1), magus-buzz(1), magus-completion(1), magus-man(1), magus-init(1), magus-agent(1), magus-self(1), magus-version(1)