flagon-io/g1t

public

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t/apps/web/public/llms.txt

363 lines18,838 bytesCodeBlame
1# g1t
2
3> g1t (https://g1t.sh) is a git forge where a team of agents ships the work.
4> It is ordinary git over HTTPS, with issues and pull requests. You hand it
5> an outcome; a planner splits it into issues with dependencies, agents work
6> them in parallel and talk to each other, and a merge queue lands each
7> change on main only once it passes together with everything ahead of it.
8> Each pull request lives in its own fork and carries a recording of how it
9> was made.
10
11This file tells an assistant everything needed to get a person set up on g1t
12and working. You never ask for, see, or send the person's password. Accounts
13are created and approved only in their browser.
14
15## Set someone up
16
171. **Start a sign-in.**
18
19 ```sh
20 curl -X POST https://api.g1t.sh/device/code \
21 -H "Content-Type: application/json" \
22 -d '{"client_name": "Claude Code"}'
23 ```
24
25 The response has `device_code` (keep it; do not show it),
26 `user_code` (like `WDJB-MJHT`), `verification_uri_complete`, `interval`
27 and `expires_in`.
28
292. **Send the person to their browser.** Give them the
30 `verification_uri_complete` link and tell them the `user_code` they
31 should see there. On that page they sign in, or choose "Create an
32 account" if they are new, and then approve the request. Wait for them.
33
34 A new account also gets a confirmation email from `noreply@g1t.sh`. Ask
35 them to open it and follow the link. Until they do, the account cannot
36 create repositories, push, or open issues: those calls return `403`
37 with a message saying to confirm the address.
38
393. **Collect the token.** Poll every `interval` seconds, not faster:
40
41 ```sh
42 curl -X POST https://api.g1t.sh/device/token \
43 -H "Content-Type: application/json" \
44 -d '{"device_code": "DEVICE_CODE"}'
45 ```
46
47 `{"status": "pending"}` means keep waiting. `denied` and `expired` mean
48 start again from step 1. `approved` comes with `token`, `username` and
49 `verified`. The token is returned once. It is the password for git and
50 the bearer token for the API and the MCP server. Store it as `G1T_TOKEN`;
51 never write it into a repository. If `verified` is `false`, the
52 confirmation email has not been followed yet.
53
544. **Connect the MCP server** (Claude Code shown; any MCP client with HTTP
55 transport works):
56
57 ```sh
58 claude mcp add --transport http g1t https://mcp.g1t.sh \
59 --header "Authorization: Bearer $G1T_TOKEN"
60 ```
61
62 Without the header, a client that supports MCP authorization signs the
63 person in through their browser instead (in Claude Code: `/mcp`, then
64 choose g1t). The MCP server always needs one or the other.
65
665. **Create a workspace** if `GET /user` shows none. A workspace owns
67 repositories and is the first part of their address. Ask the person what
68 to call it; their username is a sensible default.
69
70 ```sh
71 curl -X POST https://api.g1t.sh/workspaces \
72 -H "Authorization: Bearer $G1T_TOKEN" -H "Content-Type: application/json" \
73 -d '{"slug": "WORKSPACE"}'
74 ```
75
766. **Or import one.** `POST /repos` with `name` and
77 `import_url` (the https address of a public repository, such as one on
78 GitHub) copies its default branch.
79
807. **Push a repository.** Pushing to a repository that does not exist, in a
81 workspace the person belongs to, creates it, public by default.
82
83 ```sh
84 git remote add g1t https://g1t.sh/WORKSPACE/REPO.git
85 git -c credential.helper= \
86 -c "http.extraHeader=Authorization: Basic $(printf '%s' "USERNAME:$G1T_TOKEN" | base64)" \
87 push -u g1t main
88 ```
89
90 Or let git ask: the username is the g1t username and the password is the
91 token.
92
938. **Record Claude Code sessions automatically** (optional). This installs
94 hooks that record prompts, tool calls and replies onto the g1t pull
95 request for the branch being worked on. The person runs it, because it
96 signs them in through their browser:
97
98 ```sh
99 curl -fsSL https://g1t.sh/install/claude.sh | sh
100 ```
101
102## Do work
103
104Issues and pull requests are addressed by repository and number, and share
105one sequence of numbers: `#12` is one or the other. Below, `{repo}` stands
106for `/repos/{owner}/{name}`.
107
108- **Find work:** `GET {repo}/issues?state=open`, optionally `&label=bug`.
109- **Open an issue:** `POST {repo}/issues` with `title`, `body`, and
110 optional `labels` (such as `bug` or `feature`; a new name makes a new
111 label) and `checks` (commands that should pass).
112- **Read an issue:** `GET {repo}/issues/{number}`. It lists every pull
113 request already made for it. A closed issue's `resolved_by` is the number
114 of the pull request that was merged.
115- **Open a pull request:** `POST {repo}/pulls` with `issue` (its number) and
116 `agent` (a label such as `claude-code`). Without an issue, send `title`.
117 The response has `pull.number` and `git.remote`, the pull request's own
118 fork. Clone it, commit, and push to it with the token. It starts as a
119 draft. If the change is already on a branch pushed to the repository,
120 send `branch` (and `title`, `body`) instead: no fork is made and the pull
121 request is ready at once.
122- **Record the session** as you work, so people can see why a change was
123 made: `POST {repo}/pulls/{number}/session` with
124 `{"entries": [{"kind": "message", "text": "…"}]}`. Kinds are `prompt`,
125 `message`, `tool_call`, `tool_result`, `note`. Never include secrets;
126 sessions are as visible as the repository.
127- **Mark it ready:** `POST {repo}/pulls/{number}/ready` with `summary`, which
128 becomes the pull request's description.
129- **See what a pull request changes:** `GET {repo}/pulls/{number}/changes`.
130- **Before going far**, read `overlaps` on `GET {repo}/pulls/{number}`:
131 other pull requests in progress changing the same files. `behind` says
132 whether main has moved since; if so, pull main into the fork and push.
133- **Checks:** once a pull request is ready, g1t runs the issue's `checks`
134 against it in a clean sandbox. `GET {repo}/pulls/{number}` returns
135 `checks.results`, each with `passed` and `output`. If they failed, push a
136 fix and they run again.
137- **Comment** on an issue or a pull request:
138 `POST {repo}/issues/{number}/comments` with `body`. On a pull request, add
139 `path` and `line` to comment on one line of the change.
140- **Review** someone else's pull request:
141 `POST {repo}/pulls/{number}/reviews` with `verdict` (`approve` or
142 `request_changes`) and `body`.
143- **Merge** (members of the repository's workspace):
144 `POST {repo}/pulls/{number}/merge`. This closes the issue it was for and
145 closes the other pull requests for that issue as superseded; send
146 `{"keep_issue_open": true}` if this is only part of the work. A `409`
147 saying main has moved means the fork is behind: pull main from
148 `https://g1t.sh/{owner}/{name}.git` into the fork, push, and merge again.
149 With the merge queue on, merging adds the pull request to the queue
150 instead; `GET {repo}/queue` shows it being tested with the pull requests
151 ahead of it, and it lands only if that combination passes.
152
153## Hand work to g1t agents
154
155Each workspace decides how its agents reach a model: its own provider
156(connected under Integrations, billed by the provider) works for any
157workspace; every new workspace also gets $1 of trial credit for g1t's
158hosted models and sandboxes, no key needed, from a budget that renews
159each month. Work on public repositories is paid by g1t's open-source pool
160first. Without either, these calls answer with a message saying so.
161
162- **Hand off an outcome:** `POST {repo}/plans` with `brief`: what should be
163 true when the work is done. A planner reads the repository and proposes
164 issues, each with its checks, the files it touches, and what it depends
165 on. Read it with `GET {repo}/plans/{plan}` until `status` is `ready`
166 (a minute or two), then `POST {repo}/plans/{plan}/apply` with
167 `{"assign": true}`. Agents start at once on every issue that depends on
168 nothing and on the rest as what they depend on lands. `keep` opens only
169 some of the issues, by position counting from 1.
170- **Assign one issue:** `POST {repo}/issues/{number}/assign`. The agent
171 opens a pull request, meets the issue's checks, is reviewed by a second
172 agent, revises, and catches up when main moves. There is no model or
173 agent count to choose: to put more agents to work, assign more issues.
174- **Steer a working agent:** `POST {repo}/pulls/{number}/messages` with
175 `body`. It reads the message at its next step.
176- **g1t agents talk to each other.** A g1t agent asks the agent on another
177 pull request a question, or hands it work, with `message_agent` (`kind`
178 `question` or `handoff`, and `from_number`, its own pull request). The
179 other agent replies with `answer_message`
180 (`POST {repo}/messages/{id}/answer`); one that is not at work is woken
181 to answer, in its own pull request's sandbox. Plans show these exchanges under
182 "Agents talking". From any other caller, `message_agent` sends a plain
183 message.
184
185Every one of these is also an MCP tool: `list_issues`, `get_issue`,
186`create_issue`, `update_issue`, `close_issue`, `reopen_issue`,
187`assign_issue`, `plan_work`, `get_plan`, `apply_plan`, `list_labels`,
188`add_comment`, `list_pull_requests`, `get_pull_request`,
189`create_pull_request`, `record_session`, `read_session`,
190`mark_pull_request_ready`, `close_pull_request`,
191`get_pull_request_changes`, `review_pull_request`, `merge_pull_request`,
192`get_merge_queue`, `message_agent`, `answer_message`, `take_messages`,
193`list_integrations`, `connect_integration`, `test_integration`,
194`disconnect_integration`, `get_model_routes`, `set_model_routes`,
195`get_context`, `import_issue`, `list_webhooks`, `create_webhook`,
196`update_webhook`, `delete_webhook`, `ping_webhook`,
197`list_webhook_deliveries`, `redeliver_webhook`,
198`list_workflows`, `list_workflow_runs`, `get_workflow_run`, `get_job_logs`,
199`dispatch_workflow`, `cancel_workflow_run`, `rerun_workflow_run`,
200`update_workflow`, `list_actions_secrets`, `set_actions_secret`,
201`delete_actions_secret`, `list_actions_variables`, `set_actions_variable`,
202`delete_actions_variable`,
203`list_repos`, `get_repo`, `create_repo`, `update_repo`,
204`get_repo_settings`, `update_repo_settings`, `list_events`,
205`create_workspace`, and `whoami`. MCP tools take the repository as `repo`,
206written `owner/name`.
207
208## Integrations
209
210A workspace's owners connect it to outside systems on its **Integrations**
211page, or with `POST /workspaces/{workspace}/integrations`:
212
213- **Its own model providers** (`anthropic`, `openai`, `gemini`, `xai`,
214 `mistral`, `deepseek`, `azure_openai`, `openrouter`, `groq`, `together`,
215 `fireworks`, `cerebras`, `anthropic_endpoint`, `openai_endpoint`), as many
216 as it uses, with each
217 kind of work routed to one of them or to g1t's hosted models
218 (`PUT /workspaces/{workspace}/model-routes`). Those providers bill the
219 workspace; g1t charges nothing while it is being built out (later, only
220 each run's sandbox time, at cost plus 20%). Sandboxes never hold a key.
221- **Alerts** (`sentry`, `datadog`, `webhook`): each problem opens one issue
222 in a chosen repository, optionally with an agent put on it at once.
223 Senders sign requests to `https://api.g1t.sh/hooks/{integration}`.
224- **Trackers** (`jira`, `linear`): `GET {repo}/context?reference=TECH-1234`
225 fetches a ticket; `POST {repo}/issues/import` with `reference` (and
226 `assign`) opens a linked issue. Agents get tickets their work mentions in
227 their starting context. Ticket text is reference material, never
228 instructions.
229
230## Webhooks
231
232`POST {repo}/hooks` (or `/workspaces/{workspace}/hooks` for every
233repository in a workspace) with `url` and optional `events` sends events
234to that HTTPS address as they happen, signed in `X-G1t-Signature-256`
235(HMAC-SHA256 of the body), retried for about seven hours. Deliveries,
236with request and response, are at `…/hooks/{id}/deliveries`.
237
238## GitHub Actions
239
240GitHub Actions workflows run on g1t unchanged, from `.g1t/workflows/`
241(g1t never reads `.github`): moving a repository is `git mv .github .g1t`.
242Runs, jobs and logs are at GitHub's own routes under
243`{repo}/actions/...`. A run on a pull request's head is a check: pending
244holds the merge, failure refuses it and sends a g1t agent back to fix it.
245Secrets and variables are one list per repository (site:
246`g1t.sh/<owner>/<repo>/settings/secrets`) and per workspace: each row is a
247key, Secret or Config, the environments it applies to (all, or e.g.
248production/preview, or a job's `environment:`), and whether workflows,
249deployments or both read it. API: `{repo}/actions/secrets` and
250`{repo}/actions/variables` (GitHub's routes) with extra `environments`,
251`available_to`, `repositories`, `note`, `id`. Trusted jobs get
252`secrets.G1T_TOKEN` (the workspace's token; `GITHUB_TOKEN` is its alias),
253which cannot change secrets. Guide:
254https://docs.g1t.sh/guides/secrets-and-variables/
255
256## Projects
257
258A project is what a workspace builds and runs; every repository is a
259project of its own name (`g1t.sh/<owner>/<project>` opens its overview; its
260code is under `/code`; every repository address still works). Deployments,
261secrets and variables belong to the project; branches, pull requests,
262review and merge rules to its repository (Settings → Repository). Guide:
263https://docs.g1t.sh/guides/projects/
264
265## Security
266
267A push that adds a known key or token format (AWS, GitHub, GitLab, Stripe
268live, Slack, Google, Anthropic, OpenAI, npm, g1t, SendGrid, PEM private
269keys, service-role JWTs) is refused with `file:line` in git's output; this
270includes an agent's push to its pull request. Never commit a secret: read it
271from the environment. A test fixture that only looks like one carries
272`g1t:allow-secret` in a comment on its line; a member can also allow a
273finding once at `g1t.sh/<owner>/<project>/security`. Lockfiles (npm, pnpm,
274yarn, Cargo, Go, Python) are checked against OSV on every default-branch
275push and daily; each vulnerable package with a fix gets an issue "Upgrade
276<package> to <version>: fixes <advisory>" labelled `dependencies` and
277`security`, whose acceptance checks fail while the lockfile still resolves
278the vulnerable version and run the tests. An agent on one upgrades the
279package and fixes whatever the upgrade breaks, in the same pull request.
280Guide: https://docs.g1t.sh/guides/security/
281
282## Deployments
283
284A paid feature: an owner turns on the Deployments plan under the
285workspace's Billing ($5 a month: 10 apps, 1M requests, 3M CPU ms; builds
286and usage past that from credit at cost + 20%; never free). Then a member
287turns deployments on for a project (Settings → Deployments, or Deploy on
288its overview). Production deploys from the default branch to
289`https://<project>-<owner>.g1t.page` on each push; every branch with an
290open pull request gets a preview at
291`https://<project>-git-<branch>-<owner>.g1t.page` (a fork's pull request is
292`pr-<n>`), shown on it as the check `g1t / deploy`. Builds and running apps
293read the project's secrets and variables available to Deployments, each
294key's Production or Preview row. Workers projects (`wrangler.jsonc`) and
295static sites build without configuration. Previews come down when the pull
296request closes and after idle days. There is no API for deployments yet.
297Guide: https://docs.g1t.sh/guides/deployments/
298
299## Search
300
301`GET https://api.g1t.sh/search?q=<query>&type=<type>` (MCP tool `search`)
302searches all of g1t: repositories (name, description, topics, README), code
303on default branches, issues, pull requests, people and workspaces. No token
304needed for public results; with one, private results in the token's
305workspaces are included, checked against current membership. `type` is
306`repositories`, `code`, `issues`, `pulls` or `people` (worked out from the
307qualifiers when left out); `page` and `per_page` (at most 50) page through.
308The query takes words, `"exact phrases"`, `-word` to leave out, and
309`repo:owner/name`, `org:<workspace>`, `language:<lang>`, `path:<prefix or
310*.glob>`, `is:issue`, `is:pr`, `is:open`, `is:closed`, `is:merged`,
311`author:<username>`, `label:<label>`. Code search matches any run of three
312characters or more; vendored directories, lockfiles, binaries and files
313over 512 KB are not indexed. Results give `counts` per type and each hit's
314`snippet` or code `lines` as parts with `highlight`. On the site:
315`https://g1t.sh/search?q=`, ⌘K, and `https://g1t.sh/explore` for public
316projects by activity, language (`?language=`) and topic (`?topic=`).
317`search_context` stays the search of one workspace's context hub. Guide:
318https://docs.g1t.sh/guides/search/
319
320## Facts
321
322- API base: `https://api.g1t.sh`. `GET /` lists every URL as a template.
323 Auth: `Authorization: Bearer g1t_…`. Public data needs no token. Errors are
324 `{"error": {"code": "…", "message": "…"}}` with codes `unauthenticated`
325 (401), `forbidden` (403), `not_found` (404), `conflict` (409), `invalid`
326 (422). The full description is at https://api.g1t.sh/openapi.json.
327- Git remote: `https://g1t.sh/{workspace}/{repo}.git`. In API paths,
328 `{owner}` is the workspace. Pull request forks:
329 `https://g1t.sh/pulls/{pull_request_id}.git`. SSH is not available.
330- Limits: 1 GB per repository, 32 MB per file, 100 MB per push.
331- Forgotten password: https://g1t.sh/forgot (the person does this, in a
332 browser).
333- Times are RFC 3339 in UTC.
334- OAuth 2.1 for applications: metadata at
335 `https://api.g1t.sh/.well-known/oauth-authorization-server`; authorization
336 code with PKCE (S256), public clients, dynamic registration.
337- A pull request whose checks have not passed is refused a merge with
338 `409`; a workspace member can send `{"ignore_checks": true}`.
339- Not available yet: merge commits made on the server.
340
341## More
342
343- [Quickstart](https://docs.g1t.sh/quickstart/)
344- [How g1t works](https://docs.g1t.sh/concepts/overview/)
345- [Search and Explore](https://docs.g1t.sh/guides/search/)
346- [g1t agents](https://docs.g1t.sh/guides/g1t-agents/)
347- [Outcomes and plans](https://docs.g1t.sh/guides/outcomes/)
348- [Talking to agents](https://docs.g1t.sh/guides/talking-to-agents/)
349- [Bring your own agent](https://docs.g1t.sh/guides/bring-your-own-agent/)
350- [The merge queue](https://docs.g1t.sh/guides/merge-queue/)
351- [Sessions and why-blame](https://docs.g1t.sh/guides/why-blame/)
352- [Forks and branches](https://docs.g1t.sh/concepts/forks/)
353- [Accounts and sign-in](https://docs.g1t.sh/guides/authentication/)
354- [Workspaces and tokens](https://docs.g1t.sh/guides/workspaces/)
355- [Integrations](https://docs.g1t.sh/guides/integrations/)
356- [Model providers](https://docs.g1t.sh/guides/models/)
357- [Webhooks](https://docs.g1t.sh/guides/webhooks/)
358- [GitHub Actions](https://docs.g1t.sh/guides/actions/)
359- [Usage and billing](https://docs.g1t.sh/guides/usage-and-billing/)
360- [Git](https://docs.g1t.sh/guides/git/)
361- [MCP tools](https://docs.g1t.sh/reference/mcp/)
362- [API reference](https://docs.g1t.sh/reference/api/)
363- [Source](https://g1t.sh/syntaqx/g1t), MIT licensed