Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/features/catalog/AgencyGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const CATEGORIES: Category[] = [
"research",
"business",
"learning",
"finance",
];

/** A fixed color per role, so the mascots tell the cards apart. */
Expand Down
8 changes: 4 additions & 4 deletions app/src/features/catalog/agency.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ describe("the Bot agency", () => {

fireEvent.click(within(invite).getByRole("button", { name: "See all bots" }));
const dialog = await screen.findByRole("dialog", { name: "Bot agency" });
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(58);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(79);
});

test("a crew with only its chief invites the owner to pick bots, and a click adds one", async () => {
Expand Down Expand Up @@ -82,10 +82,10 @@ describe("the Bot agency", () => {
await openCrewWithChief();
fireEvent.click(screen.getByRole("button", { name: "Bot agency" }));
const dialog = await screen.findByRole("dialog", { name: "Bot agency" });
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(58);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(79);

fireEvent.click(within(dialog).getByRole("button", { name: "Marketing & sales" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(18);
expect(within(dialog).getAllByRole("listitem")).toHaveLength(24);
fireEvent.click(within(dialog).getByRole("button", { name: "Product & management" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(14);

Expand Down Expand Up @@ -129,7 +129,7 @@ describe("the Bot agency", () => {
expect(addCalls(fake)[0]).toMatchObject({ templateId: "code-reviewer" });

fireEvent.click(within(dialog).getByRole("button", { name: "Back to all bots" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(58);
expect(within(dialog).getAllByRole("listitem")).toHaveLength(79);
});

test("the same role twice gets another name", async () => {
Expand Down
15 changes: 14 additions & 1 deletion app/src/i18n/en/catalog.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { base } from "./catalogBase";
import { contentAndLearning } from "./catalogContent";
import { design } from "./catalogDesign";
import { engineering } from "./catalogEngineering";
import { finance } from "./catalogFinance";
import { marketing } from "./catalogMarketing";
import { paidMedia } from "./catalogPaidMedia";
import { product } from "./catalogProduct";

// The Bot agency (spec 26): ready-made bots the owner adds to a crew. The
Expand Down Expand Up @@ -30,6 +33,7 @@ export const catalog = {
product: "Product & management",
marketing: "Marketing & sales",
learning: "Learning",
finance: "Finance",
},
none: "No bot matches that.",
loading: "Loading the bots…",
Expand All @@ -49,5 +53,14 @@ export const catalog = {
pairs: "Works well with",
technical: "What the bot is told when it starts",
},
roles: { ...base, ...product, ...marketing, ...engineering, ...contentAndLearning },
roles: {
...base,
...product,
...marketing,
...engineering,
...contentAndLearning,
...design,
...finance,
...paidMedia,
},
};
84 changes: 84 additions & 0 deletions app/src/i18n/en/catalogDesign.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Design roles (spec 26.3): what the owner reads about each.

export const design = {
"brand-guardian": {
name: "Brand Guardian",
role: "Keeps everything on brand: writes a short brand guide from your material and checks pieces against it",
summary: "Writes a short brand guide from your material and checks that everything follows it",
about:
"Gathers your logo, colors, fonts and examples into a one-page brand guide, marking what it saw and what it suggests. Then it checks pages, posts and decks against the guide and lists exactly where each one drifts. It never invents a brand fact and never changes a rule without asking you.",
when: "When you have a brand and several people or bots make things for it.",
pairs: "Designer, who applies the visual fixes, and Writer, who applies the voice fixes.",
},
"ui-designer": {
name: "UI Designer",
role: "Builds the visual system of an interface: colors, type, spacing and components, shown on a style page",
summary:
"Builds the colors, type, spacing and buttons of an interface and shows them on one style page",
about:
"Chooses a small palette, a type scale and a spacing step, then builds the buttons, fields, cards and messages with all their states on one style page you can see. Every later screen reuses those parts, so the product looks like one thing.",
when: "At the start of a product, or when your screens stopped looking like they belong together.",
pairs:
"Designer, who makes the pages, Frontend Developer, who builds them, and Accessibility Reviewer.",
},
"ux-architect": {
name: "UX Architect",
role: "Plans how a product is organized and how people move through it: site maps, user flows and plain wireframes",
summary:
"Plans how a product is organized and how people move through it, with flows and simple wireframes",
about:
"Starts from who the people are and what they want to do, groups the content the way they think and draws each flow, including errors, empty states and going back. The wireframes are plain grey screens, so you judge the structure before any decoration. It lists the places people are likely to get lost.",
when: "Before you design or build a product, a site or a big new feature.",
pairs: "UX Researcher, to test the guesses, and UI Designer, who gives the wireframes a look.",
},
"accessibility-reviewer": {
name: "Accessibility Reviewer",
role: "Checks pages and designs so people with different abilities can use them, and explains each fix in plain words",
summary:
"Checks that your pages work for people with different abilities and explains each fix plainly",
about:
"Reads the code of a page and checks what can be read there: contrast, image descriptions, form labels, headings, keyboard use, visible focus and information carried by color alone. Each problem comes with who it affects and the exact fix. It says what it cannot check, such as a real screen reader, and never calls a page certified.",
when: "Before you launch a page, and after a big change to one.",
pairs:
"Frontend Developer, who applies the fixes, and UI Designer, who plans for it from the start.",
},
"presentation-designer": {
name: "Presentation Designer",
role: "Turns your message into a clear slide deck: the story, one idea per slide and a clean look, shown as screens",
summary:
"Turns what you want to say into a clear slide deck, one idea per slide, that you can see take shape",
about:
"Writes the story first, then designs each slide as a screen you see appear in the design area: one idea, a title that states the point, large text and one picture or chart at most. The details go into speaker notes. The slides are screens, not a PowerPoint file.",
when: "When you have to present, pitch or teach something and want it clear.",
pairs: "Researcher, for facts, Writer, for the words, and Infographic Designer, for charts.",
},
"infographic-designer": {
name: "Infographic Designer",
role: "Turns numbers and ideas into clear charts and infographics, drawn as screens, without bending the data",
summary: "Turns numbers and ideas into clear charts and infographics, without bending the data",
about:
"Checks where the numbers come from, then picks the form that makes the message clear and draws it as a screen: honest scales, direct labels, few colors, the source and the date on the picture. It tells you what the picture does not show and never invents a number to fill a gap.",
when: "When a table or a report is hard to read and a picture would do it better.",
pairs: "Data Analyst, for the numbers, and Presentation Designer, to put it in a deck.",
},
"image-prompt-writer": {
name: "Image Prompt Writer",
role: "Writes clear, consistent descriptions that you paste into an image or video generator, and refines them from the results",
summary:
"Writes clear, consistent descriptions for the image or video generator you use, and refines them",
about:
"Does not make images itself: it writes the descriptions you paste into the tool you use, with the subject, setting, style, light and framing, in two or three variations. For a set that must look alike, it writes one shared style paragraph. Show it what came out and it changes only the part that caused the problem.",
when: "When you use an image or video generator and your results are random or inconsistent.",
pairs: "Brand Guardian, to keep the style on brand, and Social Media, for the posts.",
},
"design-critic": {
name: "Design Critic",
role: "Reviews screens and pages with a fresh eye and gives a short, ordered list of what to improve, and why",
summary:
"Looks at your screens with a fresh eye and tells you, in order, what to improve and why",
about:
"Reads the goal and the screen files and tells you the three things that matter most first: what the eye sees first, whether the main action is clear, spacing, type, contrast and how it works on a small screen. It separates clear problems from matters of taste, says what to keep and does not redesign unless you ask.",
when: "When a screen feels off and you cannot say why, or before you ship.",
pairs: "Designer, who makes the changes, and Accessibility Reviewer, for access.",
},
};
75 changes: 75 additions & 0 deletions app/src/i18n/en/catalogFinance.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Finance roles (spec 26.3): what the owner reads about each. None of them
// moves money or replaces an accountant or an adviser, and each says so.

export const finance = {
bookkeeper: {
name: "Bookkeeper",
role: "Keeps your records in order: sorts transactions into categories, matches them to receipts and finds what does not add up",
summary:
"Sorts your transactions into categories, matches them to receipts and flags what does not add up",
about:
"Takes your statements, receipts and spreadsheets and keeps a clean record: each transaction in a category, matched to its proof, with the totals checked. It lists what has no proof instead of guessing and never changes an original file. It keeps records; it is not an accountant, and it never moves money.",
when: "At the end of every month, or when your records have piled up.",
pairs: "Financial Analyst and Budget Planner, who work from clean records.",
},
"budget-planner": {
name: "Budget Planner",
role: "Builds a realistic budget from your income and spending, tracks it through the month and shows where the money goes",
summary:
"Builds a realistic budget from your income and spending, and shows where the money goes",
about:
"Starts from your real numbers and builds a simple plan: what comes in, what goes out and what you want to reach. If the plan does not close, it says so first and shows a few ways to close it. During the month it shows where you are ahead of plan. It does not advise on investments or loans.",
when: "When you want to know where the money goes, or to plan a goal.",
pairs: "Bookkeeper, for clean records, and Cash Flow Forecaster, for what comes next.",
},
"financial-analyst": {
name: "Financial Analyst",
role: "Reads financial statements and reports, calculates the key measures and explains what they say about the business",
summary:
"Reads your financial statements, calculates the key measures and explains what they mean",
about:
"Reads your statements and spreadsheets, checks that the numbers add up and calculates what matters for your question: margins, growth, break-even, return on a project. It shows every formula, compares with something meaningful and says what the numbers do not tell. It does not tell you what to buy, sell or invest in.",
when: "Before a decision that depends on the numbers, or to understand how the business is doing.",
pairs: "Bookkeeper, for the records, and Data Analyst, for a deeper cut of the data.",
},
"cash-flow-forecaster": {
name: "Cash Flow Forecaster",
role: "Projects the money coming in and going out week by week and warns early when cash could run short",
summary:
"Projects the money in and out week by week and warns you early if cash could run short",
about:
"Builds a forecast from today's balance, the bills due and the money you expect, and shows the lowest point and when it comes. It gives an expected, a cautious and a good case and labels every estimate. If cash could run short, it lists your options and what each costs. It never moves money or delays a payment itself.",
when: "When money is tight, a big bill is coming, or you are about to commit to a cost.",
pairs: "Bills Assistant, for what is due, and Invoicing Assistant, for what is owed to you.",
},
"bills-assistant": {
name: "Bills Assistant",
role: "Keeps track of what you owe: lists the bills and due dates, checks them against orders and contracts, and prepares each payment for you to make",
summary:
"Tracks your bills and due dates, checks them for mistakes and prepares each payment for you to make",
about:
"Collects your bills, lists the amount and due date of each, and checks them against the order or contract for duplicates, wrong totals and charges nobody agreed. It keeps one list sorted by due date and warns when a bill asks for urgent payment to a new account, a common fraud. You make every payment yourself.",
when: "When bills arrive from many places and you do not want to pay late, or twice.",
pairs: "Bookkeeper, for the paid ones, and Cash Flow Forecaster, for what is coming.",
},
"invoicing-assistant": {
name: "Invoicing Assistant",
role: "Prepares your invoices and payment reminders, and keeps track of what customers still owe you",
summary:
"Prepares your invoices and polite payment reminders, and tracks what customers still owe you",
about:
"Prepares invoices from the work you did, numbers them in order and keeps a list of what is sent, paid and late. For a late invoice it writes a reminder in three steps, from friendly to firm, never threatening. It marks the legal fields it cannot fill for you or your accountant, and you send everything yourself.",
when: "When you bill customers and chasing payments takes too much of your time.",
pairs: "Bookkeeper, for the paid ones, and Cash Flow Forecaster, for the due dates.",
},
"tax-organizer": {
name: "Tax Organizer",
role: "Gathers and organizes the documents and numbers for your taxes through the year, so your accountant or your filing starts ready",
summary:
"Gathers and organizes your tax papers and numbers through the year so filing starts ready",
about:
"Collects and sorts the papers you need for taxes, keeps one list of what is complete and what is missing, and warns you before the dates that matter. It does not decide what is deductible: it lists the doubtful items as questions for your accountant. It never files, pays or signs in to a tax site, and it is not an accountant.",
when: "Through the year, and in the weeks before you or your accountant file.",
pairs: "Bookkeeper, for the records, and Invoicing Assistant, for the income side.",
},
};
Loading
Loading