tilldev forge — the full command surface.
GATillForge lives inside the one tilldev CLI. Every group takes --json, token secrets are shown once and stored hash-only, and role governs what a command can do. The CLI talks to the dashboard API over HTTPS only.
Command groups
tilldev forge <group> <verb> [flags]
repos create / list / get / remove repositories
tokens tfp_ tokens — the git password + API credential
keys SSH public keys (scoped, expiring)
tree|blob|log|refs|blame browse code, history, and blame
policy branch protection rules
reflog|recover ref-change history + one-click restore
findings|allowlist secrets rejected at the push boundary
pr pull requests, reviews, and the merge gate
checks|check status checks (external CI gates merges)
correlation commit → release crash-free, suspect PRs
search literal, line-numbered search at a revision
release|asset tagged releases, generated changelog, builds
env|deploy environments + deployments (preview → prod)
coverage which checks cover each repository
webhook subscribe endpoints to repo events (signed)
egress AI egress policy + audit (default-deny)
mirror|mirrors pull / push mirror a repo, and how it syncs
mirror-hosts the only hosts mirrors may reach
codeowners the CODEOWNERS map for a repo
audit the append-only privileged-action trail
--json everywhere · login with 'tilldev login'Reads work for any org member; writes need developer or above; managing policy, tokens, keys, mirrors, and egress needs admin. Authenticate the CLI with a tfp_ token via tilldev login or the TILLDEV_TOKEN environment variable.
Repositories
tilldev forge repos ls
tilldev forge repos create --name <n> [--slug <s>] [--visibility private|internal|public]
tilldev forge repos get <slug>
tilldev forge repos update <slug> [--identity committer|author|off] # commit identity
tilldev forge repos update <slug> [--max-file-mb <n>|off] # file size limit (MiB; bigger files go to Git LFS)
tilldev forge repos rm <slug>
# Where repositories are stored; owners set where new ones go.
tilldev forge region
tilldev forge region set <region>
# Clone through the credential helper; the token never enters the URL.
tilldev forge setup-git # git authenticates every TillForge host, one per region
tilldev forge clone <org>/<repo> [dir] [--filter blob:none|blob:limit=<size>|tree:0] [--sparse]
tilldev forge clone <org>/<repo> --depth 1 --single-branch --branch main # CIA new repo is seeded with a protected default branch and secret scanning on. Push to it over HTTPS or SSH — see Repositories.
Tokens, SSH keys and commit emails
tilldev forge tokens ls
tilldev forge tokens create [--scope read|write|admin] [--repo <slug>] [--expires <days>] [--quiet]
tilldev forge tokens revoke <token-id>
tilldev forge keys-account ls
tilldev forge keys-account add --name <n> --key "<ssh pubkey>" [--scope read|write] [--expires <days>] [--machine]
tilldev forge keys-account rm <key-id>
tilldev forge keys ls <repo> # deploy keys for one repository
tilldev forge keys add <repo> --name <n> --key "<ssh pubkey>" [--scope read|write] [--expires <days>]
tilldev forge keys revoke <repo> <key-id>
tilldev forge commit-email ls # addresses that count as you
tilldev forge commit-email add <email> # emails a code to confirm it
tilldev forge commit-email verify <email|id> <code>
tilldev forge commit-email rm <email|id>| Flag | Meaning |
|---|---|
--scope | read < write < admin — never above the minter’s own role. |
--repo | Pin a token to a single repository (least authority). |
--expires | Token / key lifetime in days. Keys require an expiry. |
--key | An OpenSSH public key — validated and fingerprinted; refused if it is RSA under 2048 bits, already in the workspace, or its private half is known. |
--machine | keys-account add: a key that belongs to no person, for automation. Owners and admins only. |
--quiet | tokens create: print only the tfp_ token on stdout, for piping. |
forge tokens create prints the tfp_ secret one time and stores it hash-only. Minting can require MFA and is audited. To keep it off your machine entirely, mint it into TillSecrets with secrets gen --type forge-token.Browse code and history
tilldev forge tree <repo> [--rev <r>] [--path <p>]
tilldev forge blob <repo> --path <p> [--rev <r>]
tilldev forge log <repo> [--rev <r>] [--limit <n>]
tilldev forge refs <repo>
tilldev forge blame <repo> --path <p> [--rev <r>]Every --rev is resolved to a commit before anything runs — reads are argument-injection-safe by construction. These are the same reads the dashboard renders.
Protection, recovery, findings
tilldev forge policy ls <repo>
tilldev forge policy set <repo> --pattern <p> \
[--require-signed] [--require-linear] [--approvals <n>] [--checks a,b] \
[--require-mfa] [--allow-force] [--allow-delete]
tilldev forge reflog <repo> [--ref <branch>] # ref-change history
tilldev forge recover <repo> <reflog-id> # undo that change
tilldev forge findings <repo> # secrets rejected at push
tilldev forge allowlist <repo> <finding-id> --reason <r> # passes on the next push
tilldev forge allowlist <repo> <finding-id> --revoke # refused again
tilldev forge secrets <repo> [--commit <sha>|--ref <r>] [--wait] # secrets in every file at a commit
tilldev forge sast <repo> [--commit <sha>|--ref <r>] [--fail-at <s>] [--wait] # code scan
tilldev forge sast accept <repo> <scan-id> <finding-id> --reason <r>
tilldev forge sast findings | policy [--mode off|warn|block] [--block-at <s>] | rulespolicy set tunes branch protection; recover undoes one logged change, returning the ref to where it was, and is refused if the ref has moved since; allowlist clears a secret-scan false positive with a reason (audited), so the same content passes the next time it is pushed or committed, and --revoke withdraws that before it lands. sast runs a code scan of a commit and exits 1 when a finding blocks, so it can gate a pipeline.
Pull requests, checks, correlation
tilldev forge pr ls <repo> [--state open|merged|closed]
tilldev forge pr create <repo> --title <t> --source <ref> [--target <ref>] [--draft]
tilldev forge pr get <repo> <number>
tilldev forge pr review <repo> <number> --state approved|changes_requested|commented
tilldev forge pr merge <repo> <number> [--strategy merge|squash|rebase]
tilldev forge pr queue <repo> <number> [--strategy merge|squash|rebase]
tilldev forge pr dequeue <repo> <number>
tilldev forge queue <repo> # merge order, strategy, why an entry left
tilldev forge checks <repo> [--sha <s>]
tilldev forge check <repo> --sha <s> --context <c> --state <st> [--url <u>]
tilldev forge correlation <repo> [--rev <r>]
tilldev forge correlation <repo> --release <version> [--project <id>] [--env <e>]
tilldev forge codeowners <repo> [--rev <r>]pr merge enforces the target branch’s push rules, required approvals of the current head and required checks. On a branch with the merge queue, pr queue joins it instead; a branch that requires linear history takes squash when no strategy is given. forge queue shows the line; an entry marked testing is waiting on its required checks on the merge result. check is how external CI reports status; correlation --release ranks a release’s suspect changes. See Pull requests.
Search, ship, and fan out
# Search — literal, line-numbered, at any revision.
tilldev forge search <repo> <query> [--rev <r>]
# Releases + a build per platform (each with a published sha256).
tilldev forge release ls <repo> | get <repo> <tag> | rm <repo> <tag>
tilldev forge release create <repo> --tag <t> [--name <n>] [--target <ref>] \
[--generate | --notes <md>] [--prerelease] [--draft] # --generate = auto-changelog
tilldev forge asset add <repo> <tag> --name <n> \
--platform linux|darwin|windows|android|ios --url <u> [--arch <a>] [--sha256 <h>]
# Signed build provenance — check a file against it, offline with --keys.
tilldev forge provenance [pipelines]
tilldev forge provenance download <repo> <record> [--out <file>]
tilldev forge provenance verify <file> --bundle <b.intoto.jsonl> [--keys <keys.json>]
tilldev forge provenance keys [--out <file>] | keys rotate
tilldev forge provenance resign <repo> <record>
# Source track — each protected branch's SLSA Source level, and checking a commit against it.
tilldev forge source <repo> [--branch <b>] [--commit <sha>]
tilldev forge source show <repo> <record>
tilldev forge source download <repo> <record> [--out <file>]
tilldev forge source verify <repo> <commit> [--level <n>]
tilldev forge source verify --bundle <b.source.intoto.jsonl> --keys <keys.json> [--commit <sha>]
tilldev forge source resign <repo> <record>
# Deployments — preview freely, gate production with --approvals.
tilldev forge env ls <repo> | set <repo> --name <n> [--production] [--url <u>] [--approvals <n>]
tilldev forge deploy ls <repo> [--env <e>]
tilldev forge deploy create <repo> --env <e> --ref <r> [--url <u>]
tilldev forge deploy status <repo> <id> --state <s>
tilldev forge deploy approvals <repo> <id> | approve <repo> <id> | reject <repo> <id> [--comment <why>]
tilldev forge deploy policy [--scope production|all] [--rule supply-0002=block]
tilldev forge coverage [--gaps]
# Webhooks — subscribe endpoints to repo events (HMAC-signed).
tilldev forge webhook ls
tilldev forge webhook add --url <u> --events push,pull_request,release,deployment [--repo <slug>] [--secret <s>]
tilldev forge webhook secret <id> [--secret <s>]
tilldev forge webhook ping <id> | deliveries <id> | rm <id>search is literal — the query is matched as fixed text, never a pattern. release create --generate drafts the changelog from the commits since your last tag; asset add attaches a checksummed build per platform. provenance verify checks a file against the signed provenance of the build that made it and exits 1 when it doesn’t match. source verify checks a commit’s signed SLSA Source level and exits 1 when it fails or is below --level. deploy ships a commit to an environment — preview before production, held for approvals from someone else and for the deploy policy on environments TillForge ships to. coverage prints the supply chain map. webhook subscribes an endpoint to signed events and prints its signing secret once; webhook secret replaces it. Verify the timestamped X-TillForge-Webhook-Signature before you trust a delivery.
AI egress, mirroring, and audit
tilldev forge egress policy <repo>
tilldev forge egress set <repo> [--allow] [--sensitive] [--providers a,b] [--max-bytes <n>] [--no-redact]
tilldev forge egress audit
tilldev forge mirror <repo> --url <u> [--direction pull|push]
tilldev forge mirror <repo> # host, last sync, recent syncs
tilldev forge mirrors
tilldev forge mirror <repo> --remove
tilldev forge mirror-hosts [set '<host>,*.<domain>' | clear]
tilldev forge audit [--limit <n>]egress governs whether a repo’s code may leave to a model — default-deny, provider-allowlisted, size-capped, and secret-redacted, with every decision audited (Security). mirror pulls from or pushes to another host over https, reaching public addresses only and never following a redirect; the URL is stored encrypted. A pull is checked for malformed objects and scanned for secrets before its branches move; what it finds shows up in findings as mirrored. mirror <repo> on its own shows the host (never the URL), when it last synced, whether that worked and why not, and its recent syncs; mirrors lists every mirror in the workspace. The repository’s settings and the Egress page show the same. mirror-hosts names the only hosts mirrors may reach (*.example.com covers its subdomains); a mirror to any other host is refused when it’s set up and at every sync. With none set, any public host is allowed. audit reads the append-only privileged-action trail.
See the Quickstart for these commands in sequence, or the Security posture behind them. Back to the TillForge overview.