From fc063f606ab2da14df3a135145b5e5ca385b1ad3 Mon Sep 17 00:00:00 2001 From: Marcos Paulo Date: Sat, 5 Sep 2026 18:48:07 +0000 Subject: [PATCH 1/2] feat(content): migrate interactiveCopy into six typed collections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the six remaining bilingual datasets from app.js:160 into Astro content collections so GuideSelector has data to drive. Mechanical copy of 178 strings (160 localized pairs + 18 worker array strings) plus the non-localized fields (status, path, command, score, icon, title, number). Source field on commonSkills embedded from skillSources to match the GuideSelectorData contract; if a URL changes, both this entry and skillSources/.json must be updated. Status kept on trees even though GuideSelectorData omits it — index.html renders it. Did not delete interactiveCopy from app.js: legacy page still consumes it, and verify.mjs still asserts against it. Did not migrate the labels (data.labels.*) — those live inside render functions in app.js and belong to 15d. --- src/content/commonSkills/caveman.json | 17 ++++ src/content/commonSkills/debug.json | 23 ++++++ src/content/commonSkills/ponytail.json | 23 ++++++ src/content/commonSkills/research.json | 20 +++++ src/content/commonSkills/review.json | 23 ++++++ src/content/commonSkills/tokens.json | 23 ++++++ src/content/commonSkills/unlazy.json | 23 ++++++ src/content/config.ts | 103 ++++++++++++++++++++++++ src/content/routes/build.json | 9 +++ src/content/routes/explore.json | 9 +++ src/content/routes/plan.json | 9 +++ src/content/routes/review.json | 9 +++ src/content/skillFiles/assets.json | 7 ++ src/content/skillFiles/references.json | 7 ++ src/content/skillFiles/scripts.json | 7 ++ src/content/skillFiles/skill.json | 7 ++ src/content/skillWorkflow/observe.json | 21 +++++ src/content/skillWorkflow/scaffold.json | 21 +++++ src/content/skillWorkflow/trigger.json | 21 +++++ src/content/skillWorkflow/validate.json | 21 +++++ src/content/skillWorkflow/write.json | 21 +++++ src/content/trees/docs.json | 11 +++ src/content/trees/main.json | 11 +++ src/content/trees/tests.json | 11 +++ src/content/trees/ui.json | 11 +++ src/content/workers/docs.json | 13 +++ src/content/workers/tests.json | 13 +++ src/content/workers/ui.json | 13 +++ 28 files changed, 507 insertions(+) create mode 100644 src/content/commonSkills/caveman.json create mode 100644 src/content/commonSkills/debug.json create mode 100644 src/content/commonSkills/ponytail.json create mode 100644 src/content/commonSkills/research.json create mode 100644 src/content/commonSkills/review.json create mode 100644 src/content/commonSkills/tokens.json create mode 100644 src/content/commonSkills/unlazy.json create mode 100644 src/content/routes/build.json create mode 100644 src/content/routes/explore.json create mode 100644 src/content/routes/plan.json create mode 100644 src/content/routes/review.json create mode 100644 src/content/skillFiles/assets.json create mode 100644 src/content/skillFiles/references.json create mode 100644 src/content/skillFiles/scripts.json create mode 100644 src/content/skillFiles/skill.json create mode 100644 src/content/skillWorkflow/observe.json create mode 100644 src/content/skillWorkflow/scaffold.json create mode 100644 src/content/skillWorkflow/trigger.json create mode 100644 src/content/skillWorkflow/validate.json create mode 100644 src/content/skillWorkflow/write.json create mode 100644 src/content/trees/docs.json create mode 100644 src/content/trees/main.json create mode 100644 src/content/trees/tests.json create mode 100644 src/content/trees/ui.json create mode 100644 src/content/workers/docs.json create mode 100644 src/content/workers/tests.json create mode 100644 src/content/workers/ui.json diff --git a/src/content/commonSkills/caveman.json b/src/content/commonSkills/caveman.json new file mode 100644 index 0000000..9b3a64b --- /dev/null +++ b/src/content/commonSkills/caveman.json @@ -0,0 +1,17 @@ +{ + "id": "caveman", + "number": "02", + "kind": { "en": "COMMUNICATION STYLE", "pt": "ESTILO DE COMUNICAÇÃO" }, + "title": "caveman", + "rule": { "en": "Signal first. Drop filler.", "pt": "Sinal primeiro. Corte o excesso." }, + "use": { + "en": "Use for routine status, handoffs, and technical summaries where speed matters. Short fragments make actions and evidence easy to scan.", + "pt": "Use em status, handoffs e resumos técnicos rotineiros onde velocidade importa. Fragmentos curtos facilitam localizar ações e evidências." + }, + "example": { "en": "Built. Tests pass. Published.", "pt": "Feito. Testes passaram. Publicado." }, + "caution": { + "en": "Drop the style for security warnings, irreversible actions, and sequences where terse wording can be misread.", + "pt": "Abandone o estilo em alertas de segurança, ações irreversíveis e sequências onde concisão pode causar erro." + }, + "source": "https://github.com/JuliusBrussee/caveman/blob/3b74643f4d910f496babd4e634b1ba7168816f14/skills/caveman/SKILL.md" +} diff --git a/src/content/commonSkills/debug.json b/src/content/commonSkills/debug.json new file mode 100644 index 0000000..7ba1232 --- /dev/null +++ b/src/content/commonSkills/debug.json @@ -0,0 +1,23 @@ +{ + "id": "debug", + "number": "05", + "kind": { "en": "DIAGNOSTIC LOOP", "pt": "CICLO DE DIAGNÓSTICO" }, + "title": "diagnosing-bugs", + "rule": { + "en": "No red-capable loop, no theory.", + "pt": "Sem ciclo capaz de falhar, sem teoria." + }, + "use": { + "en": "Use for hard bugs, flakes, and regressions. First build a fast deterministic reproduction, then minimize, rank hypotheses, instrument, and fix the root cause.", + "pt": "Use para bugs difíceis, flakes e regressões. Primeiro crie reprodução rápida e determinística; depois minimize, ranqueie hipóteses, instrumente e corrija a causa raiz." + }, + "example": { + "en": "One command reproduces the exact symptom before any fix.", + "pt": "Um comando reproduz o sintoma exato antes de qualquer correção." + }, + "caution": { + "en": "Do not jump from error message straight to a patch.", + "pt": "Não pule da mensagem de erro direto para um patch." + }, + "source": "https://github.com/mattpocock/skills/blob/6654f6b60cd9d5be8b54c6fafe44346dabeb3b76/skills/engineering/diagnosing-bugs/SKILL.md" +} diff --git a/src/content/commonSkills/ponytail.json b/src/content/commonSkills/ponytail.json new file mode 100644 index 0000000..6d90fa1 --- /dev/null +++ b/src/content/commonSkills/ponytail.json @@ -0,0 +1,23 @@ +{ + "id": "ponytail", + "number": "01", + "kind": { "en": "SIMPLIFICATION INSTINCT", "pt": "INSTINTO DE SIMPLIFICAÇÃO" }, + "title": "ponytail-lite", + "rule": { + "en": "Stop at the first rung that holds.", + "pt": "Pare no primeiro degrau que sustenta." + }, + "use": { + "en": "Use when a request invites frameworks, dependencies, abstractions, or speculative scaffolding. It checks reuse, standard library, and native platform features before adding code.", + "pt": "Use quando um pedido convida frameworks, dependências, abstrações ou scaffolding especulativo. Verifica reúso, biblioteca padrão e recursos nativos antes de adicionar código." + }, + "example": { + "en": "Date picker? Start with <input type=\"date\">.", + "pt": "Seletor de data? Comece com <input type=\"date\">." + }, + "caution": { + "en": "Never simplify away security, accessibility, validation, or real edge cases.", + "pt": "Nunca simplifique segurança, acessibilidade, validação ou casos extremos reais." + }, + "source": "https://github.com/ilindaniel/ponytail-lite/blob/e7b42dc2d384a702240dea4d52a7bf5530b821b6/AGENTS.md" +} diff --git a/src/content/commonSkills/research.json b/src/content/commonSkills/research.json new file mode 100644 index 0000000..bf06245 --- /dev/null +++ b/src/content/commonSkills/research.json @@ -0,0 +1,20 @@ +{ + "id": "research", + "number": "04", + "kind": { "en": "SOURCE DISCIPLINE", "pt": "DISCIPLINA DE FONTES" }, + "title": "research", + "rule": { "en": "Trace claims to owners.", "pt": "Leve afirmações até suas fontes." }, + "use": { + "en": "Use when APIs, standards, architecture facts, or current behavior must be verified. Capture findings in a cited note, prioritizing primary sources.", + "pt": "Use quando APIs, padrões, fatos de arquitetura ou comportamento atual precisam ser verificados. Registre achados citados, priorizando fontes primárias." + }, + "example": { + "en": "Git behavior → git-scm.com docs, not a remembered blog summary.", + "pt": "Comportamento do Git → documentação git-scm.com, não memória de um blog." + }, + "caution": { + "en": "Practitioner articles add context; they do not override official behavior.", + "pt": "Artigos de praticantes dão contexto; não substituem comportamento oficial." + }, + "source": "https://github.com/mattpocock/skills/blob/6654f6b60cd9d5be8b54c6fafe44346dabeb3b76/skills/engineering/research/SKILL.md" +} diff --git a/src/content/commonSkills/review.json b/src/content/commonSkills/review.json new file mode 100644 index 0000000..5f930ae --- /dev/null +++ b/src/content/commonSkills/review.json @@ -0,0 +1,23 @@ +{ + "id": "review", + "number": "06", + "kind": { "en": "INDEPENDENT REVIEW", "pt": "REVISÃO INDEPENDENTE" }, + "title": "code-review", + "rule": { + "en": "Check standards and intent separately.", + "pt": "Verifique padrões e intenção separadamente." + }, + "use": { + "en": "Use on a branch or PR. One axis checks repository standards; another checks whether the change actually satisfies its originating specification.", + "pt": "Use em branch ou PR. Um eixo verifica padrões do repositório; outro verifica se a mudança realmente satisfaz a especificação original." + }, + "example": { + "en": "Clean code can still solve the wrong problem.", + "pt": "Código limpo ainda pode resolver o problema errado." + }, + "caution": { + "en": "Pin the comparison point and source specification before reviewing.", + "pt": "Fixe o ponto de comparação e a especificação antes de revisar." + }, + "source": "https://github.com/mattpocock/skills/blob/6654f6b60cd9d5be8b54c6fafe44346dabeb3b76/skills/engineering/code-review/SKILL.md" +} diff --git a/src/content/commonSkills/tokens.json b/src/content/commonSkills/tokens.json new file mode 100644 index 0000000..b88585b --- /dev/null +++ b/src/content/commonSkills/tokens.json @@ -0,0 +1,23 @@ +{ + "id": "tokens", + "number": "07", + "kind": { "en": "CONTEXT ECONOMY", "pt": "ECONOMIA DE CONTEXTO" }, + "title": "token-saver", + "rule": { + "en": "Keep signal. Strip command noise.", + "pt": "Mantenha sinal. Corte ruído de comandos." + }, + "use": { + "en": "Use around verbose tests, builds, Git output, and logs. Filtering preserves context for reasoning while retaining full failure output for recovery.", + "pt": "Use em testes, builds, saídas Git e logs verbosos. Filtragem preserva contexto para raciocínio e mantém falhas completas para recuperação." + }, + "example": { + "en": "200 passing-test lines → one result; failures keep their trace.", + "pt": "200 linhas de testes passando → um resultado; falhas mantêm o trace." + }, + "caution": { + "en": "Read raw output when exact wording or full diffs matter.", + "pt": "Leia saída bruta quando texto exato ou diffs completos importarem." + }, + "source": "https://github.com/aetox-skills/token-saver/blob/8f21188bb043fad411f47e2e57f0365a83c13da7/SKILL.md" +} diff --git a/src/content/commonSkills/unlazy.json b/src/content/commonSkills/unlazy.json new file mode 100644 index 0000000..fb3f02d --- /dev/null +++ b/src/content/commonSkills/unlazy.json @@ -0,0 +1,23 @@ +{ + "id": "unlazy", + "number": "03", + "kind": { "en": "COMPLETION DISCIPLINE", "pt": "DISCIPLINA DE CONCLUSÃO" }, + "title": "unlazy", + "rule": { + "en": "Define observable gates. Finish against evidence.", + "pt": "Defina gates observáveis. Termine com evidências." + }, + "use": { + "en": "Use for substantial autonomous builds, audits, and parallel work where quiet omissions are expensive. It turns “done” into runnable acceptance checks.", + "pt": "Use em builds autônomos grandes, auditorias e trabalho paralelo onde omissões custam caro. Transforma “pronto” em verificações executáveis." + }, + "example": { + "en": "Gate: language toggle persists. Check: browser reload. Expect: pt-BR.", + "pt": "Gate: idioma persiste. Check: recarregar navegador. Esperado: pt-BR." + }, + "caution": { + "en": "Too heavy for trivial edits or factual answers.", + "pt": "Pesado demais para edições triviais ou respostas factuais." + }, + "source": "https://github.com/Leonxlnx/unlazy/blob/473d4b80421c36d733042434cd4b938f81a19ef1/SKILL.md" +} diff --git a/src/content/config.ts b/src/content/config.ts index ccefe1c..7196603 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -153,6 +153,103 @@ const chapters = defineCollection({ }), }); +// Workers from `interactiveCopy.workers` in app.js: the three sub-agent +// cards on /full-guide/. Each entry holds a 3-element array per locale +// (`[label, detail, result]`), not a localized object — the renderer +// unwraps it directly: `worker[language()][0..2]`. +const workers = defineCollection({ + type: 'data', + schema: z.object({ + id: z.string(), + en: z.array(z.string()), + pt: z.array(z.string()), + }), +}); + +// Trees from `interactiveCopy.trees` in app.js: the four worktree nodes +// (main / ui / tests / docs). `owner` and `note` are localized; `path` +// and `command` are single shell strings (the git command shown to the +// user). `status` is rendered by index.html, not the GuideSelector island, +// but it ships in the data and the schema keeps it so nothing is dropped. +const trees = defineCollection({ + type: 'data', + schema: z.object({ + id: z.string(), + status: z.string(), + owner: localized, + path: z.string(), + command: z.string(), + note: localized, + }), +}); + +// Routes from `interactiveCopy.routes` in app.js: plan / build / explore / +// review. `score` is the numeric reasoning-load value (rendered into +// `style="--score:N%"`), `label` and `why` are localized. +const routes = defineCollection({ + type: 'data', + schema: z.object({ + id: z.string(), + score: z.number(), + label: localized, + why: localized, + }), +}); + +// Skill files from `interactiveCopy.skillFiles` in app.js: SKILL.md / +// references/ / scripts/ / assets/. `icon` and `title` are unlocalized +// labels; `en` and `pt` are separate top-level strings, not a localized +// object — matching how `renderSkillFile` reads them. +const skillFiles = defineCollection({ + type: 'data', + schema: z.object({ + id: z.string(), + icon: z.string(), + title: z.string(), + en: z.string(), + pt: z.string(), + }), +}); + +// Skill workflow from `interactiveCopy.skillWorkflow` in app.js: the five +// steps of building a skill (observe / trigger / scaffold / write / +// validate). `number` is unlocalized; `title` / `question` / `action` / +// `output` / `proof` are all localized. +const skillWorkflow = defineCollection({ + type: 'data', + schema: z.object({ + id: z.string(), + number: z.string(), + title: localized, + question: localized, + action: localized, + output: localized, + proof: localized, + }), +}); + +// Common skills from `interactiveCopy.commonSkills` in app.js: the seven +// shared skill cards on /full-guide/. `number` and `title` are unlocalized; +// `kind` / `rule` / `use` / `example` / `caution` are localized. `source` +// is the GitHub URL — in app.js it is read from `skillSources[id]` at +// render time; here it is embedded to match the GuideSelectorData +// contract. If the URL changes, both this entry and the matching +// `skillSources/.json` must be updated. +const commonSkills = defineCollection({ + type: 'data', + schema: z.object({ + id: z.string(), + number: z.string(), + kind: localized, + title: z.string(), + rule: localized, + use: localized, + example: localized, + caution: localized, + source: z.string().url(), + }), +}); + // Review desk entries from skills-review/catalog.js + // skills-review/submitted-catalog.js: 24 in total. Each entry is a Markdown // file with frontmatter for the metadata and a body that holds the @@ -189,5 +286,11 @@ export const collections = { handsOnPrompts, skillInstallPrompts, chapters, + workers, + trees, + routes, + skillFiles, + skillWorkflow, + commonSkills, reviews, }; diff --git a/src/content/routes/build.json b/src/content/routes/build.json new file mode 100644 index 0000000..7f3df1d --- /dev/null +++ b/src/content/routes/build.json @@ -0,0 +1,9 @@ +{ + "id": "build", + "score": 38, + "label": { "en": "Bounded execution", "pt": "Execução delimitada" }, + "why": { + "en": "The brief already removed ambiguity. Optimize for speed and tight feedback.", + "pt": "O brief já removeu a ambiguidade. Otimize para velocidade e feedback curto." + } +} diff --git a/src/content/routes/explore.json b/src/content/routes/explore.json new file mode 100644 index 0000000..7b7733b --- /dev/null +++ b/src/content/routes/explore.json @@ -0,0 +1,9 @@ +{ + "id": "explore", + "score": 22, + "label": { "en": "Read-only discovery", "pt": "Descoberta somente leitura" }, + "why": { + "en": "Search, map, and report. A lightweight model can return facts without editing.", + "pt": "Busque, mapeie e reporte. Um modelo leve devolve fatos sem editar." + } +} diff --git a/src/content/routes/plan.json b/src/content/routes/plan.json new file mode 100644 index 0000000..6aa3042 --- /dev/null +++ b/src/content/routes/plan.json @@ -0,0 +1,9 @@ +{ + "id": "plan", + "score": 92, + "label": { "en": "High ambiguity", "pt": "Alta ambiguidade" }, + "why": { + "en": "Architecture and decomposition have a wide error surface. Spend reasoning here.", + "pt": "Arquitetura e decomposição têm grande superfície de erro. Invista raciocínio aqui." + } +} diff --git a/src/content/routes/review.json b/src/content/routes/review.json new file mode 100644 index 0000000..582cc16 --- /dev/null +++ b/src/content/routes/review.json @@ -0,0 +1,9 @@ +{ + "id": "review", + "score": 74, + "label": { "en": "Independent judgment", "pt": "Julgamento independente" }, + "why": { + "en": "Reconnect the diff to intent with fresh context and adversarial attention.", + "pt": "Reconecte o diff à intenção com contexto novo e atenção crítica." + } +} diff --git a/src/content/skillFiles/assets.json b/src/content/skillFiles/assets.json new file mode 100644 index 0000000..48bfdb9 --- /dev/null +++ b/src/content/skillFiles/assets.json @@ -0,0 +1,7 @@ +{ + "id": "assets", + "icon": "▧", + "title": "assets/", + "en": "Templates and examples the agent can copy without reinventing the expected shape.", + "pt": "Templates e exemplos que o agente pode copiar sem reinventar o formato esperado." +} diff --git a/src/content/skillFiles/references.json b/src/content/skillFiles/references.json new file mode 100644 index 0000000..4205b56 --- /dev/null +++ b/src/content/skillFiles/references.json @@ -0,0 +1,7 @@ +{ + "id": "references", + "icon": "≡", + "title": "references/", + "en": "Stable facts loaded only when the procedure needs them. Keep the main instruction lean.", + "pt": "Fatos estáveis carregados apenas quando o procedimento precisa. Mantenha a instrução principal enxuta." +} diff --git a/src/content/skillFiles/scripts.json b/src/content/skillFiles/scripts.json new file mode 100644 index 0000000..2259f14 --- /dev/null +++ b/src/content/skillFiles/scripts.json @@ -0,0 +1,7 @@ +{ + "id": "scripts", + "icon": "›_", + "title": "scripts/", + "en": "Deterministic checks and repeated operations. Prefer executable proof over prose.", + "pt": "Verificações determinísticas e operações repetidas. Prefira prova executável a prosa." +} diff --git a/src/content/skillFiles/skill.json b/src/content/skillFiles/skill.json new file mode 100644 index 0000000..4c77fc2 --- /dev/null +++ b/src/content/skillFiles/skill.json @@ -0,0 +1,7 @@ +{ + "id": "skill", + "icon": "◇", + "title": "SKILL.md", + "en": "Trigger, procedure, constraints, and the exact evidence the agent must return.", + "pt": "Gatilho, procedimento, restrições e a evidência exata que o agente deve devolver." +} diff --git a/src/content/skillWorkflow/observe.json b/src/content/skillWorkflow/observe.json new file mode 100644 index 0000000..daa8316 --- /dev/null +++ b/src/content/skillWorkflow/observe.json @@ -0,0 +1,21 @@ +{ + "id": "observe", + "number": "01", + "title": { "en": "Start from repeated friction", "pt": "Comece pelo atrito repetido" }, + "question": { + "en": "Which non-obvious decision keeps being rediscovered?", + "pt": "Qual decisão não óbvia continua sendo redescoberta?" + }, + "action": { + "en": "Collect two or three realistic requests. Separate durable judgment from one project’s temporary details.", + "pt": "Colete dois ou três pedidos realistas. Separe julgamento durável dos detalhes temporários de um projeto." + }, + "output": { + "en": "A narrow capability and concrete examples.", + "pt": "Uma capacidade estreita e exemplos concretos." + }, + "proof": { + "en": "Without the skill, agents repeatedly make the same avoidable mistake.", + "pt": "Sem a skill, agentes repetem o mesmo erro evitável." + } +} diff --git a/src/content/skillWorkflow/scaffold.json b/src/content/skillWorkflow/scaffold.json new file mode 100644 index 0000000..e531394 --- /dev/null +++ b/src/content/skillWorkflow/scaffold.json @@ -0,0 +1,21 @@ +{ + "id": "scaffold", + "number": "03", + "title": { "en": "Choose only useful anatomy", "pt": "Escolha apenas a anatomia útil" }, + "question": { + "en": "What must be instructions, executable, consulted, or copied?", + "pt": "O que deve ser instrução, executável, consultado ou copiado?" + }, + "action": { + "en": "Keep shared guidance in SKILL.md. Add scripts for repeated deterministic work, references for conditional facts, and assets for generated output.", + "pt": "Mantenha orientação comum em SKILL.md. Adicione scripts para trabalho determinístico, referências para fatos condicionais e assets para saída." + }, + "output": { + "en": "Smallest folder structure that supports the workflow.", + "pt": "A menor estrutura de pastas que sustenta o fluxo." + }, + "proof": { + "en": "Every file has a real caller; no placeholder directories.", + "pt": "Cada arquivo tem um consumidor real; nenhuma pasta placeholder." + } +} diff --git a/src/content/skillWorkflow/trigger.json b/src/content/skillWorkflow/trigger.json new file mode 100644 index 0000000..1069167 --- /dev/null +++ b/src/content/skillWorkflow/trigger.json @@ -0,0 +1,21 @@ +{ + "id": "trigger", + "number": "02", + "title": { "en": "Make discovery precise", "pt": "Torne a descoberta precisa" }, + "question": { + "en": "When should this load—and when should it stay out?", + "pt": "Quando isto deve carregar — e quando deve ficar de fora?" + }, + "action": { + "en": "Choose a short action-oriented name. Write a discriminating description that names the task and meaningful boundary.", + "pt": "Escolha um nome curto orientado à ação. Escreva uma descrição discriminante que nomeie a tarefa e seu limite." + }, + "output": { + "en": "YAML name + description in SKILL.md.", + "pt": "Nome + descrição YAML em SKILL.md." + }, + "proof": { + "en": "Relevant prompts select it; nearby unrelated prompts do not.", + "pt": "Prompts relevantes selecionam; prompts próximos mas não relacionados, não." + } +} diff --git a/src/content/skillWorkflow/validate.json b/src/content/skillWorkflow/validate.json new file mode 100644 index 0000000..0ae3604 --- /dev/null +++ b/src/content/skillWorkflow/validate.json @@ -0,0 +1,21 @@ +{ + "id": "validate", + "number": "05", + "title": { "en": "Test behavior, then sharpen", "pt": "Teste comportamento, depois refine" }, + "question": { + "en": "Did the skill improve a realistic outcome?", + "pt": "A skill melhorou um resultado realista?" + }, + "action": { + "en": "Run structural validation, execute every new script, and forward-test realistic requests. Fix observed failures with the narrowest rule.", + "pt": "Execute validação estrutural, rode cada script novo e teste pedidos realistas. Corrija falhas observadas com a regra mais estreita." + }, + "output": { + "en": "Validated package plus evidence from real use.", + "pt": "Pacote validado mais evidência de uso real." + }, + "proof": { + "en": "quick_validate passes and behavior improves without unrelated side effects.", + "pt": "quick_validate passa e o comportamento melhora sem efeitos colaterais." + } +} diff --git a/src/content/skillWorkflow/write.json b/src/content/skillWorkflow/write.json new file mode 100644 index 0000000..f5d56c2 --- /dev/null +++ b/src/content/skillWorkflow/write.json @@ -0,0 +1,21 @@ +{ + "id": "write", + "number": "04", + "title": { "en": "Write what changes decisions", "pt": "Escreva o que muda decisões" }, + "question": { + "en": "What would a capable agent still get wrong?", + "pt": "O que um agente capaz ainda erraria?" + }, + "action": { + "en": "State outcome, non-obvious constraints, routing, and stopping conditions. Remove generic advice, duplicate facts, and speculative rules.", + "pt": "Declare resultado, restrições não óbvias, roteamento e condições de parada. Remova conselhos genéricos, fatos duplicados e regras especulativas." + }, + "output": { + "en": "Lean SKILL.md with progressive links.", + "pt": "SKILL.md enxuto com links progressivos." + }, + "proof": { + "en": "Another agent can act correctly without loading irrelevant detail.", + "pt": "Outro agente consegue agir corretamente sem carregar detalhes irrelevantes." + } +} diff --git a/src/content/trees/docs.json b/src/content/trees/docs.json new file mode 100644 index 0000000..fec34dc --- /dev/null +++ b/src/content/trees/docs.json @@ -0,0 +1,11 @@ +{ + "id": "docs", + "status": "review", + "owner": { "en": "Docs worker", "pt": "Worker de docs" }, + "path": "../task-docs", + "command": "git merge --no-ff agent/docs", + "note": { + "en": "Review requested. Merge, request changes, or discard without touching another checkout.", + "pt": "Revisão solicitada. Faça merge, peça mudanças ou descarte sem tocar em outro checkout." + } +} diff --git a/src/content/trees/main.json b/src/content/trees/main.json new file mode 100644 index 0000000..b43936c --- /dev/null +++ b/src/content/trees/main.json @@ -0,0 +1,11 @@ +{ + "id": "main", + "status": "clean", + "owner": { "en": "Orchestrator", "pt": "Orquestrador" }, + "path": "./project", + "command": "git worktree list", + "note": { + "en": "Shared history and integration point. Workers never edit here.", + "pt": "Histórico compartilhado e ponto de integração. Workers nunca editam aqui." + } +} diff --git a/src/content/trees/tests.json b/src/content/trees/tests.json new file mode 100644 index 0000000..ec0340a --- /dev/null +++ b/src/content/trees/tests.json @@ -0,0 +1,11 @@ +{ + "id": "tests", + "status": "ready", + "owner": { "en": "Test worker", "pt": "Worker de testes" }, + "path": "../task-tests", + "command": "git diff main...agent/tests", + "note": { + "en": "Checks are green. Review the diff before merging into main.", + "pt": "Verificações passaram. Revise o diff antes do merge em main." + } +} diff --git a/src/content/trees/ui.json b/src/content/trees/ui.json new file mode 100644 index 0000000..64dcedf --- /dev/null +++ b/src/content/trees/ui.json @@ -0,0 +1,11 @@ +{ + "id": "ui", + "status": "working", + "owner": { "en": "UI worker", "pt": "Worker de UI" }, + "path": "../task-ui", + "command": "git worktree add ../task-ui -b agent/ui", + "note": { + "en": "Own checkout and index. Safe to change presentation files in parallel.", + "pt": "Checkout e índice próprios. Seguro para alterar a apresentação em paralelo." + } +} diff --git a/src/content/workers/docs.json b/src/content/workers/docs.json new file mode 100644 index 0000000..11c3b4e --- /dev/null +++ b/src/content/workers/docs.json @@ -0,0 +1,13 @@ +{ + "id": "docs", + "en": [ + "Documentation worker", + "Receives: reviewed behavior + audience", + "Returns: guide, examples, and migration notes" + ], + "pt": [ + "Worker de documentação", + "Recebe: comportamento revisado + público", + "Devolve: guia, exemplos e notas de migração" + ] +} diff --git a/src/content/workers/tests.json b/src/content/workers/tests.json new file mode 100644 index 0000000..b9f29ca --- /dev/null +++ b/src/content/workers/tests.json @@ -0,0 +1,13 @@ +{ + "id": "tests", + "en": [ + "Verification worker", + "Receives: acceptance criteria + changed surface", + "Returns: failing case, passing checks, risk notes" + ], + "pt": [ + "Worker de verificação", + "Recebe: critérios de aceitação + superfície alterada", + "Devolve: caso de falha, verificações passando e riscos" + ] +} diff --git a/src/content/workers/ui.json b/src/content/workers/ui.json new file mode 100644 index 0000000..69ed1ce --- /dev/null +++ b/src/content/workers/ui.json @@ -0,0 +1,13 @@ +{ + "id": "ui", + "en": [ + "Interface worker", + "Receives: component contract + visual states", + "Returns: focused diff + viewport evidence" + ], + "pt": [ + "Worker de interface", + "Recebe: contrato do componente + estados visuais", + "Devolve: diff focado + evidência dos viewports" + ] +} From dc01460ee3ad2f440c3c770f406e1811cd326148 Mon Sep 17 00:00:00 2001 From: Marcos Paulo Date: Sat, 5 Sep 2026 19:26:55 +0000 Subject: [PATCH 2/2] docs: tell 15d what 05b shipped and that labels are still its job --- .../task-15d-page-full-guide.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/plans/astro-refactor/task-15d-page-full-guide.md b/plans/astro-refactor/task-15d-page-full-guide.md index 1215dba..dd59ffa 100644 --- a/plans/astro-refactor/task-15d-page-full-guide.md +++ b/plans/astro-refactor/task-15d-page-full-guide.md @@ -100,3 +100,33 @@ another task's work — report the gap instead. snapshot to make a diff go away. - **`renderHandsOn` takes no argument** and is not part of GuideSelector's nine-group pattern. It is yours. Its name is asserted by `verify.mjs`. + +## The data exists now (task 05b) + +Your first attempt stopped here, correctly: six of the nine selector groups had +no collection to read. Task 05b fixed that. `src/content/` now carries `workers` +(3), `trees` (4), `routes` (4), `skillFiles` (4), `skillWorkflow` (5) and +`commonSkills` (7) alongside the six task 05 already migrated. Every string was +verified byte-identical to its `app.js` original — 221 values, zero mismatches — +so read them as authoritative and do not re-derive from `app.js`. + +Two things 05b decided that you should know: + +- `trees[id].status` is in the schema although `GuideSelectorData` omits it. + `index.html` renders it as the dot colour on each tree node. The island does + not consume it; the page may. +- `commonSkills[id].source` is embedded per entry rather than joined from + `skillSources[id].url` at render time. Both carry the same URL. + +## The one piece still missing: `labels` + +`GuideSelectorData.labels` is not a collection. Those strings — `OWNER` / +`RESPONSÁVEL`, `REASONING LOAD` / `CARGA DE RACIOCÍNIO`, `context: isolated` / +`contexto: isolado` and the rest — are still hard-coded bilingual literals +inside the `render*` functions in `app.js`. 05b deliberately left them, because +they are page-chrome rather than content. + +They are yours. Lift them verbatim — same rule as everything else, both locales +mandatory, no retranslation, copy the exact strings out of `app.js`. Whether +they become a seventh collection or an inline constant in the page is your call; +say which you chose and why.