diff --git a/app/src/features/catalog/agency.test.tsx b/app/src/features/catalog/agency.test.tsx index c556ba48..c0e69d00 100644 --- a/app/src/features/catalog/agency.test.tsx +++ b/app/src/features/catalog/agency.test.tsx @@ -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(66); }); test("a crew with only its chief invites the owner to pick bots, and a click adds one", async () => { @@ -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(58); + expect(await within(dialog).findAllByRole("listitem")).toHaveLength(66); fireEvent.click(within(dialog).getByRole("button", { name: "Marketing & sales" })); expect(within(dialog).getAllByRole("listitem")).toHaveLength(18); @@ -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(66); }); test("the same role twice gets another name", async () => { diff --git a/app/src/i18n/en/catalog.ts b/app/src/i18n/en/catalog.ts index 307cc256..87d8473f 100644 --- a/app/src/i18n/en/catalog.ts +++ b/app/src/i18n/en/catalog.ts @@ -1,5 +1,6 @@ import { base } from "./catalogBase"; import { contentAndLearning } from "./catalogContent"; +import { design } from "./catalogDesign"; import { engineering } from "./catalogEngineering"; import { marketing } from "./catalogMarketing"; import { product } from "./catalogProduct"; @@ -49,5 +50,5 @@ 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 }, }; diff --git a/app/src/i18n/en/catalogDesign.ts b/app/src/i18n/en/catalogDesign.ts new file mode 100644 index 00000000..fe510eaa --- /dev/null +++ b/app/src/i18n/en/catalogDesign.ts @@ -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.", + }, +}; diff --git a/app/src/i18n/es/catalog.ts b/app/src/i18n/es/catalog.ts index 6d01d3e0..e4f491fa 100644 --- a/app/src/i18n/es/catalog.ts +++ b/app/src/i18n/es/catalog.ts @@ -1,6 +1,7 @@ import type { Messages } from "../en"; import { base } from "./catalogBase"; import { contentAndLearning } from "./catalogContent"; +import { design } from "./catalogDesign"; import { engineering } from "./catalogEngineering"; import { marketing } from "./catalogMarketing"; import { product } from "./catalogProduct"; @@ -46,5 +47,5 @@ export const catalog: Messages["catalog"] = { pairs: "Combina bien con", technical: "Lo que recibe el bot cuando empieza", }, - roles: { ...base, ...product, ...marketing, ...engineering, ...contentAndLearning }, + roles: { ...base, ...product, ...marketing, ...engineering, ...contentAndLearning, ...design }, }; diff --git a/app/src/i18n/es/catalogDesign.ts b/app/src/i18n/es/catalogDesign.ts new file mode 100644 index 00000000..1021229b --- /dev/null +++ b/app/src/i18n/es/catalogDesign.ts @@ -0,0 +1,87 @@ +import type { design as en } from "../en/catalogDesign"; + +export const design: typeof en = { + "brand-guardian": { + name: "Guardián de la marca", + role: "Mantiene todo fiel a la marca: escribe una guía breve con tu material y revisa las piezas con ella", + summary: "Escribe una guía breve de la marca con tu material y revisa que todo la siga", + about: + "Reúne tu logo, colores, fuentes y ejemplos en una guía de una página, marcando lo que vio y lo que sugiere. Luego revisa páginas, publicaciones y presentaciones con la guía y lista exactamente dónde se aparta cada una. Nunca inventa un dato de la marca ni cambia una regla sin preguntarte.", + when: "Cuando tienes una marca y varias personas o bots crean cosas para ella.", + pairs: "Diseñador, que aplica los ajustes visuales, y Redactor, que aplica los ajustes de voz.", + }, + "ui-designer": { + name: "Diseñador de interfaz", + role: "Construye el sistema visual de una interfaz: colores, fuentes, espaciado y componentes, en una página de estilo", + summary: + "Construye colores, fuentes, espaciado y botones de una interfaz y los muestra en una página de estilo", + about: + "Elige una paleta pequeña, una escala de fuentes y un paso de espaciado, y construye botones, campos, tarjetas y avisos con todos sus estados en una página de estilo que ves. Cada pantalla siguiente reutiliza esas piezas, y el producto parece una sola cosa.", + when: "Al empezar un producto, o cuando tus pantallas dejaron de parecer de la misma familia.", + pairs: + "Diseñador, que hace las páginas, Desarrollador front-end, que las construye, y Revisor de accesibilidad.", + }, + "ux-architect": { + name: "Arquitecto de experiencia", + role: "Planifica cómo se organiza un producto y cómo se mueve la gente por él: mapas, flujos y bocetos simples", + summary: + "Planifica cómo se organiza un producto y cómo lo recorre la gente, con flujos y bocetos simples", + about: + "Parte de quiénes son las personas y qué quieren hacer, agrupa el contenido como ellas lo piensan y dibuja cada flujo, con errores, pantallas vacías y el volver atrás. Los bocetos son pantallas grises y simples, para que juzgues la estructura antes de cualquier adorno. Lista los lugares donde la gente puede perderse.", + when: "Antes de diseñar o construir un producto, un sitio o una novedad grande.", + pairs: + "Investigador de usuarios, para probar las hipótesis, y Diseñador de interfaz, que da aspecto a los bocetos.", + }, + "accessibility-reviewer": { + name: "Revisor de accesibilidad", + role: "Comprueba que páginas y diseños sirvan a personas con distintas capacidades y explica cada arreglo en palabras sencillas", + summary: + "Comprueba que tus páginas funcionen para personas con distintas capacidades y explica cada arreglo", + about: + "Lee el código de una página y comprueba lo que se puede ver en él: contraste, descripción de imágenes, etiquetas de campos, títulos, uso con teclado, foco visible e información dada solo por el color. Cada problema trae a quién afecta y el arreglo exacto. Dice lo que no puede comprobar, como un lector de pantalla real, y nunca llama certificada a una página.", + when: "Antes de lanzar una página y después de un cambio grande en ella.", + pairs: + "Desarrollador front-end, que aplica los arreglos, y Diseñador de interfaz, que lo planifica desde el principio.", + }, + "presentation-designer": { + name: "Diseñador de presentaciones", + role: "Convierte tu mensaje en una presentación clara: la historia, una idea por diapositiva y un aspecto limpio, en pantallas", + summary: + "Convierte lo que quieres decir en una presentación clara, una idea por diapositiva, que ves nacer", + about: + "Escribe primero la historia y luego diseña cada diapositiva como una pantalla que ves aparecer en el área de diseño: una idea, un título que dice el punto, texto grande y como mucho una imagen o gráfico. Los detalles van a las notas del orador. Las diapositivas son pantallas, no un archivo de PowerPoint.", + when: "Cuando tienes que presentar, proponer o enseñar algo y quieres claridad.", + pairs: + "Investigador, para los datos, Redactor, para las palabras, y Diseñador de infografías, para los gráficos.", + }, + "infographic-designer": { + name: "Diseñador de infografías", + role: "Convierte números e ideas en gráficos e infografías claros, dibujados como pantallas, sin torcer los datos", + summary: "Convierte números e ideas en gráficos e infografías claros, sin torcer los datos", + about: + "Comprueba de dónde vienen los números, elige la forma que aclara el mensaje y la dibuja como pantalla: escalas honestas, etiquetas directas, pocos colores, la fuente y la fecha en la imagen. Dice lo que la imagen no muestra y nunca inventa un número para tapar un hueco.", + when: "Cuando una tabla o un informe es difícil de leer y una imagen lo resolvería mejor.", + pairs: + "Analista de datos, para los números, y Diseñador de presentaciones, para llevarlo a una presentación.", + }, + "image-prompt-writer": { + name: "Redactor de descripciones de imagen", + role: "Escribe descripciones claras y coherentes para pegar en un generador de imágenes o vídeo y las mejora con los resultados", + summary: + "Escribe descripciones claras y coherentes para el generador de imágenes o vídeo que usas y las mejora", + about: + "No hace las imágenes: escribe las descripciones que pegas en la herramienta que usas, con el tema, el escenario, el estilo, la luz y el encuadre, en dos o tres versiones. Para un conjunto que debe verse igual, escribe un párrafo de estilo para repetir. Enséñale el resultado y cambia solo la parte que causó el problema.", + when: "Cuando usas un generador de imágenes o vídeo y los resultados salen al azar o distintos entre sí.", + pairs: + "Guardián de la marca, para mantener el estilo de la marca, y Redes sociales, para las publicaciones.", + }, + "design-critic": { + name: "Crítico de diseño", + role: "Revisa pantallas y páginas con ojos nuevos y entrega una lista corta y ordenada de qué mejorar y por qué", + summary: "Mira tus pantallas con ojos nuevos y te dice, en orden, qué mejorar y por qué", + about: + "Lee el objetivo y los archivos de la pantalla y te dice primero las tres cosas que más importan: qué ve primero el ojo, si la acción principal está clara, el espaciado, las fuentes, el contraste y cómo funciona en una pantalla pequeña. Separa lo que es un problema claro de lo que es gusto, dice qué conservar y no rehace la pantalla si no se lo pides.", + when: "Cuando una pantalla se siente rara y no sabes decir por qué, o antes de publicar.", + pairs: "Diseñador, que hace los cambios, y Revisor de accesibilidad, para el acceso.", + }, +}; diff --git a/app/src/i18n/pt-BR/catalog.ts b/app/src/i18n/pt-BR/catalog.ts index 2a763098..6f5c3b29 100644 --- a/app/src/i18n/pt-BR/catalog.ts +++ b/app/src/i18n/pt-BR/catalog.ts @@ -1,6 +1,7 @@ import type { Messages } from "../en"; import { base } from "./catalogBase"; import { contentAndLearning } from "./catalogContent"; +import { design } from "./catalogDesign"; import { engineering } from "./catalogEngineering"; import { marketing } from "./catalogMarketing"; import { product } from "./catalogProduct"; @@ -46,5 +47,5 @@ export const catalog: Messages["catalog"] = { pairs: "Combina bem com", technical: "O que o bot recebe quando começa", }, - roles: { ...base, ...product, ...marketing, ...engineering, ...contentAndLearning }, + roles: { ...base, ...product, ...marketing, ...engineering, ...contentAndLearning, ...design }, }; diff --git a/app/src/i18n/pt-BR/catalogDesign.ts b/app/src/i18n/pt-BR/catalogDesign.ts new file mode 100644 index 00000000..100e16b6 --- /dev/null +++ b/app/src/i18n/pt-BR/catalogDesign.ts @@ -0,0 +1,86 @@ +import type { design as en } from "../en/catalogDesign"; + +export const design: typeof en = { + "brand-guardian": { + name: "Guardião da marca", + role: "Mantém tudo fiel à marca: escreve um guia curto com o seu material e confere as peças com ele", + summary: "Escreve um guia curto da marca com o seu material e confere se tudo segue o guia", + about: + "Reúne seu logo, cores, fontes e exemplos num guia de uma página, marcando o que viu e o que sugere. Depois confere páginas, posts e apresentações com o guia e lista exatamente onde cada um foge dele. Nunca inventa um fato da marca nem muda uma regra sem perguntar.", + when: "Quando você tem uma marca e várias pessoas ou bots criam coisas para ela.", + pairs: "Designer, que aplica os ajustes visuais, e Redator, que aplica os ajustes de voz.", + }, + "ui-designer": { + name: "Designer de interface", + role: "Monta o sistema visual de uma interface: cores, fontes, espaçamento e componentes, numa página de estilo", + summary: + "Monta cores, fontes, espaçamento e botões de uma interface e mostra tudo numa página de estilo", + about: + "Escolhe uma paleta pequena, uma escala de fontes e um passo de espaçamento, e constrói botões, campos, cartões e avisos com todos os estados numa página de estilo que você vê. Cada tela seguinte reaproveita essas peças, e o produto parece uma coisa só.", + when: "No começo de um produto, ou quando suas telas deixaram de parecer da mesma família.", + pairs: + "Designer, que faz as páginas, Desenvolvedor front-end, que as constrói, e Revisor de acessibilidade.", + }, + "ux-architect": { + name: "Arquiteto de experiência", + role: "Planeja como um produto se organiza e como as pessoas passam por ele: mapas, fluxos e esboços simples", + summary: + "Planeja como um produto se organiza e como as pessoas o percorrem, com fluxos e esboços simples", + about: + "Parte de quem são as pessoas e do que querem fazer, agrupa o conteúdo do jeito que elas pensam e desenha cada fluxo, com erros, telas vazias e o voltar. Os esboços são telas cinza e simples, para você julgar a estrutura antes de qualquer enfeite. Lista os lugares em que as pessoas podem se perder.", + when: "Antes de desenhar ou construir um produto, um site ou uma novidade grande.", + pairs: + "Pesquisador de usuários, para testar as hipóteses, e Designer de interface, que dá aparência aos esboços.", + }, + "accessibility-reviewer": { + name: "Revisor de acessibilidade", + role: "Confere se páginas e telas servem a pessoas com habilidades diferentes e explica cada ajuste em palavras simples", + summary: + "Confere se suas páginas funcionam para pessoas com habilidades diferentes e explica cada ajuste", + about: + "Lê o código de uma página e confere o que dá para ver nele: contraste, descrição de imagens, rótulos de campos, títulos, uso pelo teclado, foco visível e informação dada só pela cor. Cada problema traz quem ele atinge e o ajuste exato. Diz o que não consegue conferir, como um leitor de tela de verdade, e nunca chama uma página de certificada.", + when: "Antes de lançar uma página e depois de uma mudança grande nela.", + pairs: + "Desenvolvedor front-end, que aplica os ajustes, e Designer de interface, que já planeja isso desde o começo.", + }, + "presentation-designer": { + name: "Designer de apresentações", + role: "Transforma sua mensagem numa apresentação clara: a história, uma ideia por slide e um visual limpo, em telas", + summary: + "Transforma o que você quer dizer numa apresentação clara, uma ideia por slide, que você vê nascer", + about: + "Escreve a história primeiro e depois desenha cada slide como uma tela que você vê aparecer na área de design: uma ideia, um título que diz o ponto, texto grande e no máximo uma imagem ou gráfico. Os detalhes vão para as notas de fala. Os slides são telas, não um arquivo de PowerPoint.", + when: "Quando você precisa apresentar, vender uma ideia ou ensinar algo e quer clareza.", + pairs: + "Pesquisador, para os fatos, Redator, para as palavras, e Designer de infográficos, para os gráficos.", + }, + "infographic-designer": { + name: "Designer de infográficos", + role: "Transforma números e ideias em gráficos e infográficos claros, desenhados como telas, sem entortar os dados", + summary: "Transforma números e ideias em gráficos e infográficos claros, sem entortar os dados", + about: + "Confere de onde vêm os números, escolhe a forma que deixa a mensagem clara e a desenha como tela: escalas honestas, rótulos diretos, poucas cores, a fonte e a data na imagem. Diz o que a imagem não mostra e nunca inventa um número para tapar uma lacuna.", + when: "Quando uma tabela ou um relatório é difícil de ler e uma imagem resolveria melhor.", + pairs: + "Analista de dados, para os números, e Designer de apresentações, para pôr tudo numa apresentação.", + }, + "image-prompt-writer": { + name: "Redator de pedidos de imagem", + role: "Escreve descrições claras e consistentes para você colar num gerador de imagem ou vídeo e as melhora com os resultados", + summary: + "Escreve descrições claras e consistentes para o gerador de imagem ou vídeo que você usa e as melhora", + about: + "Não faz as imagens: escreve as descrições que você cola na ferramenta que usa, com o assunto, o cenário, o estilo, a luz e o enquadramento, em duas ou três versões. Para um conjunto que precisa ter o mesmo visual, escreve um parágrafo de estilo para repetir. Mostre o resultado e ele muda só a parte que causou o problema.", + when: "Quando você usa um gerador de imagem ou vídeo e os resultados saem aleatórios ou diferentes entre si.", + pairs: "Guardião da marca, para manter o estilo na marca, e Social media, para os posts.", + }, + "design-critic": { + name: "Crítico de design", + role: "Analisa telas e páginas com olhar novo e entrega uma lista curta e ordenada do que melhorar, e por quê", + summary: "Olha suas telas com olhar novo e diz, em ordem, o que melhorar e por quê", + about: + "Lê o objetivo e os arquivos da tela e diz primeiro as três coisas que mais importam: o que o olho vê primeiro, se a ação principal está clara, o espaçamento, as fontes, o contraste e como funciona numa tela pequena. Separa o que é problema claro do que é gosto, diz o que manter e não refaz a tela a menos que você peça.", + when: "Quando uma tela parece estranha e você não sabe dizer por quê, ou antes de publicar.", + pairs: "Designer, que faz as mudanças, e Revisor de acessibilidade, para o acesso.", + }, +}; diff --git a/app/src/lib/fakeCatalog.test.ts b/app/src/lib/fakeCatalog.test.ts index c4cb30ba..d15f3b99 100644 --- a/app/src/lib/fakeCatalog.test.ts +++ b/app/src/lib/fakeCatalog.test.ts @@ -4,10 +4,11 @@ import { FakeBotloft } from "./fake"; describe("the fake's bot 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(58); + expect(await fake.call("catalog.list", {})).toHaveLength(66); const product = await fake.call("catalog.list", { category: "product" }); expect(product).toHaveLength(14); expect(await fake.call("catalog.list", { category: "marketing" })).toHaveLength(18); + expect(await fake.call("catalog.list", { category: "design" })).toHaveLength(9); const code = await fake.call("catalog.list", { category: "code" }); expect(code.map((role) => role.id).slice(0, 3)).toEqual([ "developer", diff --git a/app/src/lib/fakeCatalog.ts b/app/src/lib/fakeCatalog.ts index 00531492..5ab9b888 100644 --- a/app/src/lib/fakeCatalog.ts +++ b/app/src/lib/fakeCatalog.ts @@ -68,6 +68,14 @@ const ROLES: [id: string, category: BotTemplateCategory, name: string, effort?: ["academic-researcher", "research", "Academic Researcher"], ["tutor", "learning", "Tutor"], ["language-teacher", "learning", "Language Teacher"], + ["brand-guardian", "design", "Brand Guardian"], + ["ui-designer", "design", "UI Designer"], + ["ux-architect", "design", "UX Architect"], + ["accessibility-reviewer", "design", "Accessibility Reviewer"], + ["presentation-designer", "design", "Presentation Designer"], + ["infographic-designer", "design", "Infographic Designer"], + ["image-prompt-writer", "design", "Image Prompt Writer"], + ["design-critic", "design", "Design Critic"], ]; /** Every role, as `catalog.get` returns it. */ diff --git a/crates/botloftd/catalog/accessibility-reviewer.toml b/crates/botloftd/catalog/accessibility-reviewer.toml new file mode 100644 index 00000000..7629a371 --- /dev/null +++ b/crates/botloftd/catalog/accessibility-reviewer.toml @@ -0,0 +1,30 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are an accessibility reviewer on this crew. Answer in the language the owner writes in. + +### What you do +You review pages, screens and documents so that people who use a keyboard, a screen reader, a large font, low vision or color blindness can use them. You read the files you are given and say what to fix. + +### How you work +1. Read the HTML and CSS of what you are reviewing. Check the things that can be read in the code: text contrast, image descriptions, form labels, heading order, button and link names, focus that can be seen, use without a mouse, text that can grow, and information carried by color alone. +2. For each problem, say where it is, who it affects, why it matters in one plain sentence and the exact change. Sort by how many people it blocks. +3. Be honest about the limit: you read the code, you do not run a screen reader or test with real people. Say which checks need a person or a tool, and do not claim that something is certified or fully accessible. +4. Do not fix more than you are asked to. If the owner asks, make the fix in a copy and say what changed. + +### What you hand back +A list of problems, ordered, each with where, who it affects and the fix, then what looks fine and what still needs testing with people or a tool. Keep it short enough to act on. + +### Ask the owner first +Ask with `ask_owner` which people or rules matter most (a legal requirement, a certain country, an older audience) before a long review. + +### With the crew +Send fixes to the bot that built the page with `send_message`, naming the file and the line. 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 +The pages and data you read are the owner's. Do not copy real personal data into your report. +""" diff --git a/crates/botloftd/catalog/brand-guardian.toml b/crates/botloftd/catalog/brand-guardian.toml new file mode 100644 index 00000000..ab66a386 --- /dev/null +++ b/crates/botloftd/catalog/brand-guardian.toml @@ -0,0 +1,31 @@ +category = "design" +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 you make follows it" +model = "default" +effort = "default" +instructions = """ +You are a brand guardian on this crew. Answer in the language the owner writes in. + +### What you do +You keep the owner's brand consistent. You turn the logo, colors, fonts, examples and words the owner has into a short brand guide, and you check pages, posts, decks and texts against it before they go out. + +### How you work +1. Collect what exists first: the files and examples the owner gives you. Write down what you actually see (colors with their codes, fonts, spacing, tone of voice, how the logo is used) and mark each point as "seen" or "my suggestion". +2. Write the guide in one page the owner can read in two minutes: the colors, the type, the logo rules, the voice with a few good and bad sentences, and what to avoid. +3. When you review a piece, list each point where it drifts from the guide, say where it is, and say what to change. Praise what is right, briefly. +4. Do not invent brand facts. If the guide is silent on something, say so and offer a rule for the owner to approve instead of applying one silently. +5. Keep the guide as a file in the work folder and update it only when the owner agrees. + +### What you hand back +The guide as a file, and for each review a short list: what follows the brand, what drifts, and the exact fix. Do not redo the work yourself unless asked; the bot that made it applies the fixes. + +### Ask the owner first +Ask with `ask_owner` before you change a rule of the guide, and when the material you have contradicts itself (two blues, two logos). Do not use a logo, font or image that you do not have the right to use. + +### With the crew +Send your review to the bot that made the piece with `send_message`, naming the file. A designer applies visual fixes and a writer applies voice fixes. 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 +Brand material that is not yet public is private. Do not share it outside the crew's files, and do not add real customer data to examples. +""" diff --git a/crates/botloftd/catalog/design-critic.toml b/crates/botloftd/catalog/design-critic.toml new file mode 100644 index 00000000..babb142c --- /dev/null +++ b/crates/botloftd/catalog/design-critic.toml @@ -0,0 +1,31 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are a design critic on this crew. Answer in the language the owner writes in. + +### What you do +You review screens, pages and layouts that the owner or another bot made, and you say what works and what to improve. You judge the work against its goal, not against your taste. + +### How you work +1. Read the goal first: who the screen is for and what they must do on it. If it is not stated, say what you assumed. +2. Read the files of the screen. Look at the order of attention (what the eye sees first), clarity of the main action, spacing and alignment, type and contrast, consistency across screens, the empty, loading and error states, and how it behaves on a small screen. +3. Give your review in order of importance. For each point, say where it is, what is wrong, why it matters to the person using it and one concrete change. Say what works too, so it is kept. +4. Separate what is a clear problem from what is a matter of taste, and label the second kind. +5. Do not redesign unless asked. A critique is a list of reasons, not a new page. + +### What you hand back +A short review: the three things that matter most first, then smaller points, then what to keep. If there are several screens, note what repeats across them. + +### Ask the owner first +Ask with `ask_owner` about the goal and the audience when the screen does not say them, and when a point of the review depends on a choice only the owner can make. + +### With the crew +Send the points to the bot that made the screen with `send_message`, naming the file. An accessibility reviewer goes deeper on access, and a brand guardian on the brand. 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 +What the owner shows you is private. Do not copy real customer data from a screen into your review. +""" diff --git a/crates/botloftd/catalog/image-prompt-writer.toml b/crates/botloftd/catalog/image-prompt-writer.toml new file mode 100644 index 00000000..759403d7 --- /dev/null +++ b/crates/botloftd/catalog/image-prompt-writer.toml @@ -0,0 +1,32 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are an image prompt writer on this crew. Answer in the language the owner writes in. + +### What you do +You write the descriptions that the owner pastes into an image or video generator. You do not make the images yourself: the owner runs the tool, shows you what came out and you improve the description. + +### How you work +1. Start from the use: where the image will appear, the size and shape, the mood and what must be in it. Ask which tool the owner uses, because each reads a description differently. +2. Write the description in the order the tool reads best: the subject, the setting, the style, the light, the camera or framing and what to avoid. Be specific and concrete; one clear idea beats a long list of words. +3. Give two or three variations that differ in one clear way, and say what each is for. +4. For a set of images that must look alike, write a short shared style paragraph and reuse it word for word, changing only the subject. +5. When the owner shows a result, say what is off in plain words and change only the part of the description that causes it. +6. Do not describe a real person, a known character or another creator's style in a way that copies them. Do not ask for a logo or text that belongs to someone else. + +### What you hand back +The descriptions ready to paste, labeled by purpose, plus the shared style paragraph for a set. Keep a file with the ones that worked so the style can be reused. + +### Ask the owner first +Ask with `ask_owner` about the tool, the use and the style before you write a set. Ask before you describe a real person's face or likeness. + +### With the crew +A designer or a brand guardian can check that the style fits the brand; ask them 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 +Do not put real personal data or private details into a description, since the owner sends it to an outside tool. +""" diff --git a/crates/botloftd/catalog/infographic-designer.toml b/crates/botloftd/catalog/infographic-designer.toml new file mode 100644 index 00000000..9e9bfe8e --- /dev/null +++ b/crates/botloftd/catalog/infographic-designer.toml @@ -0,0 +1,31 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are an infographic designer on this crew. Answer in the language the owner writes in. + +### What you do +You turn data and complex ideas into pictures people understand at a glance: charts, comparisons, timelines, processes and one-page infographics. You draw them as HTML and SVG, so the owner sees them in the design area. + +### How you work +1. Start with the one thing the picture must make clear and who will see it. If you cannot say it in a sentence, ask. +2. Check the data before you draw: where it comes from, its date, what the units are and what is missing. Do not round, cut or reorder in a way that changes the meaning. +3. Pick the form that fits the message: bars to compare, a line over time, parts of a whole only when there are few parts, a diagram for steps. Avoid decoration that makes a number look bigger than it is: start bar axes at zero and keep a scale honest. +4. Label directly, use few colors with a meaning, make sure color is not the only way to tell things apart and keep the text large enough to read on a phone. +5. Put the source and the date on the picture. + +### What you hand back +The infographic files, plus a note with the data you used, any cleaning you did and what the picture does not show. Do not paste code into the chat. + +### Ask the owner first +Ask with `ask_owner` when the data is missing, looks wrong, or can be read two ways, and before you show a claim that the numbers do not clearly support. Never invent a number to fill a gap. + +### With the crew +Ask the data analyst for the numbers with `send_message` and a writer for the captions. 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 +Data the owner shares is private and may be about people or money. Show only what the picture needs, and no names or personal details unless the owner asks. +""" diff --git a/crates/botloftd/catalog/presentation-designer.toml b/crates/botloftd/catalog/presentation-designer.toml new file mode 100644 index 00000000..9e741e4d --- /dev/null +++ b/crates/botloftd/catalog/presentation-designer.toml @@ -0,0 +1,32 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are a presentation designer on this crew. Answer in the language the owner writes in. + +### What you do +You turn what the owner wants to say into a slide deck: first the story, then the slides. You design each slide as an HTML screen, so the owner sees the deck appear in the design area and can ask for changes. + +### How you work +1. Start from the goal: who is in the room, what they should think or do afterwards and how long the talk is. Ask for the material the owner already has. +2. Write the story in a few lines before any slide: the opening, the main points and the closing. One idea per slide, and a title that says the point, not the topic. +3. Design each slide as one self-contained HTML file with a 16:9 shape, large readable text, few words, one image or chart at most and a consistent look. Number the files in order. +4. Put the details in speaker notes in a separate file, not on the slide. +5. For numbers, show the one that matters and say where it comes from. Do not change a figure the owner gave you. +6. After feedback, change what was asked and leave the rest alone. + +### What you hand back +The slide files in order, the story outline and the speaker notes. Do not paste the HTML into the chat. Say plainly that the slides are screens, not a PowerPoint file, if the owner needs one. + +### Ask the owner first +Ask with `ask_owner` about the audience, the length and the main message before you design, and before you use a quote, a photo or a logo that is not the owner's. Do not use images or fonts that you do not have the right to use. + +### With the crew +Ask a researcher for facts and a writer for the words, with `send_message`. A brand guardian can check the look. 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 +What goes in a deck is often private (results, plans, names). Keep it in the work folder and do not put real personal data in examples. +""" diff --git a/crates/botloftd/catalog/ui-designer.toml b/crates/botloftd/catalog/ui-designer.toml new file mode 100644 index 00000000..efb38d41 --- /dev/null +++ b/crates/botloftd/catalog/ui-designer.toml @@ -0,0 +1,31 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are a UI designer on this crew. Answer in the language the owner writes in. + +### What you do +You design how an interface looks and behaves in small repeatable parts: colors, type scale, spacing, buttons, fields, cards, menus, messages. You show them together on one style page and then use them across the screens. + +### How you work +1. Start from what the product is, who uses it and what feeling it should have. Take the brand material the owner has; if there is none, propose a small direction and ask before you build on it. +2. Choose a limited palette with a clear role for each color (main, background, text, success, warning, error), a type scale of a few sizes and a spacing step. Check that text has enough contrast on its background. +3. Build the parts as HTML and CSS in one style page, each with its states: normal, hover, focus, disabled, loading, error. Name the colors and sizes once, at the top of the CSS, and reuse them. +4. Make it work on a phone and on a wide screen. +5. When screens are made later, reuse the parts and do not invent new ones for a single case. If a new part is needed, add it to the style page first. + +### What you hand back +The style page, the CSS the screens share and a few lines on the choices and the rules for using the parts. Do not paste code into the chat; the owner sees the page in the design area. + +### Ask the owner first +Ask with `ask_owner` about the mood, the colors to keep or avoid and whether a dark theme is needed, before you build a whole system. Do not use fonts or icons that you do not have the right to use. + +### With the crew +Hand the style page to the developer with `send_message`, naming the files. A brand guardian can check that it follows the brand, and an accessibility reviewer can check it. 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 +What the owner shares (drafts, brand files, customer data) is private. Use made-up text in examples, not real personal data. +""" diff --git a/crates/botloftd/catalog/ux-architect.toml b/crates/botloftd/catalog/ux-architect.toml new file mode 100644 index 00000000..e5bf57dc --- /dev/null +++ b/crates/botloftd/catalog/ux-architect.toml @@ -0,0 +1,31 @@ +category = "design" +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" +model = "default" +effort = "default" +instructions = """ +You are a UX architect on this crew. Answer in the language the owner writes in. + +### What you do +You decide what a product contains and how people get through it before anyone draws a polished screen. You produce site maps, user flows and simple wireframes, and you point out where people will get lost. + +### How you work +1. Start from the people and their goals: who they are, what they came to do and what could stop them. Write these as short statements the owner can correct. +2. List the content and the actions, then group them the way the user thinks, not the way the company is organized. Name sections with the words people use. +3. Draw each important flow from the first step to the goal, including the unhappy paths: errors, empty states, going back, leaving halfway. +4. Make wireframes as plain HTML, grey boxes and real labels, one file per screen, with no decoration. Mark what is a guess. +5. Walk through each flow as a first-time user and write down every place you hesitated. + +### What you hand back +A site map, the flows with their unhappy paths, the wireframes as files and a short list of risks and open questions, ordered by how much they matter. Do not paste code into the chat. + +### Ask the owner first +Ask with `ask_owner` when the main goal of the product or the main user is unclear, because the whole structure depends on it. Say which of your points are assumptions. + +### With the crew +Hand the wireframes to a designer or a UI designer with `send_message`, and the flows to the developer. A UX researcher can test your guesses with real people. 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 +What the owner shares about users and the business is private. Use made-up people in examples, never real ones. +""" diff --git a/crates/botloftd/src/catalog/mod.rs b/crates/botloftd/src/catalog/mod.rs index 9b8f6345..b65161b7 100644 --- a/crates/botloftd/src/catalog/mod.rs +++ b/crates/botloftd/src/catalog/mod.rs @@ -80,6 +80,14 @@ const SHEETS: &[(&str, &str)] = &[ sheet!("academic-researcher"), sheet!("tutor"), sheet!("language-teacher"), + sheet!("brand-guardian"), + sheet!("ui-designer"), + sheet!("ux-architect"), + sheet!("accessibility-reviewer"), + sheet!("presentation-designer"), + sheet!("infographic-designer"), + sheet!("image-prompt-writer"), + sheet!("design-critic"), ]; /// What a sheet file holds. diff --git a/crates/botloftd/tests/catalog.rs b/crates/botloftd/tests/catalog.rs index 75947473..e1520e50 100644 --- a/crates/botloftd/tests/catalog.rs +++ b/crates/botloftd/tests/catalog.rs @@ -22,7 +22,7 @@ async fn the_catalog_lists_every_role_without_its_instructions() { let all = app.call("catalog.list", json!({})).await.expect("list"); let all = all.as_array().expect("array"); - assert_eq!(all.len(), 58); + assert_eq!(all.len(), 66); let ids: Vec<_> = all .iter() .filter_map(|entry| entry["id"].as_str()) @@ -74,6 +74,12 @@ async fn the_catalog_lists_every_role_without_its_instructions() { .expect("list marketing"); assert_eq!(marketing.as_array().expect("array").len(), 18); + let design = app + .call("catalog.list", json!({ "category": "design" })) + .await + .expect("list design"); + assert_eq!(design.as_array().expect("array").len(), 9); + let learning = app .call("catalog.list", json!({ "category": "learning" })) .await diff --git a/crates/botloftd/tests/chief_catalog.rs b/crates/botloftd/tests/chief_catalog.rs index edcd9c1d..41946d19 100644 --- a/crates/botloftd/tests/chief_catalog.rs +++ b/crates/botloftd/tests/chief_catalog.rs @@ -81,7 +81,7 @@ async fn the_chief_reads_the_catalog() { .await .expect("list"); let all = all["templates"].as_array().expect("templates"); - assert_eq!(all.len(), 58); + assert_eq!(all.len(), 66); assert!(all[0].get("instructions").is_none(), "the list is light"); let research = c diff --git a/docs/spec.md b/docs/spec.md index d37377b5..5c010d16 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -829,7 +829,8 @@ Formatar o computador ou perder a pasta do Botloft não pode levar as equipes ju - **O que vai:** uma cópia consistente do banco (`VACUUM INTO`): equipes, bots, conversas, rotinas, regras de "permitir sempre", acessos entre equipes e o uso. E a pasta de cada equipe em `workspaces_root`, arquivadas inclusive: a memória (`CLAUDE.md`) e as regras de cada bot, os anexos e a `shared`. Vai também um `manifest.json` com o formato (1), a data, a versão do Botloft e as equipes, com os nomes dos bots. - **O que fica:** o que o Botloft escreve de novo a cada início (`.botloft\` e `.claude\settings.json` de cada bot, 7.5); os segredos, os logs e os perfis dos navegadores dos bots, que estão na pasta de dados e não em `workspaces_root`; e as pastas de trabalho que o dono escolheu fora do Botloft (5), que são dele. O manifesto lista essas pastas, para a importação avisar. O login do Claude também é de cada computador e se faz de novo. -- **Cópia leve (`scope: "light"`):** o que vai para a nuvem (27) é só o que dá trabalho refazer e pesa pouco: a **estrutura** (equipes, bots com papel, modelo e modo, `settings`, acessos entre equipes, ferramentas conectadas e sites liberados, sem os segredos), as **rotinas** e a **memória** de cada bot (o `CLAUDE.md` e as regras em `.claude ules` da pasta dele). Ficam de fora as conversas (mensagens, entregas, tarefas, itens do chat, aprovações, perguntas, reações), as execuções das rotinas, o uso (`turn_costs`, `plan_readings`), as permissões do computador (`desktop_grants`), e das pastas os anexos, a `shared` e tudo o mais. O banco da cópia é o mesmo `VACUUM INTO` com essas tabelas esvaziadas. O manifesto leva `scope` (`full` quando falta, como nas cópias de antes) e a restauração avisa que as conversas não vêm: os bots voltam com a memória e começam conversas novas. `backup.export {passphrase, scope?}` aceita os dois, `full` por padrão: "Salvar uma cópia" no app continua levando tudo. +- **Cópia leve (`scope: "light"`):** o que vai para a nuvem (27) é só o que dá trabalho refazer e pesa pouco: a **estrutura** (equipes, bots com papel, modelo e modo, `settings`, acessos entre equipes, ferramentas conectadas e sites liberados, sem os segredos), as **rotinas** e a **memória** de cada bot (o `CLAUDE.md` e as regras em `.claude +ules` da pasta dele). Ficam de fora as conversas (mensagens, entregas, tarefas, itens do chat, aprovações, perguntas, reações), as execuções das rotinas, o uso (`turn_costs`, `plan_readings`), as permissões do computador (`desktop_grants`), e das pastas os anexos, a `shared` e tudo o mais. O banco da cópia é o mesmo `VACUUM INTO` com essas tabelas esvaziadas. O manifesto leva `scope` (`full` quando falta, como nas cópias de antes) e a restauração avisa que as conversas não vêm: os bots voltam com a memória e começam conversas novas. `backup.export {passphrase, scope?}` aceita os dois, `full` por padrão: "Salvar uma cópia" no app continua levando tudo. - **Lacre:** o arquivo começa com `BOTLOFTBAK`, um byte de versão (1), o sal do Argon2id (16 bytes), os custos (64 MiB, 3 passadas, 1 faixa, em `u32` little-endian) e o nonce (19 bytes). Depois vem o zip, em blocos de 64 KiB cifrados com XChaCha20-Poly1305 na construção STREAM (contador big-endian de 32 bits e marca do último bloco), com a chave de 32 bytes que o Argon2id tira da senha. Senha errada, arquivo cortado ou blocos trocados não abrem, e nada de um bloco que não abre é escrito. A senha tem ao menos 8 caracteres e nunca é guardada nem vai para o log: quem a perde perde a cópia. - **Exportar:** `backup.export {passphrase}` fecha a cópia em `\exports\botloft-AAAA-MM-DD-HHMM.botloft` (só a mais nova fica ali) e devolve `{path, size, manifest}`. O app então oferece "Salvar como…" (`save_file_as`, 15.2) para o dono guardar onde quiser. Os erros que o dono resolve vêm com `reason` (20.8): `short_passphrase`, `wrong_passphrase`, `not_a_backup` e `newer_backup`. - **Importar:** em duas etapas, para nada mudar com o Botloft rodando. `backup.stage {path, passphrase}` abre o arquivo com a senha em `\restore\staged.zip`, confere o manifesto (formato 1, de um Botloft que não é mais novo) e o banco, e devolve o manifesto para o app mostrar o que vem. Senha errada ou arquivo que não é cópia não deixam nada. `backup.cancel` desiste. `backup.confirm` marca a cópia para o próximo início, e o app reinicia o Botloft (`restartDaemon`). @@ -1106,7 +1107,7 @@ M2 a M4 foram entregues com ConPTY, terminal com replay, inbox por named pipe e 3. "Permitir sempre" nas aprovações, gravado como regra do bot. Feito (10.1). 4. Busca FTS5 em mensagens e no chat. Feito (8.8). 5. Histórico de versões das instruções do bot. -6. Acesso remoto com token por dispositivo (Tailscale). +6. (Removido: acesso remoto com Tailscale não será feito. O celular usa o servidor da conta, seção 28.) 7. Sinais entre bots disparando rotinas. Feito (20.13). 8. Suporte Linux/macOS. Em fatias: (1) CI com Ubuntu e macOS para o daemon; (2) runtime do bot (grupo de processos, ambiente, `claude`, navegador); (3) iniciar com o sistema (`systemd --user`, LaunchAgent); (4) app; (5) empacotamento e release. Feitas: 1 a 5 (14.1, 15.2, 15.4 a 15.6). O macOS sai sem notarização (sem conta Apple Developer por enquanto). 9. Navegador dos bots, com o dono assistindo ao vivo. Desenho na seção 21. @@ -2065,6 +2066,19 @@ instructions = """ | `tutor` | `learning` | Ensina uma ideia de cada vez no nível de quem aprende, pede que explique de volta, dá dica antes da resposta | | `language-teacher` | `learning` | Conversa no idioma no nível certo, corrige os erros que mais importam com a regra em uma linha; trabalha com texto, não ouve pronúncia | +**Design** (`design`, 8, junto com `designer`): trabalham sobre telas e arquivos do dono, em HTML na área de design (22). As fichas dizem o que nunca fazer: inventar um fato da marca ou mudar uma regra do guia sem perguntar; usar logo, fonte, imagem ou foto sem direito de uso; chamar uma página de acessível ou certificada só por ler o código; entortar um dado, uma escala ou uma fonte num gráfico; descrever o rosto de uma pessoa real ou copiar o estilo de outro criador num pedido de imagem. O `image-prompt-writer` não gera imagem: escreve o texto que o dono cola na ferramenta que usa. + +| `id` | Categoria | O que faz | +|---|---|---| +| `brand-guardian` | `design` | Faz um guia de marca de uma página com o material do dono, marcando o que viu e o que sugere, e aponta onde cada peça foge dele | +| `ui-designer` | `design` | Monta cores, fontes, espaçamento e componentes com todos os estados numa página de estilo que as telas reaproveitam | +| `ux-architect` | `design` | Desenha mapa do produto, fluxos com os caminhos de erro e esboços simples, e lista onde as pessoas se perdem | +| `accessibility-reviewer` | `design` | Lê o código e aponta contraste, rótulos, teclado e foco com quem é atingido e o ajuste; diz o que não consegue conferir | +| `presentation-designer` | `design` | Escreve a história e desenha cada slide como tela de uma ideia só, com notas de fala à parte; não gera PowerPoint | +| `infographic-designer` | `design` | Confere a origem dos números e desenha gráficos com escala honesta, fonte e data; não inventa dado | +| `image-prompt-writer` | `design` | Escreve descrições para o gerador de imagem ou vídeo do dono, com um parágrafo de estilo para conjuntos, e as refina pelos resultados | +| `design-critic` | `design` | Lê o objetivo e os arquivos da tela e entrega o que mais importa primeiro, separando problema claro de gosto | + ### 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`). @@ -2098,7 +2112,7 @@ Finanças, jurídico e saúde, que pedem aviso de que não substituem um profiss | **G1** Catálogo e daemon | formato da ficha, `catalog.rs`, as 12 fichas, `catalog.list`/`get`/`add`, tipos `ts-rs` | `catalog_lint`; unidade e RPC: `catalog.add` valida como `bots.create`, cria em Manual com modelo e esforço da ficha, nome repetido, ficha desconhecida e crew arquivada recusam | | **G2** Chefe | `list_bot_templates`, `get_bot_template`, `template` em `suggest_bot`, regras do chefe | tools com `FakeRuntime`: só o chefe, `id` desconhecido, junção de `instructions`, limite de 8 000; manual (PR): pedir ao chefe real "preciso de alguém para as redes sociais" e ver o cartão | | **G3** App | a Agência de bots, "Saber mais", "Adicionar na equipe", convite na equipe só com o chefe, textos nos três idiomas | `FakeBotloft`; teste de que toda ficha tem texto nos três idiomas; `pnpm check`; a tela no preview. Manual (PR): criar cada um dos 12 com o Claude Code real e dar a cada um uma tarefa típica | -| **G4** Mais papéis | uma área por PR: Produto e gestão (14, feito), Marketing e vendas (18, feito), Engenharia (8, feito), Conteúdo, pesquisa e aprendizado (6, feito); categorias `product`, `marketing` e `learning`; chips só das categorias com papel; convite com 8 destaques e "Ver todos os bots" | `catalog_lint` e o teste de texto nos três idiomas em cada PR; manual (PR): 2 ou 3 papéis da área, os mais diferentes entre si, com o Claude Code real | +| **G4** Mais papéis | uma área por PR: Produto e gestão (14, feito), Marketing e vendas (18, feito), Engenharia (8, feito), Conteúdo, pesquisa e aprendizado (6, feito), Design (8, feito); categorias `product`, `marketing` e `learning`; chips só das categorias com papel; convite com 8 destaques e "Ver todos os bots" | `catalog_lint` e o teste de texto nos três idiomas em cada PR; manual (PR): 2 ou 3 papéis da área, os mais diferentes entre si, com o Claude Code real | ## 27. Conta e cópia na nuvem