ai-hats-wt
A hook-agnostic git-worktree engine: create, merge, and discard linked git
worktrees with a layered file-locking concurrency model — from a bare git
repository, with no configuration.
ai-hats-wt is the worktree core extracted from the
ai-hats framework. It has no dependency on
ai-hats: everything below runs against a plain git init with no ai-hats.yaml,
no composition, and no tracker. Its only runtime dependencies are
ai-hats-core (dependency-free
filesystem primitives) and filelock.
Install
pip install ai-hats-wt
Requires Python 3.13+.
Quickstart
Drive the full create → merge (or → discard) lifecycle on any git repo:
from pathlib import Path
from ai_hats_wt import WorktreeManager
project = Path("/path/to/a/git/repo")
# A manager for one linked worktree on its own branch.
mgr = WorktreeManager(project, branch_name="feature/x")
wt_path = mgr.create() # linked worktree checked out on feature/x
mgr.save_state() # persist state under <project>/.wt
# ... make commits inside wt_path ...
mgr.merge() # land the branch on the base, remove the worktree
# or:
# mgr.discard() # throw the worktree + branch away, land nothing
That is the entire happy path. WorktreeManager defaults to the no-op
lifecycle and a project-local state directory (<project>/.wt), so a bare
consumer needs nothing else. The same flow is exercised end-to-end by the
package's test_wt_standalone.py.
Public API
The supported surface is ai_hats_wt.__all__:
| Symbol | Purpose |
|---|---|
WorktreeManager |
Create / merge / discard a linked worktree; the git probes. |
IsolationMode |
Isolation / teardown mode (DISCARD, SQUASH, BRANCH, NONE). |
assert_head_is_canonical_base |
Guard: refuse to branch off a non-canonical HEAD. |
WorktreeLifecycle, LifecycleContext, NOOP_LIFECYCLE |
The lifecycle extension-point (see below). |
WorktreeDirtyError, WorktreeCreateError, WorktreeDriftError, … |
Typed exceptions — the clean failure seam. |
The full exception set (WorktreePartialCleanupError, WorktreeRemoveError,
OriginalBranchMissingError, WorktreeStateLostError,
WorktreeStateIncompleteError, WorktreeBaseBranchError,
WorktreeBaseBranchMismatchError, WorktreeMainRepoMidMergeError,
WorktreeTeardownAborted, WorktreeLockError) lets a host catch precise
failures instead of parsing git stderr. Per-method behaviour is documented on
the code — import a symbol and read its docstring; this README is the entry
point, not the reference.
Lifecycle hooks (extension-point)
WorktreeManager runs no hooks by default (NOOP_LIFECYCLE). A host can inject
behaviour at the create/merge/discard boundaries by passing its own
WorktreeLifecycle bundle:
from ai_hats_wt import WorktreeManager, WorktreeLifecycle, LifecycleContext
class MyLifecycle(WorktreeLifecycle):
def on_created(
self, ctx: LifecycleContext
) -> None: ... # e.g. seed files into ctx.worktree_path
def before_teardown(
self, event: str, ctx: LifecycleContext
) -> None: ... # event is "merge" / "discard" / "cleanup"
mgr = WorktreeManager(project, branch_name="feature/x", lifecycle=MyLifecycle())
This is the seam ai-hats uses to run its own carry/hook layer; a standalone consumer typically leaves the default no-op in place.
Concurrency
Worktree operations are serialized by a layered file-locking model (state locks,
git-index-lock retry, ref-lock waits) so that concurrent create / merge
calls on the same repo do not corrupt each other. It is on by default; there is
nothing to configure.
Dependencies
ai-hats-core— atomic filesystem I/O.filelock— the cross-process lock backend.
Everything else is the Python standard library.
Versioning
SemVer. The public API is ai_hats_wt.__all__; breaking
changes to it bump the major version. Submodule internals (anything not in
__all__) are not part of the contract.
License
MIT. See the ai-hats repository for the full license and contribution guide.
Release files for ai-hats-wt 0.6.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ai_hats_wt-0.6.3.tar.gz | 64.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ai_hats_wt-0.6.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 116.4 kB
Release files / ai_hats_wt-0.6.3.tar.gz
| Download URL | ai_hats_wt-0.6.3.tar.gz |
|---|---|
| Size | 64.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cf9fe2e90d4942d6c85efdf1aa8bee5907c2b83777bb2530f9aad868724f3bdb
|
|
BLAKE2b-256 checksum How to use checksums |
969db4b3e8220dbb4f6eff6e3954ec29ec8396658fed6e14e59bc5914e799db7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / ai_hats_wt-0.6.3-py3-none-any.whl
| Download URL | ai_hats_wt-0.6.3-py3-none-any.whl |
|---|---|
| Size | 52.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
50079eeb803b5f2b3f5386fefeb8af9c77547fcb3ff73d43a83f2a68d36c2fa8
|
|
BLAKE2b-256 checksum How to use checksums |
dadc7a236582fe738db02727c4a90434189318e4e109c9112dc089928d860f16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency log