almanac
almanac curates agent skills. A skill is a directory that contains a
SKILL.md file. The file holds YAML frontmatter with a name and a
one-line description, then a body of instructions. almanac list shows
the available skills. almanac show <name> prints the full content of
one skill. An agent sees what it can do without reading every SKILL.md
first.
Install
The package is lmnc, because almanac was taken on every registry. On
npm it is @cjohnhanson/lmnc, because the registry refuses lmnc as too
close to names it already holds. The command is almanac, and both
names install together.
cargo install --locked lmnc
brew install cjohnhanson/tap/almanac
uv tool install lmnc
npm install -g @cjohnhanson/lmnc
cargo install builds from source. It needs Rust 1.88 and a C
compiler. The other three carry a prebuilt binary for macOS and Linux,
x86-64 and arm64, published by a tagged release.
To build the unreleased main branch:
cargo install --locked --git https://github.com/cjohnhanson/almanac
Or run it without installing:
uvx lmnc list
npx @cjohnhanson/lmnc list
A release also carries prebuilt archives and a .deb, on the releases
page. Each archive
holds the binary and the man page. Install a .deb with dpkg -i: it
is a file, not a repository, so apt-get install does not reach it.
Check the install with almanac --version.
Usage
almanac list # every skill, with descriptions
almanac show <name> # the full SKILL.md content
almanac index # a JSON index for machines
almanac docs [topic] # the bundled documentation
How it works
almanac.yml governs one library directory. Almanac pins every entry
to a commit and a content hash, and stamps every vendored directory as
managed. add trusts a source on first use: it runs a mechanical
red-flag scan, and it needs an explicit --accept. update shows the
upstream diff and a fresh scan before it re-pins, and sync --check
fails when a pinned entry drifts.
library: skills
skills:
- name: gaff
source: github:cjohnhanson/gaff
path: skills/gaff
ref: main
rev: 849b76e2…full sha…
sha256: sha256-v1:…
The index is small enough to inject into agent context. list prints
one line per skill. show loads the instructions for one skill on
demand. index --md --max-bytes 4096 prints a markdown skills index
that fits a byte budget. prime prints what almanac is and how to
use it, for an agent's context; it depends only on the binary version.
Sources
github:owner/repo(or bareowner/repo): pinned by commit and hash.git:<url>: any git server over https, git://, or a local path. Almanac tries a sha fetch, then the recorded ref, then a full fetch, all in-process on gix. No git program runs. An ssh URL is refused, because gix would spawn ssh for it.dev:<path>: a local snapshot of a skill you develop alongside.sync --checkskips it and reports drift as information.
Composed libraries
A library can draw on other libraries. Declare them in stores.yml,
each under a local alias:
format: 2
stores:
- alias: shared
path: ../team-skills
- alias: upstream
git: https://example.com/org/skills
A skill name is the identity, and two libraries can hold the same name.
The nearer library wins: this library first, then each declared library
in declaration order. list, show, and index all give the winner,
so the list shows what an agent loads.
A skill that loses a name stays on disk. almanac check reports every
shadowed name and the library it came from.
A skill declares the skills it needs:
---
name: reviewing
description: My review process.
requires:
- shared:testing
- writing
---
An entry with no alias names a skill in the same library. almanac check reports an entry that names no skill, and an entry that uses an
alias the library does not declare.
almanac store list shows the libraries and their skill counts.
almanac store sync fetches the remote ones into a local cache. Four
commands reach the network: add, update, sync, and store sync.
Every other command reads what is already vendored or cached, so an
answer never changes because of a fetch nobody asked for.
Serving a library
almanac serve # stdin and stdout, for a child process
almanac serve --bind 127.0.0.1:8931 # for clients that connect
The server offers the skills extension, readable resources, and tools.
A client cannot be asked which it understands, so the surfaces are
configuration: --surfaces skills,resources,tools. The default is
skills,tools, because every client can call a tool. A served library
is read-only, and no flag changes that: curating a skill is a decision
a person makes at the command line. It also has no authentication, so
bind it to 127.0.0.1 or put an authenticating proxy in front.
Read almanac docs composition for the model.
Documentation
- What is Almanac?: skill format, sources, design
- Curation and pinning: the manifest workflow and the trust model
- CLI reference: every command and flag
Related
Tools that keep their data as plaintext in the repository, where an agent can read it:
- tisket: an issue tracker. Markdown issues with YAML frontmatter, in the repository
- zettel: zettelkasten notes for a repository
- gaff: a context-lifecycle handler for coding agents
- missouri: end-to-end tests as directed graphs of filesystem states
- mdstore: the frontmattered markdown library almanac indexes skills with
License
MIT.
Metadata
Release files for lmnc 0.2.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| lmnc-0.2.5.tar.gz | 96.2 kB | Without provenance | Details for lmnc-0.2.5.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| lmnc-0.2.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_1_x86_64.whl | Python 3 | none | Linux musl 1.1+ x86-64, Linux glibc 2.17+ x86-64 | Details for lmnc-0.2.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_1_x86_64.whl |
| lmnc-0.2.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64, Linux musl 1.1+ ARM64 | Details for lmnc-0.2.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl |
| lmnc-0.2.5-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details for lmnc-0.2.5-py3-none-macosx_11_0_arm64.whl |
| lmnc-0.2.5-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details for lmnc-0.2.5-py3-none-macosx_10_12_x86_64.whl |
Total release size: 30.7 MB
Release files / lmnc-0.2.5.tar.gz
| Download URL | lmnc-0.2.5.tar.gz |
|---|---|
| Size | 96.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e56dbb25387fe606a41aa535a111954d0b65e4299e53e7a59d2d401cb03c11df
|
|
BLAKE2b-256 checksum How to use checksums |
813a33a6d5ead8536f02edcf31d5899b36457739951e1d6c0cab999f54bb3aea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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}
|
Release files / lmnc-0.2.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_1_x86_64.whl
| Download URL | lmnc-0.2.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_1_x86_64.whl |
|---|---|
| Size | 8.1 MB |
| Tags | Linux glibc 2.17+ x86-64 Linux musl 1.1+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
35c24dd836fed70bc142f4d521c0d704408536c224797f4fd018a1215617a878
|
|
BLAKE2b-256 checksum How to use checksums |
2e0588b4aafe547e0e00baf41bc98816220134e47a23568be56398ae4156870c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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}
|
Release files / lmnc-0.2.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl
| Download URL | lmnc-0.2.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl |
|---|---|
| Size | 7.5 MB |
| Tags | Linux glibc 2.17+ ARM64 Linux musl 1.1+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
908a350658d3310f296f1d83680793ddda251959191c960e1605c8f7e50eea87
|
|
BLAKE2b-256 checksum How to use checksums |
12eb9136d210283cd9fee13085078f553008d205ec4f510efc4efbdb22b4e379
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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}
|
Release files / lmnc-0.2.5-py3-none-macosx_11_0_arm64.whl
| Download URL | lmnc-0.2.5-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 7.4 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0a8c8e67c371254bdc4908275d8c58bb0f822c58b59d2e69624880efededc06f
|
|
BLAKE2b-256 checksum How to use checksums |
8661cfe2f1cf10986bc3af8010d1b10c3e505d48e3c8bd83bce87e617a5cf2ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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}
|
Release files / lmnc-0.2.5-py3-none-macosx_10_12_x86_64.whl
| Download URL | lmnc-0.2.5-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 7.7 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
706dfa7483816f20548c430045be35ed0f66bef41d34257f0e2f045c0801e5d6
|
|
BLAKE2b-256 checksum How to use checksums |
b3e16fe9609bfdbcdeb2b9262209afaaac94bb402e19965cb96ecb58b010f0bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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}
|
Security for lmnc 0.2.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.