Only projects have descriptions now; a repository no longer keeps one of its own (#45). Every repository already had a project of its own name, which showed the repository's description until it was given another, so the same line lived in two places with two settings pages. Now:
- Projects keep the only description. Migration 0014 copies each repository's description into its project where the project was following it, so nothing shown changes. The "Use the repository's description" setting is gone, and a fork's project starts with its source project's description. - Repos stops reading and writing it: it is gone from Repo, create, update and fork in both contracts, from the repository's Details settings, and from the API's repository responses. Its column, and projects' repo_description, stay until no running code reads them, and go in a later migration. - Making a repository with a description gives it to the project: the New repository form, create_repo in the API and `g1t repo create -d` call projects' new describe, and a GitHub import gives the project GitHub's description (integrations gets a PROJECTS binding). - Projects publishes project.updated when a project's name or description changes (projects gets an EVENTS binding), and search keeps a repository's description from its own project's, so search and Explore show the project's. A refresh of the repository no longer touches it. - The repository header, link previews and og cards, the workspace's Repositories list and its filter, a repository's forks, a person's stars, the CLI's repo view, list and forks, and the mobile app's Code show the project's description, read with projects' new descriptions (one call per page, or list_projects per workspace). - Actions payloads keep GitHub's repository.description field, always null. - The docs (managing repositories, projects, forking, search, webhooks, MCP), the CLI reference and the OpenAPI document say so.
- Checked:
- cargo test for g1t-contracts (312), g1t-repos (356), g1t-search (56), g1t-actions-service (115), g1t-integrations (75), g1t-work (195), g1t-api (207) and g1t (109 + 51); the site's type-check and its 950 tests; projects' and og's type-checks and tests (47, 28); the mobile app's type-check.
- G1t-Session:
- ses_01m4ybyg80e6qrrzww8qzs19yw
| 706 | 706 | ||
| 707 | 707 | fn repo(id: &str, name: &str) -> Repo { | |
| 708 | 708 | serde_json::from_value(json!({ | |
| 709 | − | "id": id, "namespace": "acme", "name": name, "description": null, "isPrivate": false, | |
| 709 | + | "id": id, "namespace": "acme", "name": name, "isPrivate": false, | |
| 710 | 710 | "ownerId": "wsp_1", "defaultBranch": "main", "forkOf": null, "createdAt": "2026-01-01T00:00:00Z", | |
| 711 | 711 | })) | |
| 712 | 712 | .unwrap() |
| 104 | 104 | ||
| 105 | 105 | fn link() -> ArchiveLink { | |
| 106 | 106 | let repo: g1t_contracts::repos::Repo = serde_json::from_value(json!({ | |
| 107 | − | "id": "repo_1", "namespace": "acme", "name": "web", "description": null, "isPrivate": true, | |
| 107 | + | "id": "repo_1", "namespace": "acme", "name": "web", "isPrivate": true, | |
| 108 | 108 | "ownerId": "ws_1", "defaultBranch": "main", "forkOf": null, "createdAt": "2026-10-01T00:00:00.000Z", | |
| 109 | 109 | })) | |
| 110 | 110 | .unwrap(); |
| 153 | 153 | ||
| 154 | 154 | fn repo() -> Repo { | |
| 155 | 155 | serde_json::from_value(json!({ | |
| 156 | − | "id": "rep_1", "namespace": "acme", "name": "web", "description": null, "isPrivate": false, | |
| 156 | + | "id": "rep_1", "namespace": "acme", "name": "web", "isPrivate": false, | |
| 157 | 157 | "ownerId": "wsp_1", "defaultBranch": "main", "forkOf": null, "createdAt": "2026-01-01T00:00:00Z", | |
| 158 | 158 | })) | |
| 159 | 159 | .unwrap() |
| 1533 | 1533 | Op::ListRepos => "Repositories you can see, optionally filtered by a search query.", | |
| 1534 | 1534 | Op::GetRepo => "One repository's details.", | |
| 1535 | 1535 | Op::UpdateRepo => { | |
| 1536 | − | "Change a repository's description, website, topics and default branch, whether its default branch is protected, whether it is private, whether a private repository may be forked, and the most branches and tags one push may change (max_ref_updates). Only the fields given are changed. Its description, website and topics need the Maintain role or higher; protecting its default branch, making it public or private, allowing forking, max_ref_updates and changing its default branch need the Admin role (and making it public or private, the workspace's member privileges to allow it, unless you are an owner), and a free workspace takes a private repository only while its private storage has room. A protected branch refuses pushes and changes only by merging a pull request. A new default branch must already exist; open pull requests then merge into it. A fork cannot be made public or private: it is as visible as its parent until it is detached (detach_fork)." | |
| 1536 | + | "Change a repository's website, topics and default branch, whether its default branch is protected, whether it is private, whether a private repository may be forked, and the most branches and tags one push may change (max_ref_updates). Only the fields given are changed. Its website and topics need the Maintain role or higher; protecting its default branch, making it public or private, allowing forking, max_ref_updates and changing its default branch need the Admin role (and making it public or private, the workspace's member privileges to allow it, unless you are an owner), and a free workspace takes a private repository only while its private storage has room. A protected branch refuses pushes and changes only by merging a pull request. A new default branch must already exist; open pull requests then merge into it. A fork cannot be made public or private: it is as visible as its parent until it is detached (detach_fork). A repository has no description: its project has, changed with update_project." | |
| 1537 | 1537 | } | |
| 1538 | 1538 | Op::RenameRepo => { | |
| 1539 | 1539 | "Give a repository a new name in its workspace. Needs the Admin role. Everything stays with it: git data, issues, pull requests, workflow runs, deployments, secrets and webhooks. Its old address keeps working: web pages, git remotes and API calls redirect to the new one until a repository is made at the old address. The new name must be free in the workspace, including names held by recently deleted repositories." | |
| ⋯ | |||
| 1572 | 1572 | "Move a repository to another workspace, keeping its name. You must own both workspaces, and the destination must not already have a repository of that name; a free destination takes a private repository only if its private storage has room. Everything moves with it: git data, issues, pull requests, comments, labels, workflow runs, deployments, its project, and its own secrets, variables and webhooks. Its old address keeps working: web pages, git remotes and API calls redirect to the new one until a repository is made at the old address. Usage from now on is charged to the new workspace." | |
| 1573 | 1573 | } | |
| 1574 | 1574 | Op::ForkRepo => { | |
| 1575 | − | "Fork a repository: copy it into a workspace you can create repositories in, as a new repository that remembers the one it came from (its parent). Anyone who can read a public repository may fork it; a private one only when its admins allow forking (allow_forking on update_repo). A fork is exactly as visible as its parent: a public repository's fork is public, a private one's private. Only its code and description come with it: the default branch, or every branch and tag with default_branch_only false. Its issues, pull requests, settings, rulesets, secrets, variables, webhooks, environments and deployments stay behind; issues are off in the fork, and Actions is off until an admin of the fork turns it on. Its full size counts toward the destination workspace's storage, and a free workspace takes a private fork only while its private storage has room. workspace is the destination's slug: your personal workspace when left out. name is the parent's when left out. Returns the fork, with parent naming the repository it came from." | |
| 1575 | + | "Fork a repository: copy it into a workspace you can create repositories in, as a new repository that remembers the one it came from (its parent). Anyone who can read a public repository may fork it; a private one only when its admins allow forking (allow_forking on update_repo). A fork is exactly as visible as its parent: a public repository's fork is public, a private one's private. Only its code comes with it: the default branch, or every branch and tag with default_branch_only false. Its project starts with the parent project's description. Its issues, pull requests, settings, rulesets, secrets, variables, webhooks, environments and deployments stay behind; issues are off in the fork, and Actions is off until an admin of the fork turns it on. Its full size counts toward the destination workspace's storage, and a free workspace takes a private fork only while its private storage has room. workspace is the destination's slug: your personal workspace when left out. name is the parent's when left out. Returns the fork, with parent naming the repository it came from." | |
| 1576 | 1576 | } | |
| 1577 | 1577 | Op::ListForks => { | |
| 1578 | 1578 | "A repository's forks that you can see, newest first, each with parent naming the repository. limit is at most 100, 30 when left out. Forks of its forks are listed on them." | |
| ⋯ | |||
| 1593 | 1593 | "The check names reported on a repository's commits in the last 30 days, most recent first, with the events each was reported for: the names update_repo_settings takes in required_checks. A workflow's runs report a check named after the workflow; a check required on the default branch must be reported on a pull request's head (pull_request events) and, with the merge queue on, on its queued state (merge_group events)." | |
| 1594 | 1594 | } | |
| 1595 | 1595 | Op::Search => { | |
| 1596 | − | "Search all of g1t: repositories (name, description, topics, README), code on default branches (file names and contents), issues, pull requests, people and workspaces. Covers everything public, and private content in workspaces you belong to; signed out, public only. Write words, \"exact phrases\", -words to leave out, and qualifiers: repo:owner/name, org:workspace, language:rust, path:src/ (a glob with *), is:issue, is:pr, is:open, is:closed, is:merged, author:username, label:bug. type picks the kind of results (repositories, code, issues, pulls or people); without it, the qualifiers decide. Returns one page of results with the matches highlighted, code with line numbers, and how many there are of each kind." | |
| 1596 | + | "Search all of g1t: repositories (name, their project's description, topics, README), code on default branches (file names and contents), issues, pull requests, people and workspaces. Covers everything public, and private content in workspaces you belong to; signed out, public only. Write words, \"exact phrases\", -words to leave out, and qualifiers: repo:owner/name, org:workspace, language:rust, path:src/ (a glob with *), is:issue, is:pr, is:open, is:closed, is:merged, author:username, label:bug. type picks the kind of results (repositories, code, issues, pulls or people); without it, the qualifiers decide. Returns one page of results with the matches highlighted, code with line numbers, and how many there are of each kind." | |
| 1597 | 1597 | } | |
| 1598 | 1598 | Op::GetMergeQueue => { | |
| 1599 | 1599 | "A repository's merge queue: the pull requests waiting to land, in order, each with the state it is being tested in (the default branch with the pull requests ahead of it landed in turn, each by its merge method) and how that went; then those that recently landed or left. With the queue on, merging a pull request adds it here." | |
| 1600 | 1600 | } | |
| 1601 | 1601 | Op::CreateRepo => { | |
| 1602 | − | "Create a repository in one of your workspaces, empty or as a copy of a public git repository elsewhere." | |
| 1602 | + | "Create a repository in one of your workspaces, empty or as a copy of a public git repository elsewhere. It gets a project of its own name; description is that project's." | |
| 1603 | 1603 | } | |
| 1604 | 1604 | Op::ListIssues => { | |
| 1605 | 1605 | "Issues on a repository, newest first. An issue is something that should change: a bug, a feature, a question. Pull requests are made against it. Filter by state, by a label's name, or by a milestone's number." | |
| ⋯ | |||
| 2281 | 2281 | "description": "The slug of the workspace to fork it into, e.g. \"flagon-io\". Your personal workspace when left out.", | |
| 2282 | 2282 | }, | |
| 2283 | 2283 | "name": { "type": "string", "description": "The fork's name; the repository's own when left out." }, | |
| 2284 | − | "description": { "type": "string", "description": "The fork's description; the repository's own when left out, none when empty." }, | |
| 2285 | 2284 | "default_branch_only": { | |
| 2286 | 2285 | "type": "boolean", | |
| 2287 | 2286 | "description": "Copy only the default branch (the default). false copies every branch and tag.", | |
| ⋯ | |||
| 2320 | 2319 | "label": label_schema(), | |
| 2321 | 2320 | "new_name": { "type": "string", "description": "Rename it, on everything that carries it." }, | |
| 2322 | 2321 | "color": { "type": "string", "description": "Six hex digits." }, | |
| 2323 | − | "description": { "type": "string", "description": "An empty string clears it." }, | |
| 2324 | 2322 | }), | |
| 2325 | 2323 | &["repo", "label"], | |
| 2326 | 2324 | ), | |
| ⋯ | |||
| 2385 | 2383 | }, | |
| 2386 | 2384 | "website": { | |
| 2387 | 2385 | "type": "string", | |
| 2388 | − | "description": "Its home page, an http or https address shown beside its description; https:// is added when no scheme is given. An empty string clears it.", | |
| 2386 | + | "description": "Its home page, an http or https address shown beside its project's description; https:// is added when no scheme is given. An empty string clears it.", | |
| 2389 | 2387 | }, | |
| 2390 | 2388 | "default_branch": { | |
| 2391 | 2389 | "type": "string", | |
| ⋯ | |||
| 2603 | 2601 | "description": "The workspace to create it in. May be left out if you belong to exactly one.", | |
| 2604 | 2602 | }, | |
| 2605 | 2603 | "name": { "type": "string" }, | |
| 2606 | − | "description": { "type": "string" }, | |
| 2604 | + | "description": { "type": "string", "description": "What it is, in a line: the description of its project. A repository has none of its own." }, | |
| 2607 | 2605 | "private": { "type": "boolean" }, | |
| 2608 | 2606 | "import_url": { | |
| 2609 | 2607 | "type": "string", | |
| ⋯ | |||
| 4511 | 4509 | path: repo, | |
| 4512 | 4510 | namespace, | |
| 4513 | 4511 | name: optional_text(input, "name"), | |
| 4514 | − | description: input["description"].as_str().map(str::to_owned), | |
| 4515 | 4512 | default_branch_only: input["default_branch_only"].as_bool() != Some(false), | |
| 4516 | 4513 | surface: Some(services.audit.surface), | |
| 4517 | 4514 | }, | |
| ⋯ | |||
| 4876 | 4873 | _ => String::new(), | |
| 4877 | 4874 | } | |
| 4878 | 4875 | }); | |
| 4879 | − | pass( | |
| 4876 | + | let created = pass( | |
| 4880 | 4877 | repos, | |
| 4881 | 4878 | "create", | |
| 4882 | 4879 | &CreateArgs { | |
| 4883 | − | owner, | |
| 4880 | + | owner: owner.clone(), | |
| 4884 | 4881 | namespace, | |
| 4885 | 4882 | name: text(input, "name"), | |
| 4886 | − | description: optional_text(input, "description"), | |
| 4887 | 4883 | is_private: input["private"].as_bool() == Some(true), | |
| 4888 | 4884 | import_url: optional_text(input, "import_url"), | |
| 4889 | 4885 | import_token: None, | |
| 4890 | 4886 | }, | |
| 4891 | 4887 | ) | |
| 4892 | − | .await | |
| 4888 | + | .await?; | |
| 4889 | + | // A repository has no description: the one given is its project's. | |
| 4890 | + | if let (Outcome::Ok(repo), Some(description)) = (&created, optional_text(input, "description")) { | |
| 4891 | + | let described: Result<Outcome<Value>> = call( | |
| 4892 | + | &services.projects, | |
| 4893 | + | "describe", | |
| 4894 | + | &json!({ "actor": owner, "repoId": repo["id"], "description": description }), | |
| 4895 | + | ) | |
| 4896 | + | .await; | |
| 4897 | + | match described { | |
| 4898 | + | Ok(Outcome::Ok(_)) => {} | |
| 4899 | + | Ok(Outcome::Fail(failure)) => { | |
| 4900 | + | worker::console_error!("created {} without its description: {}", repo["id"], failure.message); | |
| 4901 | + | } | |
| 4902 | + | Err(error) => worker::console_error!("created {} without its description: {error}", repo["id"]), | |
| 4903 | + | } | |
| 4904 | + | } | |
| 4905 | + | Ok(created) | |
| 4893 | 4906 | } | |
| 4894 | 4907 | Op::ListIssues => { | |
| 4895 | 4908 | pass( | |
| 135 | 135 | let project = json!({ | |
| 136 | 136 | "id": "prj_1", "workspace": "acme", "slug": "web", "name": "Web", "description": null, | |
| 137 | 137 | "private": true, "archived": false, "kind": "app", "pushedAt": "2026-10-07T10:00:00.000Z", | |
| 138 | − | "updatedAt": "2026-10-01T10:00:00.000Z", "descriptionInherited": false, | |
| 138 | + | "updatedAt": "2026-10-01T10:00:00.000Z", | |
| 139 | 139 | }); | |
| 140 | 140 | let pin = pin_json(&project, 2, "https://g1t.sh/"); | |
| 141 | 141 | assert_eq!(pin["position"], 2); | |
| 142 | 142 | assert_eq!(pin["url"], "https://g1t.sh/acme/web"); | |
| 143 | 143 | assert_eq!(pin["pushed_at"], "2026-10-07T10:00:00.000Z"); | |
| 144 | 144 | assert!(pin.get("pushedAt").is_none()); | |
| 145 | − | assert!(pin.get("descriptionInherited").is_none()); | |
| 146 | 145 | } | |
| 147 | 146 | ||
| 148 | 147 | #[test] |
| 41 | 41 | "slug": slug, | |
| 42 | 42 | "name": project["name"], | |
| 43 | 43 | "description": project["description"], | |
| 44 | − | "description_inherited": project["descriptionInherited"].as_bool().unwrap_or(false), | |
| 45 | 44 | "url": format!("{}/{workspace}/{slug}", site.trim_end_matches('/')), | |
| 46 | 45 | "repository": repository, | |
| 47 | 46 | "root_dir": source["rootDir"].as_str().unwrap_or_default(), | |
| ⋯ | |||
| 183 | 182 | fn project() -> Value { | |
| 184 | 183 | json!({ | |
| 185 | 184 | "id": "prj_1", "workspace": "flagon-io", "slug": "g1t", "name": "g1t", | |
| 186 | − | "description": "Git hosting for people and agents.", "descriptionInherited": true, | |
| 185 | + | "description": "Git hosting for people and agents.", | |
| 187 | 186 | "source": { | |
| 188 | 187 | "kind": "hosted", "repoId": "repo_1", "repo": { "namespace": "flagon-io", "name": "g1t" }, | |
| 189 | 188 | "rootDir": "", "defaultBranch": "main", | |
| ⋯ | |||
| 211 | 210 | assert_eq!(shown["repository"], "flagon-io/g1t"); | |
| 212 | 211 | assert_eq!(shown["root_dir"], ""); | |
| 213 | 212 | assert_eq!(shown["default_branch"], "main"); | |
| 214 | − | assert_eq!(shown["description_inherited"], true); | |
| 215 | 213 | assert_eq!(shown["kind_reason"]["by"], "set"); | |
| 216 | 214 | assert_eq!(shown["production_url"], "https://g1t.sh"); | |
| 217 | 215 | assert_eq!(shown["setting"]["runs"], "elsewhere"); | |
| 630 | 630 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 631 | 631 | "namespace": "flagon-io", | |
| 632 | 632 | "name": "hello", | |
| 633 | − | "description": "A tiny service that says hello.", | |
| 634 | 633 | "is_private": false, | |
| 635 | 634 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 636 | 635 | "default_branch": "main", | |
| ⋯ | |||
| 654 | 653 | "id": "rep_01m43tk1jhehztx23drs87f5fc", | |
| 655 | 654 | "namespace": "flagon-io", | |
| 656 | 655 | "name": "hello-cli", | |
| 657 | − | "description": "Command-line client for hello.", | |
| 658 | 656 | "is_private": false, | |
| 659 | 657 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 660 | 658 | "default_branch": "main", | |
| ⋯ | |||
| 671 | 669 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 672 | 670 | "namespace": "flagon-io", | |
| 673 | 671 | "name": "hello", | |
| 674 | − | "description": "A tiny service that says hello.", | |
| 675 | 672 | "is_private": false, | |
| 676 | 673 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 677 | 674 | "default_branch": "main", | |
| ⋯ | |||
| 684 | 681 | }, | |
| 685 | 682 | "update_repo": { | |
| 686 | 683 | "request": { | |
| 687 | − | "description": "Says hello, politely.", | |
| 688 | 684 | "website": "hello.g1t.page", | |
| 689 | 685 | "default_branch": "trunk", | |
| 690 | 686 | "protected": true | |
| ⋯ | |||
| 693 | 689 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 694 | 690 | "namespace": "flagon-io", | |
| 695 | 691 | "name": "hello", | |
| 696 | − | "description": "Says hello, politely.", | |
| 697 | 692 | "is_private": false, | |
| 698 | 693 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 699 | 694 | "default_branch": "trunk", | |
| ⋯ | |||
| 717 | 712 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 718 | 713 | "namespace": "flagon-io", | |
| 719 | 714 | "name": "hello", | |
| 720 | − | "description": "A tiny service that says hello.", | |
| 721 | 715 | "is_private": false, | |
| 722 | 716 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 723 | 717 | "default_branch": "main", | |
| ⋯ | |||
| 738 | 732 | "id": "rep_01m4b7k2v9c3tq8x5n6d0fr1hz", | |
| 739 | 733 | "namespace": "ada", | |
| 740 | 734 | "name": "hello", | |
| 741 | − | "description": "A tiny service that says hello.", | |
| 742 | 735 | "is_private": false, | |
| 743 | 736 | "owner_id": "usr_01kq3r8w2m6vd5e9t0hy7jx4cb", | |
| 744 | 737 | "default_branch": "main", | |
| ⋯ | |||
| 765 | 758 | "id": "rep_01m4b7k2v9c3tq8x5n6d0fr1hz", | |
| 766 | 759 | "namespace": "ada", | |
| 767 | 760 | "name": "hello", | |
| 768 | − | "description": "A tiny service that says hello.", | |
| 769 | 761 | "is_private": false, | |
| 770 | 762 | "owner_id": "usr_01kq3r8w2m6vd5e9t0hy7jx4cb", | |
| 771 | 763 | "default_branch": "main", | |
| ⋯ | |||
| 803 | 795 | "id": "rep_01m4b7k2v9c3tq8x5n6d0fr1hz", | |
| 804 | 796 | "namespace": "ada", | |
| 805 | 797 | "name": "hello", | |
| 806 | − | "description": "A tiny service that says hello.", | |
| 807 | 798 | "is_private": false, | |
| 808 | 799 | "owner_id": "usr_01kq3r8w2m6vd5e9t0hy7jx4cb", | |
| 809 | 800 | "default_branch": "main", | |
| ⋯ | |||
| 826 | 817 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 827 | 818 | "namespace": "flagon-io", | |
| 828 | 819 | "name": "greeter", | |
| 829 | − | "description": "A tiny service that says hello.", | |
| 830 | 820 | "is_private": false, | |
| 831 | 821 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 832 | 822 | "default_branch": "main", | |
| ⋯ | |||
| 855 | 845 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 856 | 846 | "namespace": "flagon-io", | |
| 857 | 847 | "name": "hello", | |
| 858 | − | "description": "A tiny service that says hello.", | |
| 859 | 848 | "is_private": false, | |
| 860 | 849 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 861 | 850 | "default_branch": "main", | |
| ⋯ | |||
| 903 | 892 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 904 | 893 | "namespace": "flagon-io", | |
| 905 | 894 | "name": "hello", | |
| 906 | − | "description": "A tiny service that says hello.", | |
| 907 | 895 | "is_private": true, | |
| 908 | 896 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 909 | 897 | "default_branch": "main", | |
| ⋯ | |||
| 924 | 912 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 925 | 913 | "namespace": "flagon-io", | |
| 926 | 914 | "name": "hello", | |
| 927 | − | "description": "A tiny service that says hello.", | |
| 928 | 915 | "is_private": false, | |
| 929 | 916 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 930 | 917 | "default_branch": "main", | |
| ⋯ | |||
| 945 | 932 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 946 | 933 | "namespace": "flagon-io", | |
| 947 | 934 | "name": "hello", | |
| 948 | − | "description": "A tiny service that says hello.", | |
| 949 | 935 | "is_private": false, | |
| 950 | 936 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 951 | 937 | "default_branch": "main", | |
| ⋯ | |||
| 969 | 955 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 970 | 956 | "namespace": "flagon-io", | |
| 971 | 957 | "name": "hello", | |
| 972 | − | "description": "A tiny service that says hello.", | |
| 973 | 958 | "is_private": false, | |
| 974 | 959 | "deleted_at": "2026-10-05T09:30:00.000Z", | |
| 975 | 960 | "deleted_by": "syntaqx", | |
| ⋯ | |||
| 986 | 971 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 987 | 972 | "namespace": "flagon-io", | |
| 988 | 973 | "name": "hello", | |
| 989 | − | "description": "A tiny service that says hello.", | |
| 990 | 974 | "is_private": false, | |
| 991 | 975 | "deleted_at": "2026-10-05T09:30:00.000Z", | |
| 992 | 976 | "deleted_by": "syntaqx", | |
| ⋯ | |||
| 1000 | 984 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 1001 | 985 | "namespace": "flagon-io", | |
| 1002 | 986 | "name": "hello", | |
| 1003 | − | "description": "A tiny service that says hello.", | |
| 1004 | 987 | "is_private": false, | |
| 1005 | 988 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 1006 | 989 | "default_branch": "main", | |
| ⋯ | |||
| 7884 | 7867 | "slug": "g1t", | |
| 7885 | 7868 | "name": "g1t", | |
| 7886 | 7869 | "description": "Git hosting where people and agents work together.", | |
| 7887 | − | "description_inherited": true, | |
| 7888 | 7870 | "url": "https://g1t.sh/flagon-io/g1t", | |
| 7889 | 7871 | "repository": "flagon-io/g1t", | |
| 7890 | 7872 | "root_dir": "", | |
| ⋯ | |||
| 7932 | 7914 | "slug": "hello", | |
| 7933 | 7915 | "name": "hello", | |
| 7934 | 7916 | "description": "Greets people from the command line.", | |
| 7935 | − | "description_inherited": false, | |
| 7936 | 7917 | "url": "https://g1t.sh/flagon-io/hello", | |
| 7937 | 7918 | "repository": "flagon-io/hello", | |
| 7938 | 7919 | "root_dir": "", | |
| ⋯ | |||
| 7983 | 7964 | "slug": "g1t", | |
| 7984 | 7965 | "name": "g1t", | |
| 7985 | 7966 | "description": "Git hosting where people and agents work together.", | |
| 7986 | − | "description_inherited": true, | |
| 7987 | 7967 | "url": "https://g1t.sh/flagon-io/g1t", | |
| 7988 | 7968 | "repository": "flagon-io/g1t", | |
| 7989 | 7969 | "root_dir": "", | |
| ⋯ | |||
| 8050 | 8030 | "slug": "g1t", | |
| 8051 | 8031 | "name": "g1t", | |
| 8052 | 8032 | "description": "Git hosting where people and agents work together.", | |
| 8053 | − | "description_inherited": true, | |
| 8054 | 8033 | "url": "https://g1t.sh/flagon-io/g1t", | |
| 8055 | 8034 | "repository": "flagon-io/g1t", | |
| 8056 | 8035 | "root_dir": "", | |
| ⋯ | |||
| 12457 | 12436 | "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr", | |
| 12458 | 12437 | "namespace": "flagon-io", | |
| 12459 | 12438 | "name": "hello", | |
| 12460 | − | "description": "A tiny service that says hello.", | |
| 12461 | 12439 | "is_private": false, | |
| 12462 | 12440 | "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p", | |
| 12463 | 12441 | "default_branch": "main", | |
| 86 | 86 | a("tarball", Op::Archives(ArchiveOp::DownloadTarball), "A 10-minute link to a branch, tag or commit as a .tar.gz"), | |
| 87 | 87 | a("zipball", Op::Archives(ArchiveOp::DownloadZipball), "A 10-minute link to a branch, tag or commit as a .zip"), | |
| 88 | 88 | a("create", Op::CreateRepo, "Create one, empty or copied from a public git URL"), | |
| 89 | − | a("update", Op::UpdateRepo, "Change description, website, topics, default branch, protection, forking"), | |
| 89 | + | a("update", Op::UpdateRepo, "Change website, topics, default branch, protection, forking"), | |
| 90 | 90 | a("get_settings", Op::GetRepoSettings, "How pull requests merge, and the default branch's protection as its rules stack"), | |
| 91 | 91 | a("update_settings", Op::UpdateRepoSettings, "Change how pull requests merge and the default branch protection ruleset"), | |
| 92 | 92 | a("check_names", Op::ListCheckNames, "Check names reported lately, to require in a ruleset"), |
| 27 | 27 | ### What a fork starts with | |
| 28 | 28 | ||
| 29 | 29 | Forking copies the parent's **code** (its default branch, or every branch | |
| 30 | − | and tag) and its **description**. Nothing else comes with it: no issues or | |
| 30 | + | and tag), and the fork's project starts with the **description** of the | |
| 31 | + | parent's project. Nothing else comes with it: no issues or | |
| 31 | 32 | pull requests, settings, rulesets, secrets, variables, webhooks, | |
| 32 | 33 | environments, deployments or releases. The fork starts with its own | |
| 33 | 34 | defaults, and with two things off: |
| 33 | 33 | 1. Open the repository and choose **Fork** in its header. | |
| 34 | 34 | 2. Pick the **workspace** to fork it into. Only workspaces where you can | |
| 35 | 35 | create a repository of its kind are listed. | |
| 36 | − | 3. Keep its **name**, or give the fork another, and change its | |
| 37 | − | **description** if you like. | |
| 36 | + | 3. Keep its **name**, or give the fork another. Its project starts with | |
| 37 | + | the parent project's **description**; change it later on the fork's | |
| 38 | + | **Settings → General**. | |
| 38 | 39 | 4. Leave **Copy the `<default>` branch only** on to copy just the default | |
| 39 | 40 | branch, or turn it off to copy every branch and tag. | |
| 40 | 41 | 5. Choose **Create fork**. | |
| ⋯ | |||
| 60 | 61 | -d '{"workspace": "ada-labs", "default_branch_only": true}' | |
| 61 | 62 | ``` | |
| 62 | 63 | ||
| 63 | − | `workspace`, `name`, `description` and `default_branch_only` may each be | |
| 64 | − | left out: your personal workspace, the parent's name and description, and | |
| 65 | − | the default branch only. Over MCP, it is the `repository` tool's `fork` | |
| 64 | + | `workspace`, `name` and `default_branch_only` may each be left out: your | |
| 65 | + | personal workspace, the parent's name, and the default branch only. Over MCP, it is the `repository` tool's `fork` | |
| 66 | 66 | action. | |
| 67 | 67 | ||
| 68 | 68 | ### What the fork gets | |
| ⋯ | |||
| 70 | 70 | | Copied | Not copied | | |
| 71 | 71 | | --- | --- | | |
| 72 | 72 | | The default branch, or every branch and tag | Issues, pull requests, comments and labels | | |
| 73 | − | | The description | Settings, rulesets and branch protection | | |
| 73 | + | | Its project's description, to the fork's project | Settings, rulesets and branch protection | | |
| 74 | 74 | | | Secrets, variables and webhooks | | |
| 75 | 75 | | | Environments, projects, deployments and custom domains | | |
| 76 | 76 | | | Releases, packages and stars | | |
| 12 | 12 | ## What it is, and the facts beside the files | |
| 13 | 13 | ||
| 14 | 14 | The header at the top of every page of a repository (Code, Issues, Pull | |
| 15 | − | requests, Actions, Settings and the rest) shows its description, website | |
| 16 | − | and topics, as you set them under [Edit the details](#edit-the-details). | |
| 17 | − | The website is the project's homepage when it has one. | |
| 15 | + | requests, Actions, Settings and the rest) shows its project's description, | |
| 16 | + | and its website and topics as you set them under | |
| 17 | + | [Edit the details](#edit-the-details). The website is the project's | |
| 18 | + | homepage when it has one. | |
| 19 | + | ||
| 20 | + | A repository has no description of its own: its | |
| 21 | + | [project](/guides/projects/) has, and search, link previews and lists of | |
| 22 | + | repositories show that one. Change it in the project's **Settings → | |
| 23 | + | General**, or with | |
| 24 | + | [`update_project`](/reference/api/projects/update-project/). | |
| 18 | 25 | ||
| 19 | 26 | The **Code** page shows its files with its facts beside them. On a phone | |
| 20 | 27 | they come after the files. | |
| ⋯ | |||
| 104 | 111 | | Section | What it holds | | |
| 105 | 112 | | --- | --- | | |
| 106 | 113 | | **Name** | The repository's name, the second part of its address. | | |
| 107 | − | | **Details** | Its description, website and topics, shown on its page, in [search and Explore](/guides/search/). | | |
| 114 | + | | **Details** | Its website and topics, shown on its page, in [search and Explore](/guides/search/). Its description is its project's, on **General**. | | |
| 108 | 115 | | **Branches** | The default branch, renaming a branch, and a link to **Branches and merging**: [branch protection](/guides/git/#protected-branches), [required status checks](/guides/pull-requests/#required-status-checks), required approvals, and the [merge queue](/guides/merge-queue/). What a sandbox may reach is under **Guardrails**; see [guardrails](/guides/guardrails/). | | |
| 109 | 116 | | **Artifacts** | How many days the files workflow runs upload are kept, 1 to 90 (14 unless changed). See [artifacts](/guides/actions/#artifacts). | | |
| 110 | 117 | | **Features** | Whether it has issues. A [fork](/concepts/forks/) starts with them off. | | |
| ⋯ | |||
| 185 | 192 | ||
| 186 | 193 | | Change | Needs | | |
| 187 | 194 | | --- | --- | | |
| 188 | − | | Description, website, topics | Maintain | | |
| 195 | + | | Website, topics | Maintain | | |
| 189 | 196 | | How long artifacts are kept | Maintain | | |
| 190 | 197 | | [Merge, commit and issue settings](#settings) | Maintain | | |
| 191 | 198 | | How many branches and tags a push may update | Admin | | |
| ⋯ | |||
| 206 | 213 | ## Edit the details | |
| 207 | 214 | ||
| 208 | 215 | 1. Open the repository's **Settings → Repository**. | |
| 209 | − | 2. Under **Details**, change **Description**, **Website** or **Topics**. | |
| 216 | + | 2. Under **Details**, change **Website** or **Topics**. The description | |
| 217 | + | is the project's: change it on **Settings → General**. | |
| 210 | 218 | 3. Choose **Save**. | |
| 211 | 219 | ||
| 212 | 220 | | Field | Rules | | |
| 213 | 221 | | --- | --- | | |
| 214 | − | | Description | Up to 200 characters. Empty clears it. | | |
| 215 | 222 | | Website | An http or https address. `https://` is added when you leave the scheme out. Empty clears it. | | |
| 216 | 223 | | Topics | Lowercase letters, digits and hyphens, at most 20, each up to 35 characters. Separate them with commas or spaces. | | |
| 217 | 224 | ||
| ⋯ | |||
| 223 | 230 | curl -X PATCH https://api.g1t.sh/repos/acme/rocket \ | |
| 224 | 231 | -H "Authorization: Bearer $G1T_TOKEN" \ | |
| 225 | 232 | -H "Content-Type: application/json" \ | |
| 226 | − | -d '{"description": "Launches things.", "website": "rocket.acme.dev", "topics": ["cli", "rust"]}' | |
| 233 | + | -d '{"website": "rocket.acme.dev", "topics": ["cli", "rust"]}' | |
| 227 | 234 | ``` | |
| 228 | 235 | ||
| 229 | 236 | Over MCP, it is the `repository` tool's `update` action, with `repo` and | |
| ⋯ | |||
| 372 | 379 | | --- | --- | --- | | |
| 373 | 380 | | Who can see it | Anyone: its code, issues and pull requests, and cloning it, without signing in. | Only people with a role on it: its workspace's owners, its members (unless the [base permission](/guides/access-and-roles/#the-base-permission) is None), and anyone given a role on it. Anyone else gets a page that says it does not exist. | | |
| 374 | 381 | | Search and Explore | It is added to [search](/guides/search/) and Explore for everyone. | It leaves search and Explore for everyone outside the workspace. | | |
| 375 | − | | Link previews | Links to it show a preview card with its name and description. | Links to it stop showing a preview card. | | |
| 382 | + | | Link previews | Links to it show a preview card with its name and its project's description. | Links to it stop showing a preview card. | | |
| 376 | 383 | | Storage | It stops counting toward the workspace's private storage. | It counts toward the workspace's private storage. A free workspace has 1 GB; making it private is refused when that would go over. See [what is free](/guides/usage-and-billing/#what-is-free). | | |
| 377 | 384 | ||
| 378 | 385 | Nothing else changes: its address, members, settings, secrets, webhooks | |
| ⋯ | |||
| 572 | 579 | ||
| 573 | 580 | | Change | Event | | |
| 574 | 581 | | --- | --- | | |
| 575 | − | | Description, website, topics, protection | `repo.updated` | | |
| 582 | + | | Website, topics, protection | `repo.updated` | | |
| 576 | 583 | | Visibility | `repo.visibility_changed` | | |
| 577 | 584 | | Rename | `repo.renamed` | | |
| 578 | 585 | | Default branch | `repo.default_branch_changed` | | |
| 223 | 223 | ||
| 224 | 224 | | Tab | What it holds | | |
| 225 | 225 | | --- | --- | | |
| 226 | − | | **General** | The project's name and description, its source, its **root directory**, [what it is](#what-a-project-is), its [links](#links), and its [production image](#uploading-an-image). A project shows its repository's description, and follows it as it changes, until you give the project one of its own; **Use the repository's description** goes back. | | |
| 226 | + | | **General** | The project's name and description, its source, its **root directory**, [what it is](#what-a-project-is), its [links](#links), and its [production image](#uploading-an-image). Only projects have descriptions: a repository has none of its own, and search, link previews and lists of repositories show its project's. A fork's project starts with the description of the project it was forked from. | | |
| 227 | 227 | | **Deployments** | Production, previews, build command, output directory and idle days. See [Deployments](/guides/deployments/#settings). | | |
| 228 | 228 | | **Domains** | Custom domains for production. See [custom domains](/guides/deployments/#custom-domains). | | |
| 229 | 229 | | **Guardrails** | How long g1t's checks, merge queue and merge checks may run here. See [guardrails](/guides/guardrails/). | | |
| 230 | − | | **Repository** | The repository's name, description, website, [topics](/guides/search/#what-is-indexed) and default branch, and its danger zone: visibility, archive, transfer and delete. See [Managing a repository](/guides/managing-repositories/). | | |
| 230 | + | | **Repository** | The repository's name, website, [topics](/guides/search/#what-is-indexed) and default branch, and its danger zone: visibility, archive, transfer and delete. See [Managing a repository](/guides/managing-repositories/). | | |
| 231 | 231 | | **Access** | Who has a [role](/guides/access-and-roles/) on the repository, and invitations. | | |
| 232 | 232 | | **Branches and merging** | Auto-merge, the CODEOWNERS file's errors, and what the rules hold for the default branch. | | |
| 233 | 233 | | **Rules** | [Rulesets](/guides/rules/): branch and tag protection, [required status checks](/guides/pull-requests/#required-status-checks), approvals and the merge queue, with Insights. | | |
| ⋯ | |||
| 244 | 244 | ||
| 245 | 245 | | Tab | Needs | | |
| 246 | 246 | | --- | --- | | |
| 247 | − | | **General**, **Dependencies**, **Branches and merging**, and on **Repository** its description, website and topics | Maintain | | |
| 247 | + | | **General**, **Dependencies**, **Branches and merging**, and on **Repository** its website and topics | Maintain | | |
| 248 | 248 | | **Rules**, **Guardrails** | Admin | | |
| 249 | 249 | | **Access**: seeing who has a role; changing it | Write; Admin | | |
| 250 | 250 | | **Deployments**, **Domains**, **Secrets and variables**, **Runners**, **Webhooks** | Admin | | |
| 25 | 25 | ||
| 26 | 26 | | Tab | Searches | | |
| 27 | 27 | | --- | --- | | |
| 28 | − | | **Repositories** | Each repository's name, workspace, description, topics and the opening of its README | | |
| 28 | + | | **Repositories** | Each repository's name, workspace, its project's description, topics and the opening of its README | | |
| 29 | 29 | | **Code** | The file names and contents of every repository's default branch | | |
| 30 | 30 | | **Issues** | Issue titles and descriptions | | |
| 31 | 31 | | **Pull requests** | Pull request titles and descriptions | | |
| ⋯ | |||
| 93 | 93 | ||
| 94 | 94 | | What | When it is indexed | | |
| 95 | 95 | | --- | --- | | |
| 96 | − | | A repository's name, description, topics and README | When it is created or its settings change, and on every push to its default branch | | |
| 96 | + | | A repository's name, topics and README | When it is created or its settings change, and on every push to its default branch | | |
| 97 | + | | A repository's description, which is its project's | When the project's name or description changes | | |
| 97 | 98 | | Code | On every push to the default branch: only the files the push changed | | |
| 98 | 99 | | Issues and pull requests | When they are opened, edited, assigned, closed, reopened, marked ready or merged | | |
| 99 | 100 | | People and workspaces | When an account or a workspace is made, or its name, description or avatar changes | | |
| 70 | 70 | | `repo.created` | A repository was made. A [fork](/concepts/forks/) has `data.parent_id`, the repository it was forked from. | | |
| 71 | 71 | | `repo.forked` | Someone forked this repository, or a pull request's working copy was made of it. `data.repo_id` is the new repository, `data.source_repo_id` this one, and `data.pull_id` the pull request, for a working copy only. | | |
| 72 | 72 | | `repo.detached` | A fork left its parent: an admin detached it, or its parent was made public or private. `data.repo_id` and `data.parent_id`. Its workflows stay off unless someone had turned them on. | | |
| 73 | − | | `repo.updated` | Its description, website, topics, protection or visibility changed. | | |
| 73 | + | | `repo.updated` | Its website, topics, protection or visibility changed. | | |
| 74 | 74 | | `repo.visibility_changed` | It was made public or private. | | |
| 75 | 75 | | `repo.renamed` | It was given a new name. Its old address redirects. | | |
| 76 | 76 | | `repo.transferred` | It moved to another workspace. | |
| 125 | 125 | | `[REPOSITORY]` | OWNER/NAME; the current repository when left out. | | |
| 126 | 126 | | `-w, --web` | Open it in the browser. | | |
| 127 | 127 | ||
| 128 | − | Calls [`get_repo`](/reference/api/repositories/get-repo/). | |
| 128 | + | Calls [`get_repo`](/reference/api/repositories/get-repo/), [`list_projects`](/reference/api/projects/list-projects/). | |
| 129 | 129 | ||
| 130 | 130 | ### g1t repo clone | |
| 131 | 131 | ||
| ⋯ | |||
| 156 | 156 | | `[NAME]` | NAME, or WORKSPACE/NAME. | | |
| 157 | 157 | | `--public` | Anyone can see it. Repositories are private unless this is given. | | |
| 158 | 158 | | `--private` | Only people with a role on it can see it (the default). | | |
| 159 | − | | `-d, --description <DESCRIPTION>` | | | |
| 159 | + | | `-d, --description <DESCRIPTION>` | What it is, in a line: its project's description. | | |
| 160 | 160 | | `-c, --clone` | Clone it once it is made. | | |
| 161 | 161 | | `--source <DIR>` | Add it as a remote of this directory's repository and push it there. | | |
| 162 | 162 | | `--remote <REMOTE>` | The remote's name, with --source. Default: `origin`. | | |
| ⋯ | |||
| 174 | 174 | | Argument or flag | | | |
| 175 | 175 | | --- | --- | | |
| 176 | 176 | | `[WORKSPACE]` | Only this workspace's. | | |
| 177 | − | | `-q, --query <QUERY>` | Only those whose name or description holds this. | | |
| 177 | + | | `-q, --query <QUERY>` | Only those whose name holds this. | | |
| 178 | 178 | | `-L, --limit <LIMIT>` | Default: `20`. | | |
| 179 | 179 | ||
| 180 | − | Calls [`list_repos`](/reference/api/repositories/list-repos/). | |
| 180 | + | Calls [`list_repos`](/reference/api/repositories/list-repos/), [`list_projects`](/reference/api/projects/list-projects/). | |
| 181 | 181 | ||
| 182 | 182 | ### g1t repo fork | |
| 183 | 183 | ||
| ⋯ | |||
| 192 | 192 | | `[REPOSITORY]` | OWNER/NAME; the current repository when left out. | | |
| 193 | 193 | | `-w, --workspace <WORKSPACE>` | The workspace to fork it into; your personal workspace when left out. | | |
| 194 | 194 | | `--name <NAME>` | The fork's name; the repository's own when left out. | | |
| 195 | − | | `-d, --description <DESCRIPTION>` | The fork's description; the repository's own when left out. | | |
| 196 | 195 | | `--all-branches` | Copy every branch and tag, not only the default branch. | | |
| 197 | 196 | | `-c, --clone` | Clone the fork, with the repository it came from as the remote upstream. | | |
| 198 | 197 | ||
| ⋯ | |||
| 211 | 210 | | `[REPOSITORY]` | OWNER/NAME; the current repository when left out. | | |
| 212 | 211 | | `-L, --limit <LIMIT>` | Default: `30`. | | |
| 213 | 212 | ||
| 214 | − | Calls [`list_forks`](/reference/api/repositories/list-forks/). | |
| 213 | + | Calls [`list_forks`](/reference/api/repositories/list-forks/), [`list_projects`](/reference/api/projects/list-projects/). | |
| 215 | 214 | ||
| 216 | 215 | ### g1t repo sync | |
| 217 | 216 | ||
| 260 | 260 | | [`tarball`](/reference/api/repositories/download-tarball-archive/) | A link to a branch, tag or commit (`ref`, the default branch when left out) as a `.tar.gz` that needs no token, good for 10 minutes, as `url`, with the `commit` it is of. | `repo` | `code:read` | | |
| 261 | 261 | | [`zipball`](/reference/api/repositories/download-zipball-archive/) | The same as a `.zip`. | `repo` | `code:read` | | |
| 262 | 262 | | [`create`](/reference/api/repositories/create-repo/) | Create a repository in one of your workspaces, empty or as a copy of a public git repository (`import_url`). `workspace` may be left out if you belong to exactly one. | `name` | `repo:write` | | |
| 263 | − | | [`update`](/reference/api/repositories/update-repo/) | Change its `description`, `website`, `topics` and `default_branch`, whether its default branch is `protected`, whether it is `private`, and whether a private repository may be forked (`allow_forking`). Maintain role; `protected`, `private`, `allow_forking` and `default_branch` need Admin, and `private` the [member privileges](/guides/workspaces/#member-privileges) unless you are an owner. | `repo` | `repo:write` | | |
| 263 | + | | [`update`](/reference/api/repositories/update-repo/) | Change its `website`, `topics` and `default_branch`, whether its default branch is `protected`, whether it is `private`, and whether a private repository may be forked (`allow_forking`). Maintain role; `protected`, `private`, `allow_forking` and `default_branch` need Admin, and `private` the [member privileges](/guides/workspaces/#member-privileges) unless you are an owner. | `repo` | `repo:write` | | |
| 264 | 264 | | [`get_settings`](/reference/api/repositories/get-repo-settings/) | How it handles pull requests: how they merge, and the default branch's required checks, approvals, bypassing checks, being up to date and merge queue as its [rulesets](/guides/rules/) stack. | `repo` | `repo:read` | | |
| 265 | 265 | | [`update_settings`](/reference/api/repositories/update-repo-settings/) | Change those settings. Only the fields given change; `required_checks` replaces the whole list. Maintain role. | `repo` | `repo:write` | | |
| 266 | 266 | | [`check_names`](/reference/api/repositories/list-check-names/) | The check names reported on its commits in the last 30 days, most recent first, each with `name`, `events` and `last_seen`: the names `required_checks` takes. | `repo` | `repo:read` | | |
| ⋯ | |||
| 303 | 303 | | [`delete_branch`](/reference/api/repositories/delete-branch/) | Delete a branch, never the default; answers with the commit it pointed to. With `head`, a branch that has moved is left alone. Write role; the rules for deleting it hold. | `repo`, `branch` | `repo:write` | | |
| 304 | 304 | | [`rename`](/reference/api/repositories/rename-repo/) | Give it a new name in its workspace; the old address redirects. Admin role. | `repo`, `name` | `repo:admin` | | |
| 305 | 305 | | [`transfer`](/reference/api/repositories/transfer-repo/) | Move it to another workspace, keeping its name; the old address redirects. An owner, or an Admin when the member privileges allow it; and someone who can create a repository in the other workspace. See [transferring a repository](/guides/transferring-repositories/). | `repo`, `to` | `repo:admin` | | |
| 306 | − | | [`fork`](/reference/api/repositories/fork-repo/) | [Fork it](/guides/forking-repositories/) into `workspace` (your personal workspace when left out), as `name` with `description` (its own when left out); `default_branch_only` (true unless you say) copies the default branch alone. Only its code and description are copied; workflows and issues start off. A private repository only when its admins allow forking. | `repo` | `repo:write` | | |
| 306 | + | | [`fork`](/reference/api/repositories/fork-repo/) | [Fork it](/guides/forking-repositories/) into `workspace` (your personal workspace when left out), as `name`; `default_branch_only` (true unless you say) copies the default branch alone. Only its code is copied, and its project starts with the parent project's description; workflows and issues start off. A private repository only when its admins allow forking. | `repo` | `repo:write` | | |
| 307 | 307 | | [`forks`](/reference/api/repositories/list-forks/) | Its forks you can see, newest first, each with `parent`; `limit` at most 100. | `repo` | `repo:read` | | |
| 308 | 308 | | [`sync_fork`](/reference/api/repositories/sync-fork/) | Bring a fork's `branch` (its default branch when left out) up to date with its parent: `status` is `up_to_date`, `fast_forwarded`, `merged` or `conflicted` (with `conflicts`), with `behind` and `ahead`. Write role on the fork. | `repo` | `repo:write` | | |
| 309 | 309 | | [`detach_fork`](/reference/api/repositories/detach-fork/) | Make a fork an ordinary repository with no parent, whose visibility can then change. It cannot be attached again. Admin role. | `repo` | `repo:admin` | | |
| ⋯ | |||
| 724 | 724 | | [`activity`](/reference/api/workspaces/get-workspace-activity/) | What happened across its repositories you can read, newest first: pull requests merged, opened and closed, issues, releases, deployments, pushes (`default_branch` marks what landed without a pull request), reviews and packages, each with its `repo`, `actor`, `number`, `title` and `url` where it has them, and a `summary` of what shipped. `landed` lists the commits that reached default branches, with each author's `username` when known and `production` (`live`, `deploying`, `failed` or `not_deployed`, with the `deploy` that decided it) where the repository deploys: a project's production deployment, or a successful run of its deploy workflow on the default branch. `since` and `until` (RFC 3339; the last 24 hours by default, at most 31 days), `kinds` and `limit` (at most 200) narrow it; `complete` is false when more happened than was read. | `workspace` | `repo:read` | | |
| 725 | 725 | | [`list_projects`](/reference/api/projects/list-projects/) | Its projects you can see, by name: each with its `kind` and `kind_reason`, where it `runs` and its `production_url`, its repository and `root_dir`, and its `links`. | `workspace` | `repo:read` | | |
| 726 | 726 | | [`get_project`](/reference/api/projects/get-project/) | One project, with what a person set (`setting`) and what detection decides (`detected`). | `workspace`, `project` | `repo:read` | | |
| 727 | − | | [`update_project`](/reference/api/projects/update-project/) | Change its `name`, `description`, `root_dir`, `kind`, `runs`, `production_url`, `homepage`, `docs_url` or `links`; only what you give changes. `auto` leaves `kind` or `runs` to detection, null clears a link or goes back to the repository's, and `links` replaces its other links (at most 10). Maintain role or higher. | `workspace`, `project` | `repo:write` | | |
| 727 | + | | [`update_project`](/reference/api/projects/update-project/) | Change its `name`, `description`, `root_dir`, `kind`, `runs`, `production_url`, `homepage`, `docs_url` or `links`; only what you give changes. `auto` leaves `kind` or `runs` to detection, null clears a link (the homepage goes back to the repository's website), and `links` replaces its other links (at most 10). Maintain role or higher. | `workspace`, `project` | `repo:write` | | |
| 728 | 728 | | [`list_pinned_projects`](/reference/api/pinned-projects/list-pinned-projects/) | Your pinned projects in it, in your order, each with its `position`. Your own: a personal token or an OAuth sign-in. | `workspace` | `account:read` | | |
| 729 | 729 | | [`pin_project`](/reference/api/pinned-projects/pin-project/) | Pin a project you can see, at `position` (0 first) or at the end; at most 8 a workspace. Returns your pins. | `workspace`, `project` | `account:write` | | |
| 730 | 730 | | [`unpin_project`](/reference/api/pinned-projects/unpin-project/) | Unpin it. Returns your pins. | `workspace`, `project` | `account:write` | | |
Comments
Sign in to comment.