Tools
| Tool | Command | Purpose | Documented version | Documentation |
|---|---|---|---|---|
| tisket | tisket |
Issue tracker | 0.2.5 | tisket |
| zettel | zettel |
Notes with provenance | 0.3.0 | zettel |
| diataxis | diataxis |
Typed documentation | 0.1.1 | diataxis |
| gaff | gaff |
Context re-injection for coding agents and git hook checks | 0.1.4 | gaff |
| almanac | almanac |
Agent skill libraries | 0.2.5 | almanac |
| missouri | missouri |
Filesystem-state tests for CLIs | 0.2.5 | missouri |
| tundish | tundish |
Local queues that deliver program output to agents | 0.1.2 | tundish |
| mdstore | No CLI; Rust import path mdstore |
Shared storage library under tisket, zettel, almanac, and diataxis | mdstore-core 0.5.0 | mdstore repository |
Packages and files
tisket
cargo install --locked tisket| Package manager | Package |
|---|---|
| Homebrew | cjohnhanson/tap/tisket |
| uv | tisket |
| npm | tisket |
| File or setting | Content |
|---|---|
tisket.yml at the repository root |
One key, tisket_dir, with default .tisket |
.tisket/<project>/ |
Issue files |
.tisket/<project>/.closed/ |
Closed issue files |
zettel
cargo install --locked zttl| Package manager | Package |
|---|---|
| Homebrew | cjohnhanson/tap/zettel |
| uv | zttl |
| npm | @cjohnhanson/zttl |
| File or directory | Content |
|---|---|
zettel.yml |
One key, zettel_dir, with default .zettel |
.zettel/ |
Notes in one flat directory |
diataxis
cargo install --locked diataxisDiataxis is available through crates.io only.
| File or setting | Content |
|---|---|
diataxis.yml |
docs_dir, with default docs, and an optional title |
docs/ |
Documentation pages |
gaff
cargo install --locked gaff| Package manager | Package |
|---|---|
| Homebrew | cjohnhanson/tap/gaff |
| uv | gaffr |
| npm | gaffr |
| File or location | Content |
|---|---|
.gaff/gaff.yml |
Repository configuration |
$HOME/.config/gaff/gaff.yml |
User configuration for every repository; the only location for guards |
$HOME/.config/gaff/handlers.yml |
The only location for handlers |
| Gaff’s state directory, outside the repository | Session counters |
A repository adds entries to the user configuration. It never overrides a user entry with the same name.
almanac
cargo install --locked lmnc| Package manager | Package |
|---|---|
| Homebrew | cjohnhanson/tap/almanac |
| uv | lmnc |
| npm | @cjohnhanson/lmnc |
| File or setting | Content |
|---|---|
almanac.yml |
Manifest with library, default skills, and pinned skills entries |
| Library directory | Skill files |
missouri
cargo install --locked missouri| Package manager | Package |
|---|---|
| Homebrew | cjohnhanson/tap/missouri |
| uv | msri |
| npm | @cjohnhanson/msri |
| File or setting | Content |
|---|---|
missouri.yml at the project root, or .missouri/missouri.yml |
Project configuration |
.missouri/missouri.yml within each state directory |
That state’s transitions |
| State directories | Filesystem states and expected results |
-d, --dir <DIR> |
Root directory containing states; default . |
mdstore
cargo add mdstore-core --rename mdstoreThe crate is mdstore-core. The Rust import path is mdstore.
stores.yml sits beside a tool’s marker file and declares other stores. Tisket, zettel, diataxis, and almanac read it.
| Field | Meaning |
|---|---|
format |
Format version, 2 |
shared |
Optional declaration that other users clone the store |
stores |
List of store declarations |
alias |
Local name for a declared store |
path |
Path source |
git |
HTTPS git source; optional rev |
blob |
HTTPS prefix with an index.txt |
Each store entry has an alias and exactly one source: path, git, or blob.
Shared commands
| Usage | Tools | Result |
|---|---|---|
<tool> docs [topic] |
All six CLIs | Bundled documentation |
<tool> docs --all |
All six CLIs | Every bundled page in one stream |
<tool> prime |
tisket, zettel, diataxis, gaff, almanac | Short tool description and usage for an agent’s context |
<tool> store list |
tisket, zettel, diataxis, almanac | Declared stores |
<tool> store sync |
tisket, zettel, diataxis, almanac | Remote stores fetched into a local cache |
<tool> store root <path> |
tisket, zettel, diataxis, almanac | Configured root store for that tool |
<tool> serve |
tisket, zettel, almanac | MCP server |
<tool> check |
tisket, zettel, diataxis, almanac, gaff | Reports broken references, links, and store problems; gaff validates .gaff/gaff.yml |
missouri validate |
missouri | Validates missouri.yml files without running tests |
Missouri has no prime command. MCP servers are read-only by default; almanac’s server is always read-only.
Root resolution
Tisket, zettel, almanac, and diataxis share the following rule.
| Invocation or condition | Resolution |
|---|---|
--root <dir> |
Names the directory literally. It must contain the tool’s marker file. No walk or fallback occurs. |
No --root |
The nearest marker file at or above the working directory wins. |
| No store found, read command | Falls back to the configured root store and reports the fallback on stderr. |
| No store found, write command | Fails and names --home; never falls back. |
--home |
Uses the configured root store wherever the command runs. |
The marker files are tisket.yml, zettel.yml, almanac.yml, and diataxis.yml, respectively.
The walk has two further constraints:
- A marker must be a regular file.
- The walk stops at the first directory the invoking user does not own. A marker in a shared ancestor captures nothing.
| Root setting | Behavior |
|---|---|
~/.config/<tool>/config.yml |
Fixed config path for that tool |
root_store |
Configured root store path |
<tool> store root <path> |
Sets the tool’s root; changing an existing setting requires --force |
| Home directory | Comes from the passwd database, not $HOME |
| Environment variables | Take no part in resolution |
| Write target on stderr | Printed unless the target is the working directory’s own store or --root names it |
Each tool reads its own configuration, so store root sets the root for that tool alone. One directory can be the root store for all four tools.
Gaff and missouri do not use this rule. Gaff reads the repository’s .gaff/gaff.yml plus the user configuration. Missouri reads the directory named by --dir.