Project-neutral, multi-agent workflow core: a fixed backbone of steps that drives an issue from backlog to done, customised per project via config + add-only Lego extensions.
Project description
keel ⚓
Keel turns coding agents into work owners. It is a project-neutral, multi-agent workflow backbone that drives a unit of work — a GitHub issue — from intake to done: understand readiness, branch, implement, wait on CI, review, test, merge safely, close, and run capture hooks. Projects never fork the backbone: they set per-project values in
project.yamland snap their own Lego pieces into named extension slots.
The keel is a ship's backbone — the fixed spine every project builds on. The flagship
command is keel:ship; keel is where ships are built.
Keel is based on the work pattern of a strong teammate in a real engineering team:
take an issue from the queue, decide whether it is ready, own the implementation,
get it reviewed, keep the quality gates green, merge inside policy, and leave useful
memory behind for the next session. v1 focuses on one agent owning work end to end.
The long-term direction is autonomous software teams: multiple agents creating,
claiming, reviewing, handing off, and shipping work under a human lead who remains
the decision owner for product tradeoffs, credentials, approvals, and ambiguous scope.
See docs/keel/vision.md for the v1/v2 boundary.
Formerly
ai-infra(a one-way file-copy sync of "portable" commands). keel replaces that with a thin-consumer model: the core is installed + pinned, never copied, so the drift/overwrite class of bug is structurally gone. Background:docs/proposals/divergence-audit-2035.md,docs/proposals/keel-architecture.md.
Three layers
Layer 3 EXTENSIONS project-owned Lego pieces, ADD-ONLY into named slots
Layer 2 CONFIG project.yaml — per-project values (branch, build cmd, globs, agents…)
Layer 1 BACKBONE keel-core — fixed ordered step machine + invariants (this package)
Changing the backbone is a keel-core change. Projects only ever touch layers 2–3.
What you get
- One backbone, every agent — install once;
/keel:<command>runs as native Claude commands and as a single shared skill set every other agent (Codex, Antigravity, Gemini) reads. - Project Lego + policy packs — snap gates/steps into named hooks (
guard,tester,pre-merge, …) and keep labels, path policy, health sources, local commands, and workflow preferences inpolicy_packdata instead of packaged command prose. - Opt-in
jurygate — runs the ai-jury multi-agent reviewer on the diff when installed; a fail-soft no-op otherwise. - Safe merges by construction — timezone-aware night no-merge window,
mkdirmerge lock, risk-tier → reviewer count, hotfix bypass with an audit line, vendor+model attribution.
How Keel compares
Keel sits between three established tool categories:
| category | examples | where they usually stop | what Keel adds |
|---|---|---|---|
| Coding agents | OpenHands, SWE-agent, Copilot coding agent, Devin | create or update a PR | intake, review gates, merge policy, closeout, capture hooks |
| PR reviewers | CodeRabbit, Qodo / PR-Agent, Greptile, Cursor Bugbot | review an existing PR | implementation loop, tests, merge lock/window, planned learning capture |
| Merge queues | GitHub Merge Queue, Mergify, Graphite, Trunk | serialize tested PRs | issue ownership before the PR exists |
Keel is not trying to replace those tools. It is the work-ownership backbone that can use
coding agents, reviewers, gates, and merge policy in one lifecycle. See
docs/keel/comparison.md for the source-backed comparison and
the ideas Keel should borrow.
The backbone
| step | name | primary hooks | |
|---|---|---|---|
| s0 | config | after:config |
|
| s1 | select | before:select, select, after:select |
|
| s2 | branch | before:branch, after:branch |
|
| s3 | guard | guard |
|
| s4 | implement | before:implement, after-implement |
agent |
| s5 | classify | classify, after:classify |
agent |
| s6 | ci | before:ci, after:ci |
|
| s7 | review | reviewers, after:review |
agent |
| s8 | test | tester, test, after:test |
|
| s9 | fixloop | before:fixloop, fixloop, after:fixloop |
|
| s10 | merge | pre-merge, after:merge |
|
| s11 | capture | capture, post-merge |
|
| s12 | close | before:close, on-close, after:close |
Invariants the backbone always preserves: merge lock, night no-merge window, fail-soft, orchestrator-only-writes, vendor+model attribution.
The capture step has a core marker/verifier contract:
compound-learning: pr=<N> status=<applied|deferred|skipped:reason>. Projects provide
capture content and destinations through capture / post-merge extensions; keel owns the
marker, fail-soft semantics, redaction-before-durability, and offline capture-verify.
Install
keel is a Python (≥3.11) package with one runtime dependency (PyYAML):
pip install keel-workflow # from PyPI (provides the `keel` command)
pip install "git+https://github.com/berkayturanci/keel@v0.7.0" # or pin an existing git tag
In a cloud agent session, install it from a SessionStart hook (or add keel to the
session's repo scope) so the selected core ref is available before a run.
Release maintainers should follow docs/keel/release.md and run
python scripts/release_smoke.py before tagging or announcing a package.
Quickstart
keel setup --root . # add keel config + adapters to a project
keel validate projects/example-flutter.yaml # validate a config against the schema
keel plan projects/example-flutter.yaml # show the backbone plan for a project
keel version
keel setup wraps first-run onboarding (init + install-adapter + strict validate +
plan) for a consumer project. keel plan renders the fixed backbone with each project's
gates/extensions slotted in — exactly what a dry-run executes:
keel plan — example-flutter
base_branch: main core_version: ^0.7
backbone:
s4 implement [agent]
...
s8 test
- gate: build
- gate: lint
- gate: design-parity
s10 merge
- gate: design-parity-gate
Invocation (/keel:<command>)
The agentic workflows ship with the package as project-neutral adapters and install into
the two surfaces agents actually read — so the same /keel:<command> works in every
project; only that project's .keel/project.yaml + extensions change the behaviour:
keel install-adapter claude # native Claude commands → /keel:ship, /keel:regression, …
keel install-adapter skills # one shared keel-<cmd> skill set under .agents/skills/
# (read by every non-Claude agent: Codex, Antigravity, Gemini)
keel install-adapter all # both surfaces
Claude Code plugin
The same /keel:<command> flows are also packaged as a Claude Code plugin, so you can
add them to a session without pip install — straight from this repo's built-in marketplace:
/plugin marketplace add berkayturanci/keel # register the keel marketplace (this repo)
/plugin install keel # install the keel plugin → /keel:ship, /keel:regression, …
The plugin ships the same project-neutral command bodies as keel install-adapter; the two
flows are additive. The plugin's command files under commands/ are generated from
src/keel/adapters/commands/ (the single source of truth) by make plugin /
keel install-adapter plugin, and a test fails on any drift. The pip install keel-workflow
keel install-adapterpath is unchanged.
17 shipped commands — ship (flagship), ship-v2, implement, review-cycle,
review-all-day, pr-loop, regression, triage, morning, work-block,
overnight, wrap, ci-check, coverage, deps-audit, flake-audit, stale-prs.
Each is described in
docs/keel/commands.md. The keel CLI does the deterministic work;
the adapters are the agentic flows (per-round review, inline comments, delegation).
Dogfooding
keel drives itself from .keel/project.yaml using the latest ^0.7 core contract
(Python, make test + make lint gates), and CI runs keel on keel-core on every push.
projects/keel.yaml remains a seed copy and is tested to stay in sync with the dogfood
config.
keel plan .keel/project.yaml --root . # render keel's own backbone
keel run-gates .keel/project.yaml --root . # keel runs its own test + lint gates
keel ship .keel/project.yaml --root . # full dry assessment: tier, window, gates, decision
# risk tier : TIER-3 → 3 reviewer(s)
# decision : MERGE — clear to merge
If a step's gate fails, keel blocks its own merge — the same backbone every consumer gets.
Docs
- 🌐 Website + live coverage report —
make sitebuilds the coverage HTML intowebsite/coverage/and serves the site at http://localhost:8000. (Publishing to GitHub Pages is available via the manualpages.ymlworkflow once Pages is enabled.) docs/keel/configuration.md—project.yamlreferencedocs/keel/vision.md— agentic work ownership vision and v1/v2 boundarydocs/keel/onboarding.md— one-command consumer setup and follow-up checksdocs/keel/extensions.md— authoring Lego extensionsdocs/keel/consumer-neutrality.md— core vs project policy boundarydocs/keel/parity-matrix.md— legacy-to-keel command parity status and owning issuesdocs/keel/runtime-capabilities.md— runtime capability detection and requirement declarationsdocs/keel/github-transport.md— GitHub transport selection and normalized operation capabilitiesdocs/keel/command-contracts.md— structured JSON plan/result contracts for adaptersdocs/keel/operator-consent.md— live-run operator consent scopes and delegated-agent scope rulesdocs/keel/cli.md— CLI referencedocs/keel/commands.md— the 16/keel:<command>workflows, each with its descriptiondocs/keel/cutover.md— staged guide to retire a project's copied command bodies (install → verify → retire), losing nothingdocs/keel/comparison.md— competitive landscape (Mergify, GitHub merge queue, Qodo/PR-Agent, CodeRabbit, Sweep, OpenHands, Danger, …) + ranked borrow-ideasdocs/keel/github-actions.md— run keel live on GitHub's free runner (thekeel-shipworkflow)docs/keel/release.md— PyPI/TestPyPI release runbook and package smoke testdocs/proposals/keel-architecture.md— full design
Development
Stdlib-first, pure-core + thin-I/O, deterministic, fully covered (ai-jury ethos).
make test # offline unit suite (no network, no credentials)
make lint # ruff
make coverage # coverage gate (fail_under in pyproject)
make validate # validate projects/*.yaml and .keel/project.yaml
make site # build the coverage report + serve the website at localhost:8000
The pure core (config, model, extensions, findings, gates, orchestrator,
cli) is held at 100% line + branch coverage; the coverage gate (fail_under = 100)
runs in CI.
Repo layout
src/keel/ the core package (config, model, extensions, findings, gates, orchestrator, cli)
src/keel/schema/ project.schema.json (bundled)
.keel/project.yaml keel's own dogfood consumer config
projects/*.yaml example configs and the keel seed copy
src/keel/adapters/ the packaged /keel:<command> bodies (install-adapter: claude commands + shared skills)
adapters/ reference adapter (claude/keel-ship.md) + the adapter model (README)
website/ static site + coverage report (make site)
tests/ unit suite
docs/ docs + proposals
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file keel_workflow-0.9.0.tar.gz.
File metadata
- Download URL: keel_workflow-0.9.0.tar.gz
- Upload date:
- Size: 216.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88ed93eb7dd2da9fba3687450568675ce75ed424667c282a93563a8eb630f8e9
|
|
| MD5 |
1a94534dac4c19278786d641c78d43eb
|
|
| BLAKE2b-256 |
cefc07f43f2d4b876c353e11cd5a912507f163be12f8dc53030819a775092fd7
|
Provenance
The following attestation bundles were made for keel_workflow-0.9.0.tar.gz:
Publisher:
publish.yml on berkayturanci/keel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
keel_workflow-0.9.0.tar.gz -
Subject digest:
88ed93eb7dd2da9fba3687450568675ce75ed424667c282a93563a8eb630f8e9 - Sigstore transparency entry: 1765102272
- Sigstore integration time:
-
Permalink:
berkayturanci/keel@f049afed69686b1a8b18ceba0b3b8ae4d7f553c1 -
Branch / Tag:
refs/tags/v0.9.0 - Owner: https://github.com/berkayturanci
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f049afed69686b1a8b18ceba0b3b8ae4d7f553c1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file keel_workflow-0.9.0-py3-none-any.whl.
File metadata
- Download URL: keel_workflow-0.9.0-py3-none-any.whl
- Upload date:
- Size: 179.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4992c23ac4cd17c8e41f57a57f12cc531ffda33aa4600c8419bf3d48e344bcc5
|
|
| MD5 |
a445c1092d7991dc7ed90d14f5dbe91a
|
|
| BLAKE2b-256 |
3687f80764cb483e15e4c1937ee7d18046eb216648c3d7b8311e8464089dba05
|
Provenance
The following attestation bundles were made for keel_workflow-0.9.0-py3-none-any.whl:
Publisher:
publish.yml on berkayturanci/keel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
keel_workflow-0.9.0-py3-none-any.whl -
Subject digest:
4992c23ac4cd17c8e41f57a57f12cc531ffda33aa4600c8419bf3d48e344bcc5 - Sigstore transparency entry: 1765102922
- Sigstore integration time:
-
Permalink:
berkayturanci/keel@f049afed69686b1a8b18ceba0b3b8ae4d7f553c1 -
Branch / Tag:
refs/tags/v0.9.0 - Owner: https://github.com/berkayturanci
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f049afed69686b1a8b18ceba0b3b8ae4d7f553c1 -
Trigger Event:
push
-
Statement type: