Skip to main content

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 bare owner/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 --check skips 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

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)

Source distribution for lmnc 0.2.5
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)

Table of built distributions (wheels) for lmnc 0.2.5
File Actions
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page