Git-native fork overlay & guard tool
Project description
Forked
Forked keeps long-lived forks healthy. It lets you:
- Track upstream with a clean
trunk - Rebuild feature stacks as disposable overlays
- Capture guard reports and conflict bundles for automation
- Clean up worktrees, conflict artefacts, and stale overlays safely
This document focuses on getting you productive quickly with the published PyPI package.
Installation
pip install forked
# or, in an isolated environment
pipx install forked
Requirements:
- Git ≥ 2.31 (2.38 enables
zdiff3conflict style) - Python ≥ 3.10
You can still work on the CLI locally via:
python -m pip install -e .
First-Time Setup
-
Clone your fork and add the upstream remote.
-
Run
forked init:forked init --upstream-remote upstream --upstream-branch main
This creates
trunk, scaffoldsforked.yml, and sets up.forked/for logs, overlays, and guard artefacts. -
Describe your stack in
forked.yml:patches.orderlists the topic branches in the sequence you want them cherry-picked.featuresgroup related patches so you can turn whole slices on/off with a flag.overlaysmap a friendly name (e.g.,dev) to the feature set that should be built.
patches: order: - patch/payments/01 - patch/payments/02 features: payments: patches: - patch/payments/01 - patch/payments/02 overlays: dev: features: [payments]
With this config,
forked build --overlay devapplies the two payment patches, and you can layer in more feature blocks or custom overlays as your fork grows.
Core Workflow
| Step | Command | What it does |
|---|---|---|
| Build overlay | forked build --overlay dev |
Applies ordered patches on trunk, logs selections, optionally emits conflict bundles (--emit-conflicts-path). |
| Guard overlay | forked guard --overlay overlay/dev --mode block |
Runs sentinel checks, produces .forked/report.json, returns non-zero if policy fails. |
| Status summary | forked status --json --latest 5 |
Prints upstream/trunk SHAs, per-patch ahead/behind, overlay provenance (with fallback warnings). |
| Sync patches | forked sync --emit-conflicts-path .forked/conflicts/sync --on-conflict stop |
Rebases patch branches onto latest upstream, capturing conflicts with resume instructions. |
| Clean artefacts | forked clean --dry-run --overlays 'overlay/tmp-*' --worktrees --conflicts |
Plans or executes cleanup of old overlays/worktrees/conflict bundles. |
Additional helpers:
forked feature create checkout --slices 2– scaffold feature slicesforked feature status– show ahead/behind per feature sliceforked build --auto-continue --on-conflict bias– auto-resolve with path bias rules
Example Session
# 1. Initialise and configure
forked init
editor forked.yml # add patch order, features, sentinels
# 2. Build overlay with provenance logs
forked build --overlay dev --emit-conflicts-path .forked/conflicts/dev
# 3. Guard the overlay (fails if sentinels trigger)
forked guard --overlay overlay/dev --mode block
# 4. Resolve override requirements if needed
git -C .forked/worktrees/dev commit --allow-empty -m $'override\n\nForked-Override: sentinel'
forked guard --overlay overlay/dev --mode require-override
# 5. Inspect status JSON for dashboards
forked status --json --latest 3 | jq
# 6. Sync patch stack against upstream
forked sync --emit-conflicts-path .forked/conflicts/sync --on-conflict stop
# 7. Tidy stale overlays/worktrees
forked clean --no-dry-run --confirm --overlays 'overlay/tmp-*' --worktrees
All JSON logs live under .forked/logs/. Conflict bundles (schema v2) include wave numbering, blob references, and resume commands for automation.
Learning More
sanity_check.md– guided walkthrough covering all commandsdocs/– command reference and workflow guidestests/– Pytest scenarios demonstrating guard overrides, conflict bundles, status provenance, etc.
Need help? File an issue, browse the docs in docs/, or start with the demo script:
./scripts/setup-demo-repo.sh demo-forked
Repository Layout
.
├── src/ # CLI source modules (typer-based)
├── docs/ # command reference and workflow guides
├── pyproject.toml # packaging metadata for editable install
├── scripts/setup-demo-repo.sh # helper to create a sandbox repo with patch branches
└── README.md # this document
Run-time artifacts are intentionally kept out of Git:
.forked/ # logs, guard reports, and overlay worktrees
The directory is gitignored by default.
Installation
You can install the CLI in editable mode while iterating locally:
python -m pip install --upgrade pip
python -m pip install -e .
Once published, the recommended user path will be:
pipx install forked
The CLI requires:
- Git ≥ 2.31 (Git ≥ 2.38 unlocks the
zdiff3conflict style automatically) - Python ≥ 3.10
Quick Start
# optional: create a sandbox fork with patch branches
./scripts/setup-demo-repo.sh demo-forked
cd demo-forked
# 1. Initialize Forked CLI in the repo
forked init
# 2. Configure patch order and optional sentinels in forked.yml
sed -i 's/order: \[\]/order:\n - patch\/contract-update\n - patch\/service-logging/' forked.yml
# 3. Build an overlay (creates overlay/<id> + optional worktree)
forked build --id smoke --auto-continue
# 4. Guard the overlay (generates .forked/report.json)
forked guard --overlay overlay/smoke --mode block
# 5. Sync trunk & rebase patch branches against upstream
forked sync
Feature-Sliced Overlays
-
Define features and overlays in
forked.ymlusing the newfeaturesandoverlayssections. Each feature lists the patch branches (slices) that compose it, and overlays map profile names to feature sets. Example:features: payments_v2: patches: - patch/payments_v2/01-schema - patch/payments_v2/02-api overlays: dev: features: [payments_v2, branding]
-
Scaffold feature slices with the CLI:
forked feature create payments_v2 --slices 3 forked feature status # shows ahead/behind vs trunk
-
Build overlays by profile or feature lists:
# Profile-driven build (overlay/dev) forked build --overlay dev --skip-upstream-equivalents # Ad-hoc feature combination with include/exclude globs forked build --features payments_v2,branding \ --include patch/branding/experimental \ --exclude patch/branding/old
The resolver preserves global patch order, surfaces unmatched patterns, and logs provenance (features, patches, and filters) to
.forked/logs/forked-build.logand optional git notes on the overlay tip. -
Optimize repeat builds with
--skip-upstream-equivalents(filters commits that already exist on trunk viagit cherry). -
Automate overlays safely using the new selection metadata in git notes and build logs—these record the active feature set so guard/status tooling and downstream bots can reason about provenance.
The key artifacts after a build/guard cycle:
.forked/worktrees/<id>/– the reuseable overlay worktree..forked/logs/forked-build.log– append-only JSON telemetry describing each build..forked/report.json– deterministic guard report used by CI and local review.
Configuration (forked.yml)
forked.yml is committed to your repository and controls upstream, patch ordering, guards, and worktree behavior.
version: 1
upstream:
remote: upstream
branch: main
branches:
trunk: trunk
overlay_prefix: overlay/
patches:
order:
- patch/contract-update
- patch/service-logging
features:
contract_update:
patches:
- patch/contract-update
sentinels:
must_match_upstream:
- api/contracts/**
service_logging:
patches:
- patch/service-logging
overlays:
dev:
features: [contract_update, service_logging]
guards:
mode: warn # warn | block | require-override
both_touched: true
sentinels:
must_match_upstream:
- api/contracts/**
must_diverge_from_upstream:
- branding/**
size_caps:
max_loc: 0 # 0 disables the cap
max_files: 0
path_bias:
ours:
- config/forked/**
theirs:
- vendor/**
worktree:
enabled: true
root: ".forked/worktrees" # relative paths live under <repo>/.forked/worktrees/<id>
policy_overrides:
require_trailer: false
trailer_key: "Forked-Override"
Key behaviors:
- Relative
worktree.rootpaths are relocated outside the Git repo to avoid nested worktrees. - Setting
$FORKED_WORKTREES_DIRoverrides the root path. On POSIX platforms, the CLI rejects Windows-style roots (C:\…) to prevent confusion. - Sentinel sections determine whether specific paths must match or must diverge from upstream in the final overlay.
CLI Commands
| Command | Purpose |
|---|---|
forked init |
Verify upstream remote, fast-forward trunk, scaffold config. |
forked sync |
Fast-forward trunk to upstream and rebase every patch branch. |
forked build |
Rebuild an overlay branch (and optional worktree) from trunk + patches. |
forked guard |
Evaluate policies against an overlay and write a JSON report. |
forked status |
Show trunk, patches, and the most recent overlays. |
forked feature create |
Scaffold numbered patch slices for a feature. |
forked feature status |
Display ahead/behind state for feature slices. |
forked publish |
Tag and/or push an overlay branch. |
forked init
forked init [--upstream-remote REMOTE] [--upstream-branch BRANCH]
Performs safety checks (clean working tree, remote exists), fetches from upstream, creates/updates the trunk branch, enables helpful Git settings (rerere, conflict style), and writes forked.yml if missing. On Git < 2.38 the CLI automatically falls back to diff3 conflict style with a short notice.
forked sync
forked sync
Fetches upstream, resets trunk to upstream/<branch>, then iterates through each patch listed in forked.yml.patches.order and rebases it onto trunk. If a rebase stops on conflicts, the command exits with code 4 and prints the branch to fix.
forked build
forked build [--overlay PROFILE | --features NAME[,NAME...]] [--include PATTERN]...
[--exclude PATTERN]... [--id ID] [--skip-upstream-equivalents]
[--emit-conflicts] [--emit-conflicts-path PATH]
[--emit-conflict-blobs] [--conflict-blobs-dir DIR]
[--on-conflict MODE] [--on-conflict-exec COMMAND]
[--no-worktree] [--auto-continue] [--git-note/--no-git-note]
--overlay PROFILE– select features defined inforked.yml.overlays.<profile>.features. When omitted, all patches inpatches.orderare applied. If--idis not provided, the profile name becomes the overlay id.--features NAME[,NAME...]– comma-separated list of feature keys to include. Mutually exclusive with--overlay.--include/--exclude– add or remove patch branches via exact names or glob patterns (applied after feature/overlay resolution).--skip-upstream-equivalents– skip cherry-picking commits already present on trunk (based ongit cherry -v) and log the skipped counts per patch.--id– overlay identifier (default: overlay profile name or current dateYYYY-MM-DD).--no-worktree– build directly in the current working tree instead of creating/reusing a worktree.--emit-conflicts– write a conflict bundle (schema_version: 2) when a cherry-pick halts, storing it at the default path.forked/conflicts/<id>-<wave>.json.--emit-conflicts-path PATH– write the conflict bundle to a custom location instead of the default path.--emit-conflict-blobs– export base/ours/theirs blobs for each conflicted path alongside the bundle (binary/large files always trigger blob export).--conflict-blobs-dir DIR– store exported blobs under a custom directory when--emit-conflict-blobsis used.--on-conflict MODE– conflict policy:stop(default, exit code 10),bias(apply recommended ours/theirs resolutions and continue), orexec(run an external command).--on-conflict-exec COMMAND– shell command invoked when--on-conflict execis selected (use{json}as a placeholder for the bundle path).--auto-continue– legacy alias for--on-conflict bias.--git-note/--no-git-note– opt in/out of writing provenance notes torefs/notes/forked-meta.
Behavior highlights:
- Worktree directories are reused between builds. If a stale directory blocks reuse, the CLI suffixes the path (e.g.,
test-1) and prints a reminder to rungit worktree prune. - Build summaries now display applied versus skipped commits (
--skip-upstream-equivalents) and record the active feature set in.forked/logs/forked-build.logalongside resolver inputs. - Conflict bundles capture multi-wave context, recommended resolutions, and blob locations. They are logged to
.forked/logs/forked-build.logalongside exit metadata (statusconflictfor stop/exec,successwhen bias resolves conflicts). - Optional git notes capture the selected features/patches to make overlay provenance discoverable with
git notes show.
forked sync
forked sync [--emit-conflicts] [--emit-conflicts-path PATH]
[--emit-conflict-blobs] [--conflict-blobs-dir DIR]
[--on-conflict MODE] [--on-conflict-exec COMMAND]
[--auto-continue]
--emit-conflicts– emit a rebase conflict bundle when a patch fails to rebase, storing it at the default path.forked/conflicts/sync-<branch>-<wave>.json.--emit-conflicts-path PATH– place the sync conflict bundle at a custom location.--emit-conflict-blobs– export base/ours/theirs blobs for each conflicted file alongside the bundle.--conflict-blobs-dir DIR– store exported blobs under a custom directory when--emit-conflict-blobsis used.--on-conflict MODE–stop(default, exit code10),bias(apply recommended resolutions and continue the rebase), orexec(delegate to an external command).--on-conflict-exec COMMAND– command executed when--on-conflict execis selected;{json}is replaced with the bundle path.--auto-continue– alias for--on-conflict bias.
Successful syncs return to the previously checked-out ref and log the run to .forked/logs/forked-build.log (event: "forked.sync"). When conflicts remain unresolved, the command exits with code 10 (or the external command’s status for exec).
forked guard
forked guard --overlay OVERLAY [--output PATH] [--mode MODE] [--verbose]
--overlay(required) – overlay branch/ref to analyze (e.g.,overlay/test).--output– report destination (default.forked/report.json).--mode– overridesguards.mode(warn,block, orrequire-override).--verbose/-v– print sentinel matches and include extra debug data in the report/logs.
Policy overrides are configured in forked.yml:
policy_overrides:
require_trailer: true
trailer_key: "Forked-Override"
allowed_values: ["sentinel","size","both_touched","all"]
When guards.mode=require-override (or policy_overrides.require_trailer is set), guard looks
for override trailers in this order: overlay tip commit → annotated tag message → git note
(refs/notes/forked/override). The first match wins; values can be comma- or space-delimited and
are normalized to lowercase (sentinel, size, both_touched, or all). Overrides must cover
every violation scope (or specify all) and respect allowed_values.
The v2 report schema contains:
both_touched– files changed in both trunk and overlay since the merge base.sentinels.must_match_upstream/.must_diverge_from_upstream– validation results for sentinel globs.size_caps– diff size metrics viagit diff --numstat.violations– subset of the above that failed policy.override–{enabled, source, values, applied}describing the override that was honored (sourcecommit|tag|note|none).features– provenance-sourced feature list for the overlay (sourcereflects provenance log, git note, or resolver fallback).
Example extract:
{
"report_version": 2,
"violations": {"sentinels": {...}},
"override": {
"enabled": true,
"source": "commit",
"values": ["sentinel"],
"applied": true
},
"features": {
"source": "provenance-log",
"values": ["contract_update"],
"patches": ["patch/contract-update"]
}
}
Exit codes:
0– pass (or violations inwarnmode, orrequire-overridewhen a valid override is applied).2– policy violations inblock/require-overridemode without a valid override.3– configuration missing/invalid.4– Git failure (dirty tree, missing remote, etc.).
forked status
forked status [--latest N] [--json]
- Default output mirrors previous behavior: upstream/trunk SHAs, patch branches in configured order, and the newest overlays with their build timestamps and both-touched counts. The overlay window defaults to the latest 5 entries; adjust with
--latest N. --jsonemits a machine-readable payload (status_version: 1) suitable for dashboards or guard automation. Provenance is sourced from.forked/logs/forked-build.log/refs/notes/forked-meta, with automatic fallbacks when those entries are missing.
Example:
{
"status_version": 1,
"upstream": {"remote": "upstream", "branch": "main", "sha": "c0ffee..."},
"trunk": {"name": "trunk", "sha": "b4d00d..."},
"patches": [
{"name": "patch/payments/01", "sha": "1234abcd...", "ahead": 2, "behind": 0}
],
"overlays": [
{
"name": "overlay/dev",
"sha": "feedf00d...",
"built_at": "2025-10-20T18:45:02Z",
"selection": {
"source": "provenance-log",
"features": ["payments"],
"patches": ["patch/payments/01"]
},
"both_touched_count": 1
}
]
}
Common jq flows:
forked status --json | jq '.overlays[].selection.features'
forked status --json --latest 1 | jq '.patches[] | {name, ahead, behind}'
When no overlays exist, the command returns an empty array and prints an informational message; consumers should treat both_touched_count: null as “guard data not yet collected”.
forked clean
forked clean [--overlays FILTER] [--keep N] [--worktrees] [--conflicts]
[--conflicts-age DAYS] [--dry-run/--no-dry-run] [--confirm]
- Dry-run is the default: the command prints a grouped summary (overlays, worktrees, conflicts) with the exact Git/File operations that would occur. No changes are made until you pass both
--no-dry-runand--confirm. --overlays FILTER– target overlay branches by age (30d) or glob (overlay/tmp-*). Repeat the flag to combine filters. Use--keep Nto preserve the N newest overlays regardless of filters. Tagged overlays, active worktrees, and the current branch are always skipped.--worktrees– prune stale worktrees viagit worktree pruneand remove leftover directories under.forked/worktrees/*that no longer map to live overlays.--conflicts– delete conflict bundles under.forked/conflictsolder than the retention window (default 14 days). The newest bundle per overlay id is retained; override the threshold with--conflicts-age.- Every destructive run appends an entry to
.forked/logs/clean.logso operators have an audit trail.
Examples:
# Preview overlays older than 30 days, keeping the 2 most recent
forked clean --dry-run --overlays 30d --keep 2
# Remove temporary overlays once reviewed
forked clean --overlays 'overlay/tmp-*' --no-dry-run --confirm
# Clear stale worktrees and conflict bundles in a single sweep
forked clean --worktrees --conflicts --no-dry-run --confirm
forked feature create
forked feature create NAME [--slices N] [--slug TEXT]
NAME– feature identifier (kebab/snake case recommended).--slices– number of patch slices to create (default1).--slug– optional suffix for each slice (e.g.,--slug initialproducespatch/<name>/01-initial).
The command enforces a clean working tree, creates patch branches based on the current trunk tip, appends them to forked.yml.patches.order, and writes a new features.<name> entry. Branch creation fails fast if the feature already exists or if any target branch name is present.
forked feature status
forked feature status
Prints each feature from forked.yml.features with the SHA (first 12 characters) of every slice and its ahead/behind counts relative to trunk. Fully merged slices are marked accordingly, providing a quick glance at feature progress before building or publishing overlays.
forked publish
forked publish --overlay OVERLAY [--tag TAG] [--push] [--remote REMOTE]
Creates (or force-updates) a tag pointing at the overlay and optionally pushes the tag and overlay branch to a remote (default origin). Useful once a guarded overlay is ready to share.
Guard Reports
Default location: .forked/report.json
Example (trimmed):
{
"report_version": 2,
"overlay": "overlay/dev",
"trunk": "trunk",
"base": "6c535ebe766748006eea7f5fc21d0eaa2bcf01a2",
"violations": {
"sentinels": {
"must_match_upstream": ["api/contracts/v1.yaml"],
"must_diverge_from_upstream": []
}
},
"both_touched": ["src/service.py"],
"size_caps": {
"files_changed": 3,
"loc": 42,
"violations": true
},
"override": {
"enabled": true,
"source": "commit",
"values": ["sentinel"],
"applied": true,
"allowed_values": ["sentinel", "size", "both_touched", "all"]
},
"features": {
"source": "provenance-log",
"values": ["contract_update"],
"patches": ["patch/contract-update"]
}
}
Guard checks in mode=require-override look for the configured trailer key (default Forked-Override) on the overlay tip commit, then annotated tags, then refs/notes/forked/override. The override block records which source supplied the escalation marker and whether it satisfied the active violations (or the special value all). The features block carries the provenance list harvested from build logs/notes, so downstream tooling knows which slices were active.
Downstream tooling (CI, bots) can parse violations and override to fail builds or surface escalation guidance. The report_version field allows the format to evolve while preserving backward compatibility.
Conflict Bundles
When conflict bundling is enabled (--emit-conflicts or --emit-conflicts-path), forked build and forked sync record conflict bundles (schema_version: 2) under .forked/conflicts/<id>-<wave>.json:
{
"schema_version": 2,
"wave": 1,
"context": {
"mode": "build",
"overlay": "overlay/dev",
"patch_branch": "patch/conflict",
"patch_commit": "44b1b20...",
"merge_base": "6d913cc...",
"feature": "conflict_feature"
},
"files": [
{
"path": "app.py",
"binary": false,
"size_bytes": 29,
"precedence": {
"sentinel": "must_match_upstream",
"path_bias": "none",
"recommended": "ours",
"rationale": "matched sentinel must_match_upstream"
},
"commands": {
"accept_ours": "git checkout --ours -- 'app.py' && git add 'app.py'",
"accept_theirs": "git checkout --theirs -- 'app.py' && git add 'app.py'",
"open_mergetool": "git mergetool -- 'app.py'"
}
}
],
"resume": {
"continue": "git cherry-pick --continue",
"abort": "git cherry-pick --abort",
"rebuild": "forked build --id dev --on-conflict stop"
},
"note": "Commands assume a POSIX-compatible shell (e.g. bash, git bash, WSL)."
}
- Wave numbering – repeated conflicts in a single invocation append
-2.json,-3.json, etc., and every wave is logged to.forked/logs/forked-build.log(event: "forked.build"or"forked.sync"). - Binary & large files –
binary: trueentries omit diffs, recordsize_bytes, and always writebase.txt/ours.txt/theirs.txtinto the configured blob directory. - Automation hooks –
--on-conflict biasrecords auto-applied actions;--on-conflict execretains the conflicted worktree and exits with the delegated command’s status.
Exit codes: 10 for unresolved conflicts, external command status for exec mode, and raw Git exit codes for non-conflict failures.
Logs & Generated Artifacts
| Path | Purpose |
|---|---|
.forked/logs/forked-build.log |
Append-only JSON telemetry for each build (overlay id, resolver input/features, per-branch commit & skip summaries, reused path). |
.forked/logs/forked-guard.log |
Append-only JSON telemetry for guard runs (overlay, mode, violations, optional debug). |
.forked/report.json |
Latest guard report. |
.forked/worktrees/<overlay-id>/ |
Reused worktree for the overlay (removed by git worktree prune). |
All of these paths are ignored via .gitignore so your repo stays clean.
CI Example
Capture bundles in CI and highlight a deterministic failure when exit code 10 occurs:
- name: Build overlay with conflict bundle
run: |
set -e
forked build --overlay dev \
--emit-conflicts-path .forked/conflicts/ci \
--on-conflict stop || status=$?
if [ "${status:-0}" = "10" ]; then
bundle=$(ls .forked/conflicts/ci-*.json)
echo "::error::Conflict bundle generated at ${bundle}"
exit 1
fi
Upload .forked/conflicts/ as an artifact so reviewers (or downstream automation) can inspect the JSON and Blob exports when a rebase/build fails.
Demo Repository
Need a sandbox with realistic branches? Use the helper script:
./scripts/setup-demo-repo.sh demo-forked
cd demo-forked
forked init
# forked.yml now lists upstream, trunk, and patch branches created by the script
The script provisions:
patch/contract-updateandpatch/service-logging- sentinel-friendly directories (
config/forked/**,branding/**) - both upstream and origin bare remotes for push/pull simulation
Development Workflow
# install runtime + dev dependencies inside a Poetry virtualenv
poetry install --with dev
# runtime modules live directly under src/
# lint & format with Ruff
poetry run ruff check .
poetry run ruff format --check .
# apply formatting automatically when needed
poetry run ruff format .
# run mypy (configured via pyproject.toml)
poetry run mypy
# run project handbook automation (e.g., sprint dashboards)
poetry run make -C project-handbook help
Tip:
poetry shelldrops you into the virtualenv; otherwise prefix commands withpoetry run(for examplepoetry run forked status --json).
Publishing to PyPI
# 1. Update version in pyproject.toml (PEP 440 format)
# 2. Verify packaging artifacts locally
poetry build
# 3. Publish using an API token (set POETRY_PYPI_TOKEN_PYPI beforehand)
poetry publish --build
The build step produces dist/forked-<version>.whl and .tar.gz. Inspect the wheel (unzip -l dist/*.whl) if you need to confirm module contents before publishing.
GitHub Actions Release
- Push a tag matching
v*(e.g.,v0.2.0) to trigger.github/workflows/publish.yml. - Store your PyPI token as
PYPI_API_TOKENin the repository secrets. - The workflow runs Ruff, mypy, pytest, builds the artefacts via Poetry, and publishes with
pypa/gh-action-pypi-publish.
Key handbook commands:
make task-list– show current sprint tasks (project-handbook/Makefile).make sprint-status– current sprint health indicators.make release-status– release v1.0.0 progress overview.
When making CLI changes, regenerate the demo repo (script above), rerun forked build and forked guard, and inspect .forked/logs/forked-build.log to confirm logging.
Troubleshooting
| Symptom | Resolution |
|---|---|
forked init prints “Using diff3 merge conflict style…” |
You are running Git < 2.38; the CLI falls back to a supported conflict style automatically. Upgrade Git if you want zdiff3. |
| Build warns about suffixing worktree directories | Run git worktree prune to remove stale entries, or delete the directory manually. |
Guard exits with code 2 unexpectedly |
Inspect .forked/report.json – look under violations. Run in --mode warn to explore without failing. |
forked build applies no commits |
Ensure forked.yml.patches.order lists your patch branches and that they diverge from trunk. |
| Guard report missing sentinel hits | Confirm the globs in forked.yml.guards.sentinels match actual file paths. |
Forked is still evolving. If you have questions or ideas for the next iteration (better guard reporting, new commands, CI integrations), open an issue or capture it in the project handbook backlog. Happy overlaying! 🚀
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 forked-0.0.2.tar.gz.
File metadata
- Download URL: forked-0.0.2.tar.gz
- Upload date:
- Size: 48.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e60b2952c1033b7c4dc53e760cf682277a0acdf0cdd969d7f917df6bf2f4d0c
|
|
| MD5 |
cba9097399405de832ab5d285b28f2c5
|
|
| BLAKE2b-256 |
dff57222764d34e2e0a7787411698cd7c85b1bf572658c1a9209d7e29ac5bfb8
|
File details
Details for the file forked-0.0.2-py3-none-any.whl.
File metadata
- Download URL: forked-0.0.2-py3-none-any.whl
- Upload date:
- Size: 43.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc1dd6f11bd07d4669904ed5354c0dbd1d8e3aa147f653e888d51e6ffb19a320
|
|
| MD5 |
4fb58cd28b85a6c0038d4c70fcd5600d
|
|
| BLAKE2b-256 |
833a3fcb8e03d9416bd4d5d2fedf539ae1312d626ce8582cc8dcbdb38e3e9c12
|