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
95 linesCodeBlameRaw
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import type { DirectoryPerson, DirectoryTeam, PeopleDirectory } from "@g1t/contracts";
5
6import { codeAccessWords, directoryEntries, leads, ownsFromText } from "./people.ts";
7
8const person = (username: string, extra: Partial<DirectoryPerson> = {}): DirectoryPerson => ({
9 user_id: `usr_${username}`,
10 username,
11 name: null,
12 avatar: null,
13 bio: null,
14 location: null,
15 pronouns: null,
16 timezone: null,
17 role: "member",
18 title: null,
19 owns: [],
20 joined_at: "2026-10-01T00:00:00Z",
21 ...extra,
22});
23
24const team = (slug: string, name: string, extra: Partial<DirectoryTeam> = {}): DirectoryTeam => ({
25 slug,
26 name,
27 description: null,
28 visibility: "visible",
29 parent: null,
30 lead: null,
31 channel: null,
32 budget_micros: null,
33 people: [],
34 agent_ids: [],
35 repos_count: 0,
36 ...extra,
37});
38
39const directory: PeopleDirectory = {
40 people: [
41 person("chase", { name: "Chase Pierce", title: "Founder", role: "owner" }),
42 person("sofia", { name: "Sofia Reyes", title: "Head of Sales", owns: ["the forecast"] }),
43 person("jordan", { name: "Jordan Lee", title: "Account Executive", owns: ["Halcyon", "Bluebird"] }),
44 person("kai", { name: "Kai Nakamura", title: "Product Designer" }),
45 ],
46 teams: [
47 team("sales", "Sales", {
48 lead: { kind: "user", username: "sofia", name: "Sofia Reyes", avatar: null },
49 people: [
50 { username: "sofia", role: "maintainer" },
51 { username: "jordan", role: "member" },
52 ],
53 agent_ids: ["agt_david"],
54 repos_count: 0,
55 }),
56 team("design", "Design", { people: [{ username: "kai", role: "maintainer" }], repos_count: 2 }),
57 team("night-shift", "Night shift", { lead: { kind: "agent", agent_id: "agt_atlas" }, agent_ids: ["agt_atlas", "agt_sentinel", "agt_david"] }),
58 ],
59 base_permission: "read",
60 can_manage: true,
61};
62
63test("a team's lead is a person; an old agent lead is nobody's", () => {
64 assert.equal(leads(directory.teams[0]!.lead, { username: "sofia" }), true);
65 assert.equal(leads(directory.teams[0]!.lead, { username: "jordan" }), false);
66 assert.equal(leads(directory.teams[2]!.lead, { username: "atlas" }), false);
67 assert.equal(leads(null, { username: "sofia" }), false);
68});
69
70test("the directory lists people, in one search", () => {
71 const names = (query: string) => directoryEntries(directory, query).map((e) => e.person.username);
72 assert.deepEqual(names(""), ["chase", "sofia", "jordan", "kai"]);
73 assert.deepEqual(names("sales"), ["sofia", "jordan"]);
74 assert.deepEqual(names("halcyon"), ["jordan"]);
75 assert.deepEqual(names("owner"), ["chase"]);
76 // A team with no people on it is no one's team in the directory.
77 assert.deepEqual(names("night shift"), []);
78 assert.equal(names("nobody here").length, 0);
79 // Every entry is a person with their teams.
80 const sofia = directoryEntries(directory, "sofia")[0]!;
81 assert.deepEqual(Object.keys(sofia), ["person", "teams"]);
82 assert.deepEqual(sofia.teams.map((t) => t.slug), ["sales"]);
83});
84
85test("forms read plainly", () => {
86 assert.deepEqual(ownsFromText("storefront\n the release process ,, billing"), ["storefront", "the release process", "billing"]);
87});
88
89test("access to Code says where it comes from", () => {
90 assert.equal(codeAccessWords({ role: "owner" }, "read", []).summary, "Admin on every repository, as an owner");
91 const kai = codeAccessWords({ role: "member" }, "read", [directory.teams[1]!]);
92 assert.equal(kai.summary, "Read on every repository, the workspace's base permission");
93 assert.deepEqual(kai.through, ["Roles on 2 repositories through Design"]);
94 assert.equal(codeAccessWords({ role: "member" }, "none", []).summary, "Only repositories they're given a role on");
95});