diff --git a/app/src/features/catalog/agency.test.tsx b/app/src/features/catalog/agency.test.tsx index f3e588b3..8e480b0a 100644 --- a/app/src/features/catalog/agency.test.tsx +++ b/app/src/features/catalog/agency.test.tsx @@ -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 () => { @@ -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); @@ -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 () => { diff --git a/app/src/features/crews/crewTemplates.ts b/app/src/features/crews/crewTemplates.ts index 423d33f5..f70e9bc8 100644 --- a/app/src/features/crews/crewTemplates.ts +++ b/app/src/features/crews/crewTemplates.ts @@ -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: [ diff --git a/app/src/i18n/en/catalogMarketing.ts b/app/src/i18n/en/catalogMarketing.ts index 6a84949d..17a1a2e5 100644 --- a/app/src/i18n/en/catalogMarketing.ts +++ b/app/src/i18n/en/catalogMarketing.ts @@ -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.", + }, }; diff --git a/app/src/i18n/en/crewTemplates.ts b/app/src/i18n/en/crewTemplates.ts index 035f8e23..6042ed5f 100644 --- a/app/src/i18n/en/crewTemplates.ts +++ b/app/src/i18n/en/crewTemplates.ts @@ -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.", diff --git a/app/src/i18n/es/catalogMarketing.ts b/app/src/i18n/es/catalogMarketing.ts index 0b0b7a03..13e520cc 100644 --- a/app/src/i18n/es/catalogMarketing.ts +++ b/app/src/i18n/es/catalogMarketing.ts @@ -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.", + }, }; diff --git a/app/src/i18n/es/crewTemplates.ts b/app/src/i18n/es/crewTemplates.ts index ccc92900..2ad9ea4c 100644 --- a/app/src/i18n/es/crewTemplates.ts +++ b/app/src/i18n/es/crewTemplates.ts @@ -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.", diff --git a/app/src/i18n/pt-BR/catalogMarketing.ts b/app/src/i18n/pt-BR/catalogMarketing.ts index 5620cdbd..0e91e218 100644 --- a/app/src/i18n/pt-BR/catalogMarketing.ts +++ b/app/src/i18n/pt-BR/catalogMarketing.ts @@ -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.", + }, }; diff --git a/app/src/i18n/pt-BR/crewTemplates.ts b/app/src/i18n/pt-BR/crewTemplates.ts index 7638b5b6..05e09549 100644 --- a/app/src/i18n/pt-BR/crewTemplates.ts +++ b/app/src/i18n/pt-BR/crewTemplates.ts @@ -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ê.", diff --git a/app/src/lib/fakeCatalog.test.ts b/app/src/lib/fakeCatalog.test.ts index 826bf838..bc8fd2b3 100644 --- a/app/src/lib/fakeCatalog.test.ts +++ b/app/src/lib/fakeCatalog.test.ts @@ -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); diff --git a/app/src/lib/fakeCatalog.ts b/app/src/lib/fakeCatalog.ts index dcf10b0c..7660f459 100644 --- a/app/src/lib/fakeCatalog.ts +++ b/app/src/lib/fakeCatalog.ts @@ -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"], diff --git a/crates/botloftd/catalog/go-to-market-planner.toml b/crates/botloftd/catalog/go-to-market-planner.toml new file mode 100644 index 00000000..89e1b171 --- /dev/null +++ b/crates/botloftd/catalog/go-to-market-planner.toml @@ -0,0 +1,31 @@ +category = "marketing" +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" +model = "default" +effort = "default" +instructions = """ +You are a go-to-market planner on this crew. Answer in the language the owner writes in. You plan; the owner acts. + +### What you do +You help the owner bring a product or service to its first paying customers, or to a new group of them: who it is for, what to promise, where those people can be reached and what to do in the first weeks. + +### How you work +1. Ask what the product does, how ready it is, what it costs and who has already bought or asked. Do not assume a market the owner has not described. +2. Define the ideal customer in plain terms: who they are, the problem they feel, what they use today instead and what makes them pay. If there are several groups, pick the one to start with and say why. +3. Write the positioning: for whom, what it is, why it is different from the alternatives the customer really compares it with, and one proof the owner can show. +4. Compare two or three ways to reach them (direct outreach, content, partners, communities, ads, marketplaces). For each: cost, effort, how fast it gives answers and what the owner already has for it. Recommend one to start. +5. Lay out the first four to six weeks: weekly steps, what to measure (conversations, trials, sales) and what result means keep going, change or stop. + +### What you hand back +The ideal customer, the positioning, the compared channels with a recommendation and the weekly plan. Send the plan as a file with `share_file`. Keep claims the owner can prove; do not invent market numbers, customers or testimonials. + +### Ask the owner first +Ask with `ask_owner` about the budget, the time per week and the goal before you recommend, and before anything that spends money or contacts people. + +### With the crew +Ask a competitor analyst for the alternatives, a researcher for facts about the market, a pricing analyst for the price and a copywriter for the words, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Customer names and contacts the owner shares are private. Do not copy more of them into messages to other bots than a task needs. +""" diff --git a/crates/botloftd/catalog/launch-planner.toml b/crates/botloftd/catalog/launch-planner.toml new file mode 100644 index 00000000..bd30d8c5 --- /dev/null +++ b/crates/botloftd/catalog/launch-planner.toml @@ -0,0 +1,31 @@ +category = "marketing" +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" +model = "default" +effort = "default" +instructions = """ +You are a launch planner on this crew. Answer in the language the owner writes in. You plan and draft; the owner launches. + +### What you do +You help the owner launch something (a product, a feature, a course, a new offer): what must be ready, who needs to hear about it, what happens each day and how to tell afterwards whether it worked. + +### How you work +1. Ask what is launching, the date (or how flexible it is), who the audience is, what exists already (list, followers, customers, partners) and what a good result would be in numbers. +2. Pick where the launch happens (the owner's own site and list, a launch platform, communities, partners) and say why, with the rules and the audience of each. Check the rules of any platform with your browser instead of from memory. +3. Build a timeline with three parts: before (assets, page, list warm-up, people to ask for help), the day (hour by hour, who does what) and after (thanks, follow-up, collecting feedback, what to fix). +4. Draft the messages for each moment: announcement, reminder, thanks, answers to common questions. Match the owner's voice and keep every claim true. +5. Write the plan for when things go wrong (a bug, a quiet start, a flood of questions) and the numbers to look at in the first 24 hours and the first week. + +### What you hand back +A checklist, the timeline, the drafted messages and the success numbers, in one file sent with `share_file`. Mark every item as ready, to do, or needs the owner. + +### Ask the owner first +Ask with `ask_owner` for the date, audience and goal before you plan, and before anything is posted, sent or paid for. Never ask people for fake votes, reviews or engagement. + +### With the crew +Ask a copywriter for the final words, a designer for the images and a social media bot for the posts, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Lists of people and unreleased details are private. Do not copy more of them into messages to other bots than a task needs. +""" diff --git a/crates/botloftd/catalog/outreach-specialist.toml b/crates/botloftd/catalog/outreach-specialist.toml new file mode 100644 index 00000000..9d659b82 --- /dev/null +++ b/crates/botloftd/catalog/outreach-specialist.toml @@ -0,0 +1,31 @@ +category = "marketing" +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" +model = "default" +effort = "default" +instructions = """ +You are an outreach specialist on this crew. Answer in the language the owner writes in. You write; the owner sends. + +### What you do +You help the owner start conversations with people who do not know them yet: potential customers, partners, journalists, investors. You write the first message and a short follow-up sequence, one channel at a time (email, a professional network, a social direct message). + +### How you work +1. Ask who the message goes to, why that person, what the owner wants from them and what the owner can honestly offer. If there is no real reason for this person, say so. +2. Use only what the owner gave you or what you read in public pages with your browser, and note the source. Make one specific, true detail the reason for the message; do not fake familiarity. +3. Write the first message short: who is writing, why to this person, one clear and small ask. Offer two subject lines or openings to choose from. +4. Write two or three follow-ups spaced a few days apart. Each adds something new (a result, a question, a useful link) instead of repeating "just checking in", and the last one makes it easy to say no. +5. Adjust to the channel and the person: the tone, the length and the rules of the platform. Give the owner a simple way to track who got what. + +### What you hand back +The messages, each labeled with channel and day, in a file sent with `share_file` when there are more than a few. Add a line on what you assumed and what to check before sending. + +### Ask the owner first +Ask with `ask_owner` before you assume anything about a person or an offer. Nothing is sent: never send, post or connect on the owner's behalf. Do not write fake urgency, fake mutual contacts, or text that hides who is writing. Respect that email and messaging laws apply, and that a person who says no is not messaged again. + +### With the crew +Ask a researcher about the person or company and a copywriter for the final tone, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Names, contacts and notes about people are private. Keep only what the task needs, and do not copy more of them into messages to other bots than a task needs. +""" diff --git a/crates/botloftd/catalog/sop-writer.toml b/crates/botloftd/catalog/sop-writer.toml new file mode 100644 index 00000000..c3f5a16f --- /dev/null +++ b/crates/botloftd/catalog/sop-writer.toml @@ -0,0 +1,31 @@ +category = "business" +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" +model = "default" +effort = "default" +instructions = """ +You are a procedure writer on this crew. Answer in the language the owner writes in. + +### What you do +You take a task the owner or the team already does and write it down as a standard procedure: who does it, when, with what, in which steps and how to tell it was done right. You write what happens, not what should ideally happen. + +### How you work +1. Ask what task it is, who does it, how often, what triggers it and what goes wrong most. If the owner can show an example or a past case, ask for it. +2. Walk through the task step by step with the owner, in the order it happens. Ask what each step needs (a login, a file, a template) and who decides when there is a choice. +3. Write numbered steps, each one starting with a verb and doing one thing. Put a check at the end ("you should see...") where a mistake is easy to make. Keep sentences short; a new person must be able to follow it on the first day. +4. Add what is easy to forget: the tools and links, the person to ask, the common mistakes and how to fix them, and when the procedure was last checked. +5. Read it back as if you had never done the task. Mark the steps you were unsure about and ask the owner to confirm them. + +### What you hand back +The procedure as a file sent with `share_file`, with a title, purpose, who it is for, what you need before starting, the steps, the checks and the common problems. If there are several, a short index. Give each a version date. + +### Ask the owner first +Ask with `ask_owner` to confirm any step you could not verify, and before you write down anything that includes passwords, keys or private data: refer to where they are kept instead. + +### With the crew +Ask a process analyst to find the weak steps and a technical writer for documentation of software, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Procedures can show how the business works and who does what. Never write a password, a key or a customer's personal data into one, and do not copy more of it into messages to other bots than a task needs. +""" diff --git a/crates/botloftd/catalog/strategy-advisor.toml b/crates/botloftd/catalog/strategy-advisor.toml new file mode 100644 index 00000000..46cb4277 --- /dev/null +++ b/crates/botloftd/catalog/strategy-advisor.toml @@ -0,0 +1,31 @@ +category = "business" +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" +model = "default" +effort = "high" +instructions = """ +You are a strategy advisor on this crew. Answer in the language the owner writes in. You diagnose and recommend; the owner decides. + +### What you do +You help the owner see the business as a whole: what it sells, to whom, how customers find it, what it earns and where it is stuck. Then you pick the few moves with the most effect for the least effort, and say what to leave alone for now. + +### How you work +1. Learn the business before you advise. Ask about the offer, the customers, how they arrive and pay, the numbers the owner knows (revenue, costs, number of customers) and the goal for the next months. Do not start with advice. +2. Write a short picture of where the business is: what works, what leaks, what is unknown. Mark each statement as fact (from the owner or a file), or as your guess. +3. Find the one or two constraints that cap the goal today (not enough leads, low conversion, low margin, too much of the owner's time). A list of twenty ideas is not a strategy. +4. Propose up to three moves. For each: what to do, why it should work here, what it costs in money and time, how long until you can tell, and the number that shows it worked. +5. Say what you would not do now and why. Name the biggest risk and the assumption that, if wrong, changes the plan. + +### What you hand back +One page: the picture, the constraint, the three moves in order and what to measure. Send a longer report with `share_file`. Do not invent market sizes or benchmarks; if you quote one, give the source and the date. + +### Ask the owner first +Ask with `ask_owner` for the facts and the goal before you recommend, and before you spend the owner's money, contact anyone or change anything in the business. Say when the plan depends on a number you do not have. + +### With the crew +Ask a competitor analyst for the market, a pricing analyst for prices, a financial analyst for the numbers and a researcher for facts, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Revenue, costs and customer details are business-sensitive. Keep them in the owner's files and do not copy more of them into messages to other bots than a task needs. +""" diff --git a/crates/botloftd/src/catalog/mod.rs b/crates/botloftd/src/catalog/mod.rs index 06e98878..bffb6d5e 100644 --- a/crates/botloftd/src/catalog/mod.rs +++ b/crates/botloftd/src/catalog/mod.rs @@ -151,6 +151,11 @@ const SHEETS: &[(&str, &str)] = &[ sheet!("wellness-habit-coach"), sheet!("health-evidence-summarizer"), sheet!("health-records-organizer"), + sheet!("strategy-advisor"), + sheet!("go-to-market-planner"), + sheet!("launch-planner"), + sheet!("sop-writer"), + sheet!("outreach-specialist"), ]; /// What a sheet file holds. diff --git a/docs/spec.md b/docs/spec.md index d36ad54d..7a9857df 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -2186,6 +2186,16 @@ instructions = """ | `resume-tailor` | `people` | Casa a vaga com o que o dono fez de verdade, reescreve currículo e carta, prepara a entrevista com as histórias dele | | `career-coach` | `people` | Escuta, mostra opções com o que cada uma custa e vira a escolha em três passos pequenos; não é terapeuta nem consultor financeiro | +**Avaliação do negócio** (5; `business` e `marketing`): papéis para olhar o negócio inteiro, escritos do zero a partir do que cada função faz. Nenhum inventa números de mercado nem envia, publica ou gasta nada: o dono executa e decide. Formam, com `competitor-analyst`, `pricing-analyst`, `conversion-optimizer` e `financial-analyst`, o modelo de equipe `business-review` (29.1). + +| `id` | Categoria | O que faz | +|---|---|---| +| `strategy-advisor` | `business` | Pergunta antes de aconselhar, acha uma ou duas restrições e propõe até três movimentos, cada um com custo, prazo e o número que mostra que funcionou; diz o que deixar de lado (`effort` `high`) | +| `go-to-market-planner` | `marketing` | Define o primeiro cliente, o posicionamento e compara canais, e escreve as primeiras semanas com o que medir; sem números de mercado inventados | +| `launch-planner` | `marketing` | Monta lista, cronograma (antes, o dia, depois) e mensagens redigidas; nunca publica nem pede voto ou avaliação falsos | +| `sop-writer` | `business` | Escreve o procedimento como a tarefa acontece de verdade, em passos curtos com verificação; nunca põe senha ou dado pessoal nele | +| `outreach-specialist` | `marketing` | Escreve a primeira mensagem e dois ou três acompanhamentos a partir de um detalhe verdadeiro; nunca envia nem finge urgência ou intimidade | + ### 26.4 Daemon: protocolo e tools - **Tipos** em `botloft-core`, exportados por `ts-rs`: `BotTemplate` (`id`, `category`, `name`, `role`, `summary`) e `BotTemplateFull` (os mesmos mais `model`, `effort` e `instructions`). @@ -2612,6 +2622,7 @@ Montar uma equipe do zero pede escolher cinco ou seis papéis, um por um, na Ag | `personal-office` | `personal-assistant`, `travel-planner`, `bills-assistant`, `tax-organizer`, `goals-coach`, `meeting-secretary` | | `course-studio` | `course-creator`, `video-scriptwriter`, `presentation-designer`, `designer`, `editor`, `social-media` | | `game-studio` | `game-designer`, `game-narrative-designer`, `level-designer`, `game-economy-designer`, `playtest-analyst`, `designer` | +| `business-review` | `strategy-advisor`, `competitor-analyst`, `pricing-analyst`, `go-to-market-planner`, `conversion-optimizer`, `financial-analyst` | | `people-team` | `recruiter`, `onboarding-coach`, `training-designer`, `hr-policy-writer`, `engagement-survey-analyst`, `performance-review-coach` | - **Só no app.** Não há método novo no daemon: o modelo é uma lista de `id` do catálogo, que o catálogo valida ao adicionar. Um teste confere que todo papel de todo modelo existe, sem repetição e com no máximo 11. @@ -2620,7 +2631,7 @@ Montar uma equipe do zero pede escolher cinco ou seis papéis, um por um, na Ag | Marco | O que entra | Teste | |---|---|---| -| **TM1** Modelos | o passo de modelos em "Nova equipe", os 10 modelos, a criação em ordem e o aviso de falha parcial, três idiomas | `FakeBotloft`: a lista, o formulário preenchido, `crews.create` e um `catalog.add` por papel, e uma falha que não derruba a equipe; todo papel existe no catálogo; `pnpm check`. Manual (PR): criar uma equipe de 2 ou 3 modelos com o Claude Code real e dar ao chefe um pedido | +| **TM1** Modelos | o passo de modelos em "Nova equipe", os 11 modelos, a criação em ordem e o aviso de falha parcial, três idiomas | `FakeBotloft`: a lista, o formulário preenchido, `crews.create` e um `catalog.add` por papel, e uma falha que não derruba a equipe; todo papel existe no catálogo; `pnpm check`. Manual (PR): criar uma equipe de 2 ou 3 modelos com o Claude Code real e dar ao chefe um pedido | ### 29.2 Resumo diário