Skip to content
Open
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
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 Agent agency", () => {

fireEvent.click(within(invite).getByRole("button", { name: "See all agents" }));
const dialog = await screen.findByRole("dialog", { name: "Agent agency" });
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(129);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(134);
});

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

fireEvent.click(within(dialog).getByRole("button", { name: "Marketing & sales" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(24);
expect(within(dialog).getAllByRole("listitem")).toHaveLength(27);
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 Agent agency", () => {
expect(addCalls(fake)[0]).toMatchObject({ templateId: "code-reviewer" });

fireEvent.click(within(dialog).getByRole("button", { name: "Back to all agents" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(129);
expect(within(dialog).getAllByRole("listitem")).toHaveLength(134);
});

test("the same role twice gets another name", async () => {
Expand Down
11 changes: 11 additions & 0 deletions app/src/features/crews/crewTemplates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ export const CREW_TEMPLATES: readonly CrewTemplate[] = [
"designer",
],
},
{
id: "business-review",
roles: [
"strategy-advisor",
"competitor-analyst",
"pricing-analyst",
"go-to-market-planner",
"conversion-optimizer",
"financial-analyst",
],
},
{
id: "people-team",
roles: [
Expand Down
46 changes: 46 additions & 0 deletions app/src/i18n/en/catalogMarketing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,50 @@ export const marketing = {
when: "When you are launching something, or suspect you charge too little.",
pairs: "Competitor Analyst, for the market, and Data Analyst, for sales numbers.",
},
"strategy-advisor": {
name: "Strategy Advisor",
role: "Looks at a business as a whole, finds what holds it back and proposes the few moves that matter most",
summary: "Looks at your whole business and picks the few moves worth your time next",
about:
"Asks about your offer, your customers and your numbers, finds the one or two things holding the business back and proposes up to three moves, each with its cost, how long until you can tell and the number that shows it worked. It also says what to leave alone.",
when: "When you feel stuck, or have many ideas and no way to choose between them.",
pairs: "Competitor Analyst, for the market, and Financial Analyst, for the numbers.",
},
"go-to-market-planner": {
name: "Go-to-Market Planner",
role: "Plans how to bring a product to its first customers: who it is for, the message, the channels and the first steps",
summary: "Plans who to sell to, what to say and where to find them, with the first steps",
about:
"Describes the customer you should start with, what to promise them and why you are different, compares two or three ways to reach them and writes the first weeks week by week, with what to measure. It does not invent market numbers.",
when: "When a product is ready, or nearly, and you do not know how to get the first customers.",
pairs: "Competitor Analyst, for the alternatives, and Copywriter, for the words.",
},
"launch-planner": {
name: "Launch Planner",
role: "Plans a product or feature launch: the checklist, the timeline, the messages and the day itself",
summary:
"Plans a launch from the weeks before to the day after, with a checklist and a timeline",
about:
"Builds the plan for a launch: what must be ready, a timeline for before, the day and after, the drafted messages and the numbers that tell you whether it worked. Nothing is posted or sent for you.",
when: "When you have a date for launching something and want nothing forgotten.",
pairs: "Copywriter, for the final words, and Social Media, for the posts.",
},
"sop-writer": {
name: "SOP Writer",
role: "Turns how a task is done into a clear written procedure that anyone on the team can follow",
summary: "Writes step-by-step procedures so the work does not live only in your head",
about:
"Walks through a task with you and writes it as short numbered steps with checks and the common mistakes, so a new person can follow it on the first day. It never writes passwords or private data into a procedure.",
when: "When something only you know how to do keeps landing on your desk.",
pairs: "Process Analyst, to find weak steps, and Technical Writer, for software documentation.",
},
"outreach-specialist": {
name: "Outreach Specialist",
role: "Writes personal first messages and follow-up sequences for email and social networks; never sends them",
summary: "Writes first messages and follow-ups people actually answer, and sends nothing",
about:
"Writes a short first message built on one true detail about the person, and two or three follow-ups that each add something new. It never sends, never fakes urgency or familiarity, and reminds you that messaging laws apply.",
when: "When you want to reach customers, partners or press who do not know you yet.",
pairs: "Researcher, to learn about the person, and Copywriter, for the tone.",
},
};
5 changes: 5 additions & 0 deletions app/src/i18n/en/crewTemplates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ export const crewTemplates = {
summary: "Designs a game: the rules, the story, the levels, the numbers and the testing.",
goal: "Design my game: shape the rules, write the story, plan the levels, balance the numbers and learn from the playtests. The team is already here, so give them work as tasks.",
},
"business-review": {
name: "Business check-up",
summary: "Looks at your business from every side and tells you what to do next.",
goal: "Review my business and tell me what to do next: where it is stuck, what the competition does, whether my prices make sense, how to reach customers and what the numbers say. The team is already here, so give them work as tasks. Start by asking me about the business.",
},
"people-team": {
name: "People team",
summary: "Hires, welcomes, trains and listens to a team, without deciding for you.",
Expand Down
49 changes: 49 additions & 0 deletions app/src/i18n/es/catalogMarketing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,53 @@ export const marketing: typeof en = {
pairs:
"Analista de competencia, para el mercado, y Analista de datos, para los números de venta.",
},
"strategy-advisor": {
name: "Asesor de estrategia",
role: "Mira el negocio como un todo, descubre qué lo frena y propone los pocos movimientos que más importan",
summary: "Mira todo tu negocio y elige los pocos movimientos que valen tu tiempo",
about:
"Pregunta por tu oferta, tus clientes y tus números, encuentra la una o dos cosas que frenan el negocio y propone hasta tres movimientos, cada uno con su costo, cuánto falta para saber si sirve y el número que muestra que funcionó. También dice qué dejar de lado.",
when: "Cuando te sientes atascado, o tienes muchas ideas y ninguna forma de elegir.",
pairs: "Analista de competencia, para el mercado, y Analista financiero, para los números.",
},
"go-to-market-planner": {
name: "Planificador de salida al mercado",
role: "Planifica cómo llevar un producto a sus primeros clientes: para quién es, el mensaje, los canales y los primeros pasos",
summary: "Planifica a quién vender, qué decir y dónde encontrarlos, con los primeros pasos",
about:
"Describe al cliente con quien debes empezar, qué prometerle y por qué eres diferente, compara dos o tres formas de llegar a él y escribe las primeras semanas, semana a semana, con qué medir. No inventa cifras de mercado.",
when: "Cuando un producto está listo, o casi, y no sabes cómo conseguir los primeros clientes.",
pairs:
"Analista de competencia, para las alternativas, y Redactor publicitario, para las palabras.",
},
"launch-planner": {
name: "Planificador de lanzamientos",
role: "Planifica el lanzamiento de un producto o función: la lista, el calendario, los mensajes y el día en sí",
summary:
"Planifica un lanzamiento desde las semanas previas hasta el día siguiente, con lista y calendario",
about:
"Arma el plan de un lanzamiento: qué debe estar listo, un calendario para el antes, el día y el después, los mensajes redactados y los números que dicen si funcionó. Nada se publica ni se envía por ti.",
when: "Cuando tienes una fecha para lanzar algo y no quieres olvidar nada.",
pairs:
"Redactor publicitario, para las palabras finales, y Redes sociales, para las publicaciones.",
},
"sop-writer": {
name: "Redactor de procedimientos",
role: "Convierte la forma de hacer una tarea en un procedimiento escrito y claro que cualquiera del equipo pueda seguir",
summary: "Escribe procedimientos paso a paso para que el trabajo no viva solo en tu cabeza",
about:
"Recorre una tarea contigo y la escribe en pasos cortos y numerados, con verificaciones y los errores comunes, para que una persona nueva pueda seguirla el primer día. Nunca escribe contraseñas ni datos privados en un procedimiento.",
when: "Cuando algo que solo tú sabes hacer sigue cayendo en tu escritorio.",
pairs:
"Analista de procesos, para encontrar los pasos débiles, y Redactor técnico, para documentar software.",
},
"outreach-specialist": {
name: "Especialista en contacto",
role: "Escribe primeros mensajes personales y secuencias de seguimiento para correo y redes; nunca los envía",
summary: "Escribe primeros mensajes y seguimientos que la gente responde, y no envía nada",
about:
"Escribe un primer mensaje corto, basado en un detalle verdadero sobre la persona, y dos o tres seguimientos que aportan algo nuevo cada uno. Nunca envía, nunca finge urgencia ni cercanía y te recuerda que las leyes sobre mensajes aplican.",
when: "Cuando quieres llegar a clientes, socios o prensa que aún no te conocen.",
pairs: "Investigador, para conocer a la persona, y Redactor publicitario, para el tono.",
},
};
5 changes: 5 additions & 0 deletions app/src/i18n/es/crewTemplates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ export const crewTemplates: typeof en = {
summary: "Diseña un juego: las reglas, la historia, los niveles, los números y las pruebas.",
goal: "Diseña mi juego: da forma a las reglas, escribe la historia, planifica los niveles, equilibra los números y aprende de las pruebas. El equipo ya está aquí, así que reparte el trabajo como tareas.",
},
"business-review": {
name: "Evaluación del negocio",
summary: "Mira tu negocio desde todos los lados y te dice qué hacer a continuación.",
goal: "Evalúa mi negocio y dime qué hacer a continuación: dónde está atascado, qué hace la competencia, si mis precios tienen sentido, cómo llegar a los clientes y qué dicen los números. El equipo ya está aquí, así que reparte el trabajo como tareas. Empieza preguntándome por el negocio.",
},
"people-team": {
name: "Equipo de personas",
summary: "Contrata, acoge, forma y escucha a un equipo, sin decidir por ti.",
Expand Down
48 changes: 48 additions & 0 deletions app/src/i18n/pt-BR/catalogMarketing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,52 @@ export const marketing: typeof en = {
pairs:
"Analista de concorrência, para o mercado, e Analista de dados, para os números de venda.",
},
"strategy-advisor": {
name: "Consultor de estratégia",
role: "Olha o negócio como um todo, descobre o que o trava e propõe os poucos movimentos que mais importam",
summary: "Olha o seu negócio inteiro e escolhe os poucos movimentos que valem o seu tempo",
about:
"Pergunta sobre a sua oferta, os seus clientes e os seus números, descobre uma ou duas coisas que travam o negócio e propõe até três movimentos, cada um com o custo, o tempo até dar para saber e o número que mostra que funcionou. Também diz o que deixar de lado.",
when: "Quando você sente que está travado, ou tem muitas ideias e nenhum jeito de escolher.",
pairs: "Analista de concorrência, para o mercado, e Analista financeiro, para os números.",
},
"go-to-market-planner": {
name: "Planejador de entrada no mercado",
role: "Planeja como levar um produto aos primeiros clientes: para quem é, a mensagem, os canais e os primeiros passos",
summary: "Planeja para quem vender, o que dizer e onde encontrá-los, com os primeiros passos",
about:
"Descreve o cliente com quem você deve começar, o que prometer a ele e por que você é diferente, compara duas ou três formas de chegar até ele e escreve as primeiras semanas, semana a semana, com o que medir. Não inventa números de mercado.",
when: "Quando um produto está pronto, ou quase, e você não sabe como conseguir os primeiros clientes.",
pairs:
"Analista de concorrência, para as alternativas, e Redator publicitário, para as palavras.",
},
"launch-planner": {
name: "Planejador de lançamento",
role: "Planeja o lançamento de um produto ou recurso: a lista, o cronograma, as mensagens e o dia em si",
summary: "Planeja um lançamento das semanas antes ao dia seguinte, com lista e cronograma",
about:
"Monta o plano de um lançamento: o que precisa estar pronto, um cronograma para o antes, o dia e o depois, as mensagens redigidas e os números que dizem se funcionou. Nada é publicado nem enviado por você.",
when: "Quando você tem uma data para lançar algo e não quer esquecer nada.",
pairs: "Redator publicitário, para as palavras finais, e Social media, para as postagens.",
},
"sop-writer": {
name: "Redator de procedimentos",
role: "Transforma o jeito de fazer uma tarefa num procedimento escrito e claro que qualquer pessoa da equipe consegue seguir",
summary: "Escreve procedimentos passo a passo para o trabalho não ficar só na sua cabeça",
about:
"Percorre uma tarefa com você e a escreve em passos curtos e numerados, com verificações e os erros comuns, para uma pessoa nova conseguir seguir no primeiro dia. Nunca escreve senhas nem dados privados num procedimento.",
when: "Quando algo que só você sabe fazer não para de cair na sua mesa.",
pairs:
"Analista de processos, para achar os passos fracos, e Redator técnico, para documentar software.",
},
"outreach-specialist": {
name: "Especialista em abordagem",
role: "Escreve primeiras mensagens pessoais e sequências de acompanhamento para e-mail e redes; nunca as envia",
summary:
"Escreve primeiras mensagens e acompanhamentos que as pessoas respondem, e não envia nada",
about:
"Escreve uma primeira mensagem curta, baseada num detalhe verdadeiro sobre a pessoa, e dois ou três acompanhamentos que acrescentam algo novo cada um. Nunca envia, nunca finge urgência nem intimidade e lembra você de que as leis sobre mensagens valem.",
when: "Quando você quer chegar a clientes, parceiros ou imprensa que ainda não conhecem você.",
pairs: "Pesquisador, para conhecer a pessoa, e Redator publicitário, para o tom.",
},
};
5 changes: 5 additions & 0 deletions app/src/i18n/pt-BR/crewTemplates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ export const crewTemplates: typeof en = {
summary: "Cria um jogo: as regras, a história, as fases, os números e os testes.",
goal: "Crie o meu jogo: dê forma às regras, escreva a história, planeje as fases, equilibre os números e aprenda com os testes. A equipe já está aqui, então passe o trabalho como tarefas.",
},
"business-review": {
name: "Avaliação do negócio",
summary: "Olha o seu negócio por todos os lados e diz o que fazer a seguir.",
goal: "Avalie o meu negócio e diga o que fazer a seguir: onde ele está travado, o que a concorrência faz, se os meus preços fazem sentido, como chegar aos clientes e o que os números dizem. A equipe já está aqui, então passe o trabalho como tarefas. Comece me perguntando sobre o negócio.",
},
"people-team": {
name: "Equipe de pessoas",
summary: "Contrata, acolhe, treina e ouve uma equipe, sem decidir por você.",
Expand Down
6 changes: 3 additions & 3 deletions app/src/lib/fakeCatalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import { FakeBotloft } from "./fake";
describe("the fake's agent catalog", () => {
it("lists the roles, by category too, and reads one with its instructions", async () => {
const fake = new FakeBotloft();
expect(await fake.call("catalog.list", {})).toHaveLength(129);
expect(await fake.call("catalog.list", {})).toHaveLength(134);
const product = await fake.call("catalog.list", { category: "product" });
expect(product).toHaveLength(14);
expect(await fake.call("catalog.list", { category: "marketing" })).toHaveLength(24);
expect(await fake.call("catalog.list", { category: "marketing" })).toHaveLength(27);
expect(await fake.call("catalog.list", { category: "design" })).toHaveLength(9);
expect(await fake.call("catalog.list", { category: "finance" })).toHaveLength(7);
expect(await fake.call("catalog.list", { category: "people" })).toHaveLength(7);
expect(await fake.call("catalog.list", { category: "security" })).toHaveLength(7);
expect(await fake.call("catalog.list", { category: "business" })).toHaveLength(10);
expect(await fake.call("catalog.list", { category: "business" })).toHaveLength(12);
expect(await fake.call("catalog.list", { category: "legal" })).toHaveLength(7);
expect(await fake.call("catalog.list", { category: "games" })).toHaveLength(7);
expect(await fake.call("catalog.list", { category: "health" })).toHaveLength(7);
Expand Down
5 changes: 5 additions & 0 deletions app/src/lib/fakeCatalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ const ROLES: [id: string, category: BotTemplateCategory, name: string, effort?:
["proposal-writer", "marketing", "Proposal Writer"],
["sales-coach", "marketing", "Sales Coach"],
["pricing-analyst", "marketing", "Pricing Analyst"],
["go-to-market-planner", "marketing", "Go-to-Market Planner"],
["launch-planner", "marketing", "Launch Planner"],
["outreach-specialist", "marketing", "Outreach Specialist"],
["strategy-advisor", "business", "Strategy Advisor", "high"],
["sop-writer", "business", "SOP Writer"],
["software-architect", "code", "Software Architect"],
["frontend-developer", "code", "Frontend Developer"],
["backend-developer", "code", "Backend Developer"],
Expand Down
Loading
Loading