CODE AND TEAMS
Version control
Yeeted keeps every project's source as a git repository. Your agent can read, search, change and ship the code over MCP without a local copy, or clone and push it with plain git. History is never rewritten.
How your code is kept
Every deploy, edit, ship and push is a commit in the project's own repository on Yeeted. Nothing trims or rewrites that history. A project's stored source has a size limit set by your plan: over it, new writes are refused and nothing is deleted.
| Line | What it is | What moves it |
|---|---|---|
main | Mainline development: what a development deploy builds | Edits, merges from branches, pushes; never a forced update |
prod | Exactly the source production runs | Only a promotion to production, a hotfix shipped with ship(branch, to="production"), or a production rollback |
| Any other branch | A change in progress, under a name you choose | Its author's commits. Yeeted never deletes or expires a branch |
deployed/… tags | A permanent tag per deployed version, such as deployed/production/default/v12 | Written once when the version first runs; never moved |
Every read takes a ref: main (the default), prod, a branch name, a version
from versions_list such as v12, a deployed tag, a checkpoint name, or a commit hash (7 or more
characters). Every reply names the ref it used and the commit it resolved to, so follow-up reads and edits pin to
that commit.
Read and search over MCP
Tools shaped like the ones an agent already uses locally:
| Tool | Like | What it does |
|---|---|---|
source_overview | opening the repo | First call on unfamiliar code: top two directory levels, languages, the detected stack, a README excerpt, and how prod and main differ |
source_tree | ls, find | Paths under a directory or matching a glob, with type, size and blob hash |
source_read | cat -n | Up to 20 files or line ranges per call, with line numbers and each file's blob hash |
source_search | rg -n | Regex or literal search with context lines, file names only, or counts; paged and pinned to one commit |
source_log | git log | History, for a path, a person, an agent or a thread, or the commits that added or removed a string |
source_show, source_blame, source_diff | git show, blame, diff | One commit, who changed each line, or the difference between two refs (for example prod against main) |
source_status | git status | Where a branch stands against main, which files both changed, active claims and open tasks |
source_export | a tarball | A signed link, valid 10 minutes, to a .tar.gz of one revision, for an agent without git |
Edit, branch and ship
source_editsaves a batch of edits (replace text, create, delete, rename) as one commit, up to 50 edits. Each edit names the blob hash the file was read at; if the file changed since, nothing is written and the reply isstale_readwith the current content.- Without a branch the commit goes to
main, merged three-way with any newer commits, or refused asmerge_conflictwith the conflicting lines. With a branch the work stays offmainuntil you ship it. deploy(branch=...)runs a branch as its own development version with its own preview address, next to the project's.ship(branch)merges the branch intomainas a merge commit and deploys development. If both changed the same lines, nothing is merged and the branch stays intact: resolve withsource_edit(branch, merge_main=true), then ship again.revert(from, to)undoes the changes between two revisions onmainas one new commit. Nothing is deleted from history.- Whole-project uploads still work:
source_uploadtakes an archive, anddeploy(files, base, partial=true)sends only the files you changed on top ofbase.
The owner, admins and developers may change the code; a read_only member reads it. See Who can do what.
Several agents at once
- Claims.
source_claim(paths, note)tells other agents you are reworking some files, for examplesrc/auth/. A claim never blocks anyone: it shows up insource_status, insource_editreplies on those paths and in the change feed. It lasts 30 minutes by default (at most 4 hours), your commits on the same branch renew it, and it ends when that branch ships, when you callsource_release, or when it expires. The owner or an admin can clear someone else's claim. - The change feed.
source_eventslong-polls likebuild_logs: commits tomain, new branches, pushes, ships, merge conflicts, promotions, rollbacks and claims, oldest first. Start withafter=0for the last 30 days. - Tasks. A merge conflict nobody was there to resolve, such as a hotfix that could not merge into
main, becomes a task insource_status;source_task_donecloses it.
Attribution
Every commit Yeeted makes records who made it, in two kinds kept apart. The person and the credential are
verified by Yeeted from the connection. The agent, model and thread are what the agent reported about itself, through
the provider, model and thread fields of the write tools. They are written into
the commit and as git notes under refs/notes/yeeted-attribution. A pushed commit keeps its own hash, and the
pushing account and credential are added as a note. source_log, source_show and
source_blame show both kinds and mark the agent's as self-reported; source_log can filter by
person, agent or thread.
Production: hotfix and rollback
- Hotfix.
hotfix(branch)starts a branch fromprod, exactly what production runs, without whatmainhas gained since. Edit it, preview it withdeploy(branch=...), thenship(branch, to="production")ships the tested preview and Yeeted merges the fix intomain. If that merge conflicts,mainis left alone and a task opens; a promotion that would undo the hotfix is refused. A hotfix may not change the database schema (migrations, ORM model and schema files, any.sqlfile). Hotfixes are for the owner and admins. - Rollback.
rollback(to=v12, service_type="production")swaps the running production image and pointsprodat v12's commit; no commit is deleted. Withoutservice_typea rollback is for development and leavesprodalone.mainstill has the rolled-back changes: the reply offersrevertto undo them, and promotingmainbefore that warns.
Clone with git
Ask your agent for source_git_token(project_id). It mints a token valid for 1 hour, for that one
project, and returns the exact commands:
git -c http.extraHeader="Authorization: Bearer <token>" \ clone --branch main https://git.yeeted.ai/<project>.git
- The token goes in an
http.extraHeaderfor that one command. It is never in the URL or in.git/config, so mint a new one for the next fetch once it expires. - Treat it like a password: keep it out of files, commits and logs. It stops working when you lose access to the project.
- A clone has every branch and the deployed tags. To see who made each change, also fetch the notes:
git fetch origin refs/notes/yeeted-attribution:refs/notes/yeeted-attribution(with the same header). Git 2.26 or newer is needed.
Push with git
source_git_token(project_id, access="write") mints a token that can also push. The owner, an admin or a
developer of the project can get one, and revoke=true ends every write token you hold on the project.
git -c http.extraHeader="Authorization: Bearer <token>" push origin my-branch
- A version per push. With a token from a connection that holds the deploy permission, each pushed
branch registers a development version at the pushed commit, built on the first visit to its preview address (or
now, with
deploy(branch=...)), and a push tomainalso deploys development unlessyeeted.yamlsetsgit: { deploy_main_on_push: false }. Without the deploy permission a push only stores the code;deploy(branch=...)ordeploy(git_hash=...)deploys it. The push output (remote:lines) says what was registered or deployed. - No forced history. A forced (non-fast-forward) update of any branch or tag is refused;
main,prodand tags cannot be deleted; a tag never moves;prodis never pushed (it moves when a version is promoted); a deleted branch's commits are kept. A refused push changes nothing: fetch, merge, and push again. - Settings wait. A push never applies the project-wide settings in
yeeted.yaml(waf,depends_on,repo, domains). When a push tomaindeploys, its output lists the settings it held back; the owner or an admin applies them withdeploy(git_hash, apply_settings=true). - The rules of the MCP tools apply to a push too: a hotfix branch needs the owner or an admin and refuses schema changes, submodules are refused, and the plan's size limits apply.
Connected repositories
If your code lives in your own repository, connect it with project_repo, over https on github.com,
gitlab.com, bitbucket.org or codeberg.org; Yeeted checks that the address answers as a git repository before saving it.
Push-to-deploy gives you a webhook for your provider, so every push to the branch deploys, and an optional mirror
pushes every Yeeted deploy back to your repository. While a project is connected its code lives there:
source_edit, ship, hotfix and revert are refused, and so is a push to
git.yeeted.ai. Edit in your repository and push there. A push that rewrites your branch's history is not deployed until
you run project_repo again with accept_rewrite=true; see
Your code and data.