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 @@ -28,6 +28,7 @@ const CATEGORIES: Category[] = [
"learning",
"finance",
"people",
"security",
];

/** A fixed color per role, so the mascots tell the cards apart. */
Expand Down
6 changes: 3 additions & 3 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(86);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(108);
});

test("a crew with only its chief invites the owner to pick bots, and a click adds one", async () => {
Expand Down Expand Up @@ -82,7 +82,7 @@ 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(86);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(108);

fireEvent.click(within(dialog).getByRole("button", { name: "Marketing & sales" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(24);
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(86);
expect(within(dialog).getAllByRole("listitem")).toHaveLength(108);
});

test("the same role twice gets another name", async () => {
Expand Down
7 changes: 7 additions & 0 deletions app/src/i18n/en/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@ import { base } from "./catalogBase";
import { contentAndLearning } from "./catalogContent";
import { design } from "./catalogDesign";
import { engineering } from "./catalogEngineering";
import { engineeringMore } from "./catalogEngineeringMore";
import { finance } from "./catalogFinance";
import { marketing } from "./catalogMarketing";
import { paidMedia } from "./catalogPaidMedia";
import { people } from "./catalogPeople";
import { product } from "./catalogProduct";
import { sectors } from "./catalogSectors";
import { security } from "./catalogSecurity";

// The Bot agency (spec 26): ready-made bots the owner adds to a crew. The
// roles are the daemon's sheets, by id; this is what the owner reads about
Expand Down Expand Up @@ -36,6 +39,7 @@ export const catalog = {
learning: "Learning",
finance: "Finance",
people: "People & HR",
security: "Security",
},
none: "No bot matches that.",
loading: "Loading the bots…",
Expand Down Expand Up @@ -65,5 +69,8 @@ export const catalog = {
...finance,
...paidMedia,
...people,
...engineeringMore,
...security,
...sectors,
},
};
85 changes: 85 additions & 0 deletions app/src/i18n/en/catalogEngineeringMore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// More engineering roles (spec 26.3): what the owner reads about each. All
// work on the owner's own code, with the Manual mode's approvals.

export const engineeringMore = {
"technical-writer": {
name: "Technical Writer",
role: "Writes clear documentation from the real code and setup: guides, references and how-tos that match what the system does",
summary:
"Writes clear docs from your real code and setup: guides, how-tos and references that stay true",
about:
"Reads your code and runs the commands it documents on a copy, so the steps and the output are real. It writes for one reader at a time: the most common task first, numbered steps, what you should see after each one and what to do when it fails. It tells you what it tested and what it only read.",
when: "When your project has no README, the docs are out of date, or someone new has to take over.",
pairs: "Codebase Guide, for the big picture, and Code Reviewer, to check the technical claims.",
},
"sre-engineer": {
name: "Reliability Engineer",
role: "Makes your service dependable: defines what good looks like, sets up alerts that matter and writes the steps to follow when it breaks",
summary:
"Makes your service dependable: clear targets, alerts that matter and steps to follow when it breaks",
about:
"Turns what your users feel into a few targets in numbers, maps where the service can fail and proposes alerts that mean a person must act now, each with the first thing to check. It writes short runbooks for the usual failures and a blameless review after an incident. It never restarts or changes anything in production on its own.",
when: "When your service goes down too often, or you get alerts you ignore.",
pairs: "DevOps Engineer, for the infrastructure, and Backend Developer, for the fixes in code.",
},
"release-engineer": {
name: "Release Engineer",
role: "Plans and prepares releases: version numbers, change notes, checks before shipping and a way back, without publishing for you",
summary:
"Plans and prepares your releases, with notes, a checklist and a way back, and never ships by itself",
about:
"Reads what changed since the last release, groups it by what users notice and proposes the version number and the notes in plain words. It writes a checklist, the steps to ship and the steps to undo, and says which one is hard to undo. You make the tag, the upload and the announcement yourself, and it never touches your signing keys.",
when: "Before every release of an app, a library or a site.",
pairs: "QA Tester, to run the checklist, and DevOps Engineer, for the pipeline.",
},
"codebase-guide": {
name: "Codebase Guide",
role: "Explains an unfamiliar codebase: the big picture, where things live, how a request flows and where to start changing",
summary:
"Explains an unfamiliar codebase: the big picture, where things live and where to start",
about:
"Tailors a tour to what you need to do, traces one real path from start to end by file and function and points out the conventions, the risky areas and the tests. It says what it is sure of and what it inferred, and ends with a small first task. It only reads; it changes nothing unless you ask.",
when: "When you inherit code, join a project or have to change something you did not write.",
pairs: "Technical Writer, to turn the tour into docs, and Software Architect.",
},
"prompt-engineer": {
name: "Instruction Writer for AI",
role: "Writes and improves the instructions you give to AI models, then tests them on real examples before you rely on them",
summary:
"Writes and improves instructions for AI models and tests them on real examples before you trust them",
about:
"Asks for real examples, including hard ones, writes the instruction with a clear goal, rules, answer format and examples, and tests it, changing one thing at a time. You get a table of results for each version and the weak spots that remain. It warns you when the instruction will read untrusted text that could give orders.",
when: "When an AI feature in your app or workflow gives answers you cannot rely on.",
pairs: "Backend Developer, to wire it in, and QA Tester, to try more cases.",
},
"rapid-prototyper": {
name: "Prototype Builder",
role: "Builds a quick working version of an idea to test it with real people, in the simplest way that works, and says what is faked",
summary:
"Builds a quick working version of your idea to test with real people, and says what is faked",
about:
"Starts from the question the prototype must answer and builds only that, with made-up data and no real accounts. It writes a short test for the people who will try it and a note saying what is faked and what a real version needs, so nobody ships the prototype by accident.",
when: "When you have an idea and want to know if people care before you build it properly.",
pairs: "Designer, for the look, and UX Researcher, to run the test.",
},
"localization-engineer": {
name: "Localization Engineer",
role: "Prepares software for several languages and countries: moves text out of the code, handles dates, numbers and plurals, and checks the result",
summary:
"Prepares your software for several languages and countries and checks that nothing breaks",
about:
"Moves the text out of your code into translation files, with one sentence per key and placeholders instead of joined pieces. It handles plurals, dates, numbers and currencies by the user's region, checks layouts with long words and adds a test that fails when a language is missing a string. It hands the new strings to a translator.",
when: "When you want your app or site in a second language, or a country with different formats.",
pairs: "Translator, for the strings, and Frontend Developer, for the layout.",
},
"refactoring-engineer": {
name: "Code Cleanup Engineer",
role: "Cleans up code in small, safe steps without changing what it does, proving each step with tests",
summary:
"Cleans up your code in small, safe steps without changing what it does, with tests for each step",
about:
"Starts from a reason, makes sure tests exist before it touches anything and then changes one thing at a time, each as its own small commit. It does not mix a cleanup with a behavior change, and it never edits a test just to make a cleanup pass. It lists what it saw but left alone.",
when: "When code is hard to change or understand and you want it better without breaking it.",
pairs: "Code Reviewer, to check each step, and QA Tester, to try the behavior.",
},
};
77 changes: 77 additions & 0 deletions app/src/i18n/en/catalogSectors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Roles for particular kinds of business (spec 26.3), listed under Business:
// what the owner reads about each. None sends, signs, buys, pays, refunds or
// publishes by itself.

export const sectors = {
"real-estate-assistant": {
name: "Real Estate Assistant",
role: "Helps you buy, sell or rent a property: compares listings, prepares questions and checklists, and drafts ads and messages",
summary:
"Helps you buy, sell or rent a property: compares listings, prepares questions and drafts the ad",
about:
"Compares places in one table with the same facts for each, including the real costs, and tells you what a listing leaves out. It prepares visit checklists and questions, and helps you write an honest ad and questions for buyers or tenants. It never states a market value as a fact, makes an offer or signs, and it is not an agent or a lawyer.",
when: "When you are looking for a place, or getting yours ready to sell or rent.",
pairs: "Researcher, for facts about an area, and Writer, to polish the ad.",
},
"hospitality-guest-assistant": {
name: "Guest Experience Assistant",
role: "Helps a hotel, guesthouse or rental host look after guests: answers, welcome messages, guides, and notes on what to improve",
summary:
"Helps a hotel or rental host look after guests: answers, welcome messages, guides and improvements",
about:
"Keeps a short sheet of facts about your place and drafts replies to guests from it, never inventing a time, a price or a promise. It writes the welcome message and guest guide, drafts calm answers to complaints and reads your reviews for what guests like and what repeats as a problem. Refunds and discounts stay your decision.",
when: "When guests ask the same things all day, or you want better reviews.",
pairs: "Translator, for guests who speak another language, and Social Media.",
},
"returns-assistant": {
name: "Returns and Refunds Assistant",
role: "Handles customer returns and refund requests by your own policy: sorts them, drafts the replies and spots patterns and abuse",
summary:
"Handles returns and refund requests by your own policy: sorts them, drafts replies and spots patterns",
about:
"Reads each request against your written policy and sorts it as inside, outside or a doubt, then drafts a clear, friendly reply. Doubts and exceptions come to you. Each week it shows what repeats, such as items with many returns, without accusing any customer. It warns you when a customer may have a legal right to a refund. It never issues a refund itself.",
when: "When returns and refund requests take too much of your day.",
pairs: "Customer Support, for tone, and E-commerce Manager, for listing fixes.",
},
"supply-chain-planner": {
name: "Supply Chain Planner",
role: "Plans what to buy and when: stock levels, reorder points, supplier comparisons and delivery risks, for a small business",
summary:
"Plans what to buy and when: stock levels, reorder points and supplier comparisons for a small business",
about:
"Works from your sales, stock, prices and lead times to propose a reorder point and an order size for each item, with the formula shown. It flags the items you cannot run out of and the slow ones that tie up money, compares suppliers on the full cost and lists the risks with a plan B. It never places an order or contacts a supplier.",
when: "When you run out of stock, or hold too much of what does not sell.",
pairs: "Bookkeeper, for costs, and Cash Flow Forecaster, for what you can afford.",
},
"grant-writer": {
name: "Grant Writer",
role: "Finds and prepares applications for grants and public calls: reads the rules, plans the answer and drafts it from your real facts",
summary:
"Prepares applications for grants and public calls: reads the rules, plans the answer and drafts it",
about:
"Reads the call in full, summarizes it with the deadline first and checks honestly whether you qualify before it writes anything. Then it plans the application against the scoring and drafts each section from your real facts, marking every gap as a question. It never invents a result, a partner or a number, and never submits for you.",
when: "When you find a grant, a public call or a funding program that could fit you.",
pairs: "Financial Analyst, for the budget, and Editor, to polish.",
},
"restaurant-manager": {
name: "Restaurant Assistant",
role: "Helps run a small restaurant or café: menu and costs, shifts, orders and supplies, and answers to guests",
summary:
"Helps run a small restaurant or café: menu costs, shifts, supplies and answers to guests",
about:
"Works out what each dish really costs and where you lose money, plans shifts around your busy hours, keeps the shopping list and a daily sheet that shows what repeats. It never says a dish is free of an allergen or safe for a diet on a guess: that comes from your own recipe sheets, and when they do not say, it tells you to check first.",
when: "When you run a small food business and the paperwork eats your time.",
pairs: "Bookkeeper, for costs, and Social Media, for posts about the menu.",
},
"course-creator": {
name: "Online Course Creator",
role: "Helps you turn what you know into an online course or workshop: the promise, the outline, the lessons, the exercises and the page that explains it",
summary:
"Helps you turn what you know into an online course: outline, lessons, exercises and the sales page",
about:
"Starts from the student and an honest promise you can deliver, builds the outline backwards from the result and drafts the lessons and exercises in your voice, with your own examples. The course page uses only real content and results: no made-up testimonials, no false deadlines, no earnings promises. You publish and set the price.",
when: "When you know something people would pay to learn and want to teach it.",
pairs:
"Presentation Designer, for slides, Video Scriptwriter, for scripts, and Editor, to proofread.",
},
};
Loading
Loading