Skip to content

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.sh
38 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Usage, Billing settings and prepaid AI credit; fixes from the UX audit1/**
Memory is gone: people's own harnesses keep their own memory (CLAUDE.md, AGENTS.md, auto-memory), so g1t's project and workspace notes that agents recalled and remembered only duplicated them. The recall and remember operations, their /repos/{owner}/{name}/memory routes, the memory MCP tool and its lines in the MCP instructions, the Memory section of the API reference and OpenAPI document (and the CLI's table generated from it) are removed, as are the work service's memory methods, the Memory pages of a project and of a workspace with their sidebar links, Home's Decisions card (which read decisions out of workspace memory), the Memory guide (its address and the old agent-memory, agents-and-memory and context-hub ones now lead to Connect a coding agent) and every mention in the docs, README, llms.txt, the landing page, the privacy policy and the Ask bench. Decision records, g1t why and g1t work stay as they were. memory:read and memory:write are retired as agents:run and the models scopes were: tokens and OAuth grants that hold them still parse and keep working for their other scopes, but no preset (the Agent preset and the OAuth default included), token form, mobile sign-in or hosted session hands them out and nothing needs them; looking up a ticket (search ticket, get_context), which needed memory:read, needs issues:read. The memories table stays in work's D1 untouched and is no longer read or written, except that purging a repository or deleting a workspace still deletes its old rows. Checked: cargo test for g1t-contracts (308), g1t-api (201), g1t (102 and 41), g1t-work (103) and g1t-integrations (65), cargo check of the workspace, the OpenAPI document and ops table regenerated, every workspace's typecheck, the site's 901 tests and a production build, the contracts' 48 tests, the phone app's 11, the deploy tool's 92, and the docs' tests and build.2 * The few marks an agent's one-line summary carries, read so a row shows
3 * them as marks rather than as asterisks and backticks: **bold**, *italic*
4 * or _italic_, `code`, and [links](…) as their words. Nothing else; a row is one line, not a document.
Usage, Billing settings and prepaid AI credit; fixes from the UX audit5 */
6
7export type InlinePart = { kind: "text" | "strong" | "em" | "code"; text: string };
8
9const MARKS = /`([^`]+)`|\*\*([^*]+?)\*\*|__([^_]+?)__|\*([^*\s][^*]*?)\*|(?<![\w])_([^_\s][^_]*?)_(?![\w])|\[([^\]]+)\]\([^)\s]*\)/g;
10
11export function inlineParts(text: string): InlinePart[] {
12 const parts: InlinePart[] = [];
13 const push = (kind: InlinePart["kind"], value: string) => {
14 if (!value) return;
15 const last = parts.at(-1);
16 if (kind === "text" && last?.kind === "text") last.text += value;
17 else parts.push({ kind, text: value });
18 };
19 let at = 0;
20 for (const match of text.matchAll(MARKS)) {
21 push("text", text.slice(at, match.index));
22 const [, code, strong, strongU, em, emU, link] = match;
23 if (code != null) push("code", code);
24 else if (strong != null || strongU != null) push("strong", (strong ?? strongU)!);
25 else if (em != null || emU != null) push("em", (em ?? emU)!);
26 else push("text", link ?? "");
27 at = match.index + match[0].length;
28 }
29 push("text", text.slice(at));
30 return parts;
31}
32
33/** The words alone, for a tooltip or an attribute. */
34export function inlinePlain(text: string): string {
35 return inlineParts(text)
36 .map((part) => part.text)
37 .join("");
38}