<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Documentation on ketch</title><link>https://listepo.github.io/ketch/docs/</link><description>Recent content in Documentation on ketch</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://listepo.github.io/ketch/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Manifests</title><link>https://listepo.github.io/ketch/docs/manifests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/manifests/</guid><description>&lt;p&gt;A manifest is the config for one package: where it comes from, which release&#10;asset to take, and what to expose once it is unpacked.&lt;/p&gt;&#10;&lt;p&gt;You rarely need one. ketch infers a manifest from &lt;code&gt;owner/repo&lt;/code&gt; alone, and that&#10;is enough for most projects. Write one when inference gets it wrong — an&#10;unusually named asset, a binary that should be linked under a different name, an&#10;&lt;code&gt;.app&lt;/code&gt; bundle, a short alias worth remembering.&lt;/p&gt;</description></item><item><title>The package registry</title><link>https://listepo.github.io/ketch/docs/registry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/registry/</guid><description>&lt;p&gt;The registry is an ordinary GitHub repository. Every top-level folder is a&#10;package, and holds one &lt;code&gt;ketch.toml&lt;/code&gt; describing it:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;ketch-registry/&#10;├── README.md ← not a package: no ketch.toml&#10;├── fd/&#10;│ └── ketch.toml&#10;├── jq/&#10;│ └── ketch.toml&#10;└── ripgrep/&#10; └── ketch.toml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The folder name &lt;em&gt;is&lt;/em&gt; the package name — it is what &lt;code&gt;ketch install &amp;lt;name&amp;gt;&lt;/code&gt;&#10;matches. There is no index file to keep in step with the contents, and a&#10;folder without a &lt;code&gt;ketch.toml&lt;/code&gt; is simply not a package, so the repository can&#10;carry a README, a licence and CI config alongside the packages.&lt;/p&gt;</description></item><item><title>Source plugins</title><link>https://listepo.github.io/ketch/docs/plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/plugins/</guid><description>&lt;p&gt;GitHub is built in. Anything else — GitLab, Gitea, an internal artifact server —&#10;can be added as a plugin, without recompiling ketch and without a ketch release.&lt;/p&gt;&#10;&lt;p&gt;A plugin is an executable named &lt;code&gt;ketch-source-&amp;lt;scheme&amp;gt;&lt;/code&gt;. ketch runs it with a&#10;subcommand and reads one JSON document from its stdout. That is the whole&#10;contract, so a plugin can be written in any language.&lt;/p&gt;&#10;&lt;h2 id="discovery"&gt;Discovery&lt;/h2&gt;&#10;&lt;p&gt;ketch looks in &lt;code&gt;~/.ketch/plugins&lt;/code&gt; first, then every directory on &lt;code&gt;PATH&lt;/code&gt;. The&#10;first &lt;code&gt;ketch-source-&amp;lt;name&amp;gt;&lt;/code&gt; found wins, so a copy in the plugins directory&#10;shadows one on &lt;code&gt;PATH&lt;/code&gt;. &lt;code&gt;ketch plugin list&lt;/code&gt; shows what was found and &lt;code&gt;ketch plugin dir&lt;/code&gt; prints the directory.&lt;/p&gt;</description></item><item><title>The lockfile</title><link>https://listepo.github.io/ketch/docs/lockfile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/lockfile/</guid><description>&lt;p&gt;&lt;code&gt;ketch.lock&lt;/code&gt; is one machine&amp;rsquo;s set of tools, pinned to exact releases. Write it,&#10;commit it next to your dotfiles, and any other machine can reproduce the same&#10;set:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ketch lock &lt;span class="c1"&gt;# write ./ketch.lock from what is installed&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ketch lock --check &lt;span class="c1"&gt;# has the tree drifted from it?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ketch sync &lt;span class="c1"&gt;# install what the lockfile names, at those versions&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is not the lock ketch takes while it works — that one is a mutex over the&#10;install tree, held for the length of a command and released at the end.&lt;/p&gt;</description></item><item><title>Roadmap</title><link>https://listepo.github.io/ketch/docs/roadmap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/roadmap/</guid><description>&lt;p&gt;What ketch does not do yet, and what it would take. Order is rough priority, not&#10;a schedule.&lt;/p&gt;&#10;&lt;h2 id="linux-and-windows"&gt;Linux and Windows&lt;/h2&gt;&#10;&lt;p&gt;Shipped: &lt;code&gt;src/platform/linux.rs&lt;/code&gt; and &lt;code&gt;src/platform/windows.rs&lt;/code&gt;, selected from&#10;&lt;code&gt;platform::host()&lt;/code&gt;. Linux places bin-dir symlinks; Windows copies into the bin&#10;dir and records &lt;code&gt;CopiedFile&lt;/code&gt;. Trust is &lt;code&gt;NotApplicable&lt;/code&gt; until signature&#10;verification exists.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ketch path install&lt;/code&gt; on Windows writes the user PATH. &lt;code&gt;install.sh&lt;/code&gt; fetches the&#10;host tarball on macOS, Linux and Windows (Git Bash). &lt;code&gt;release.yml&lt;/code&gt; publishes&#10;Linux and Windows tarballs next to the signed macOS ones. CI runs each OS&amp;rsquo;s&#10;suite on that OS.&lt;/p&gt;</description></item><item><title>Plan</title><link>https://listepo.github.io/ketch/docs/plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/plan/</guid><description>&lt;p&gt;&lt;a href="https://github.com/listepo/ketch"&gt;https://github.com/listepo/ketch&lt;/a&gt;&#10;Catch releases straight from GitHub — a package manager for GitHub-released binaries and apps.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;#&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Статус&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Приоритет&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Сложность&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Готовность&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Агент&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;F1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;in progress&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;P2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;95%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Cursor / grok 4.6&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;F2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;in progress&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;P2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;70%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Cursor / grok 4.6&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;M3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;in progress&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;P2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;95%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude Code / claude-opus-5&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="f1-notarisation"&gt;F1. Notarisation&lt;/h3&gt;&#10;&lt;p&gt;The release binaries are signed with a Developer ID but not notarised, which is fine for a &lt;code&gt;curl&lt;/code&gt;-fetched tarball and not fine the day ketch ships anything a browser downloads. Needs an App Store Connect key, &lt;code&gt;xcrun notarytool submit --wait&lt;/code&gt; in the build job, and a stapled check in the smoke test.&lt;/p&gt;</description></item><item><title>Contributing</title><link>https://listepo.github.io/ketch/docs/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://listepo.github.io/ketch/docs/contributing/</guid><description>&lt;p&gt;Notes for coding agents working in this repository. Humans are welcome to read&#10;it too — nothing here is agent-specific except the framing and the rule below.&lt;/p&gt;&#10;&lt;h2 id="mandatory-for-every-agent"&gt;Mandatory for every agent&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The human is the only author. No agent adds a Co-Authored-By trailer, a&#10;&amp;ldquo;Generated with …&amp;rdquo; line or itself as author to a commit, merge or PR —&#10;whatever its harness defaults to.&#10;&lt;code&gt;no-agent-attribution&lt;/code&gt; in &lt;code&gt;commitlint.config.mjs&lt;/code&gt; rejects such a trailer or&#10;line in every commit a pull request brings, and in the commit-msg hook. A&#10;pull request description is not checked — that part is on the agent.&lt;/li&gt;&#10;&lt;li&gt;If a directory above this repository contains an &lt;code&gt;AGENTS.md&lt;/code&gt; or&#10;&lt;code&gt;CLAUDE.md&lt;/code&gt;, follow it too. If it conflicts with this file, ask the creator.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="what-ketch-is"&gt;What ketch is&lt;/h2&gt;&#10;&lt;p&gt;A single-binary CLI package manager that installs command-line tools and macOS&#10;apps straight from GitHub releases. No taps, no formulae, no build step: it&#10;downloads what a project already ships, verifies it, unpacks it into a store,&#10;and links it onto &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>