jarvis-ai-framework 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/agents/engineering/eng.docs-consolidator.agent.md +81 -0
  2. package/agents/engineering/qa/eng.qa.test-planner.md +7 -7
  3. package/agents/product/prod.discovery-interviewer.md +1 -1
  4. package/bin/commands/docs-publish.js +18 -8
  5. package/bin/commands/docs-sync.js +3 -2
  6. package/bin/lib/cli/program.js +3 -3
  7. package/bin/lib/docs/publish-file.js +35 -24
  8. package/bin/lib/docs/storage/build-index.js +29 -8
  9. package/bin/lib/docs/validate-frontmatter.js +4 -0
  10. package/package.json +1 -1
  11. package/rules/engineering/eng.docs-scraping-rules.md +4 -4
  12. package/rules/engineering/eng.integrations-rules.md +1 -1
  13. package/rules/engineering/rpa/eng.rpa-rules.md +1 -1
  14. package/rules/product/prod-rules.md +3 -3
  15. package/rules-on-demand/engineering/eng.pr-rules.md +9 -31
  16. package/rules-on-demand/engineering/eng.pre-pr-rules.md +12 -19
  17. package/skills/eng-backend-arch-c4/SKILL.md +3 -3
  18. package/skills/eng-global-docs-write/SKILL.md +1 -1
  19. package/skills/eng-qa-planner/SKILL.md +5 -5
  20. package/skills/jarvis-docs-central/README.md +18 -30
  21. package/skills/jarvis-docs-central/SKILL.md +80 -97
  22. package/skills/jarvis-init/SKILL.md +60 -26
  23. package/templates/ENV-template.md +15 -9
  24. package/templates/engineering/ARD-template.md +1 -1
  25. package/templates/engineering/central-delivery-template.md +65 -0
  26. package/templates/engineering/central-feature-template.md +86 -0
  27. package/workflows/engineering/eng.build-tech-spec.md +3 -3
  28. package/workflows/engineering/eng.create-ard-from-code.md +12 -36
  29. package/workflows/engineering/eng.create-ard.md +14 -38
  30. package/workflows/engineering/eng.create-rfc.md +8 -32
  31. package/workflows/engineering/eng.pr.md +31 -62
  32. package/workflows/engineering/eng.pre-pr.md +52 -89
  33. package/workflows/engineering/eng.rpa.robot.md +5 -5
  34. package/workflows/engineering/eng.spec-consolidate.md +140 -0
  35. package/workflows/engineering/eng.start.md +6 -6
  36. package/workflows/engineering/eng.work.md +1 -1
  37. package/workflows/engineering/qa/eng.qa-refinement-entry.md +1 -1
  38. package/workflows/engineering/qa/eng.qa-release-signoff.md +3 -3
  39. package/workflows/engineering/qa/eng.qa-sprint-planning.md +2 -2
  40. package/workflows/product/prod.spec.ard.md +4 -4
  41. package/workflows/product/prod.spec.breakdown.md +1 -1
  42. package/workflows/product/prod.spec.epic.md +5 -35
  43. package/workflows/product/prod.spec.frd.md +6 -34
  44. package/workflows/product/prod.spec.prd.md +6 -35
  45. package/workflows/warm-up.md +8 -10
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: eng.docs-consolidator.agent
3
+ description: >
4
+ Especialista em organizar documentação para dois públicos, humanos e IAs. Consolida o que uma
5
+ entrega de fato implementou (documentos de trabalho, architecture.md, plan.md, diff e commits) em
6
+ documentos completos e autossuficientes para o Central docs: um por funcionalidade (estado atual)
7
+ e um registro por entrega. Escreve só na sessão; quem publica é o workflow, depois da confirmação.
8
+ Trigger: /eng.spec-consolidate (inclusive --inicial, chamado pelo /jarvis-init).
9
+ tools: Read, Glob, Grep, Bash, Write, Edit
10
+ ---
11
+
12
+ # Consolidador de documentação (eng.docs-consolidator.agent)
13
+
14
+ ## Papel
15
+
16
+ Você transforma o que foi **implementado** num registro que dure. Duas pessoas vão ler o que você escreve:
17
+ - **humanos:** outro squad, alguém novo no time, a própria pessoa daqui a seis meses;
18
+ - **IAs:** o `/warm-up`, o `/eng.start` e os `/prod.spec.*` consultam o Central docs como verdade sobre o sistema.
19
+
20
+ Por isso o texto tem de ser **completo, autossuficiente e sem ambiguidade**.
21
+
22
+ ## Princípios
23
+
24
+ 1. **Tudo, exatamente tudo.** Leia todas as fontes (abaixo) antes de escrever. Nada que esteja no PRD, no FRD, no ARD, no RFC, no `architecture.md` ou nos commits e que tenha sido implementado pode ficar de fora.
25
+ 2. **Autossuficiente.** Se os documentos de origem se perderem, o seu documento basta. Os originais são citados só como referência (basename), nunca como "ver o PRD para detalhes".
26
+ 3. **O implementado, não o pretendido.** Descreva o que o código faz. O que foi especificado e não entrou vai para "O que mudou em relação ao especificado" ou "Fora do escopo", com o motivo.
27
+ 4. **Para humanos e IAs.**
28
+ - Frases completas e termos definidos na primeira vez.
29
+ - Listas "Quando X, o sistema Y".
30
+ - Tabelas para dados estruturados.
31
+ - Nada implícito, nada de "como combinado".
32
+ 5. **Bons nomes.**
33
+ - Sugira o slug da funcionalidade em kebab-case, curto e pelo nome que o negócio usa (ex.: `feature-checkout-pix`, não `feature-task-123`).
34
+ - Os títulos dizem o que a funcionalidade é.
35
+ 6. **Referências sempre com URL:**
36
+ - card pelo `TASK_MANAGER` do `ENV.md`, com a URL no padrão da `eng.integrations-rules.md` (Jira `/browse/`, Linear `/issue/`, GitHub `/issues/`, Asana); no modo freelance, o número de controle, sem URL;
37
+ - PR/MR pelo `VERSION_CONTROL` ou pelo `remote origin` (número + URL).
38
+ 7. **Nunca inventar.** Sem fonte, pergunte ao agente principal (que pergunta ao usuário) ou registre como "não informado".
39
+ 8. **Sem dados sensíveis.** Nunca e-mails de autor (só o nome), tokens, senhas, valores de variáveis de ambiente nem dados pessoais de clientes. Se o diff contiver algo parecido com um segredo, avise o agente principal.
40
+
41
+ ## Fontes (nesta ordem)
42
+
43
+ 1. `architecture.md` da sessão: `Branch base:`, contexto, decisões, Questões em Aberto respondidas.
44
+ 2. `plan.md` da sessão: fases e comentários (mudanças de direção).
45
+ 3. Documentos de trabalho em `$PROD_DOCS` e `$ENG_DOCS` ligados à tarefa (PRD, FRD, épicos, histórias, ARD, RFC, swagger, QA).
46
+ 4. `git log {base}..HEAD --format='%h|%an|%ad|%s' --date=short` e `git diff --stat {base}...HEAD`.
47
+ 5. O código alterado, só leitura, para confirmar o comportamento real.
48
+ 6. O documento atual da funcionalidade no Central docs (`jarvis docs fetch`), quando for atualização.
49
+ 7. O `gate-checklist.md` e o `pull-request.md` da sessão, se existirem.
50
+
51
+ ## O que você produz
52
+
53
+ Na pasta da sessão, em `consolidation/`:
54
+ - **`feature-{slug}.md`**, no template `$IDE/templates/engineering/central-feature-template.md`. Na atualização, parta do documento atual do Central docs: reescreva as seções afetadas para o estado atual (não acumule "antes/depois") e acrescente a linha no Histórico de entregas.
55
+ - **`delivery-{AAAA-MM-DD}-{task_key}.md`**, no template `$IDE/templates/engineering/central-delivery-template.md`. No modo `--inicial` não há entrega: só o `feature-*` com a linha "Consolidação inicial a partir de {documentos}" no histórico.
56
+
57
+ Todas as seções obrigatórias do template, preenchidas ou com "Nenhum(a)" e o motivo.
58
+
59
+ ## Limites
60
+
61
+ - **Escreve só em `$SESSIONS_DIR/eng/{KEY}/consolidation/`.** Não publica, não comita, não altera o código nem os documentos de trabalho.
62
+ - **No GitHub/GitLab, só consulta** (ex.: `gh pr view`, `gh issue view`) para obter números, URLs e títulos.
63
+ - **Português do Brasil;** nomes técnicos podem ficar em inglês.
64
+
65
+ ## Skills Disponíveis
66
+
67
+ - **jarvis-docs-central**: contrato do Central docs (estrutura, índice, frontmatter) e leitura com `jarvis docs fetch`
68
+
69
+ ## Workflows e Agentes Relacionados
70
+
71
+ - **eng.spec-consolidate**: abre este agente para escrever a consolidação (normal e `--inicial`)
72
+ - **jarvis-init**: oferece a carga inicial, que chama o `eng.spec-consolidate --inicial`
73
+
74
+ ## Checklist antes de devolver
75
+
76
+ - [ ] Todas as fontes lidas (listar quais)
77
+ - [ ] As 11 seções da funcionalidade e as 7 da entrega preenchidas
78
+ - [ ] Card e PR/MR com URL (ou o número de controle no freelance)
79
+ - [ ] Commits com autor (nome, sem e-mail) e data
80
+ - [ ] Nada de segredos, e-mails ou valores de variáveis
81
+ - [ ] Nenhuma frase depende de um documento de origem para ser entendida
@@ -17,12 +17,12 @@ Antes de qualquer ação, determine qual modo aplicar:
17
17
  Aplicar quando invocado via `eng.qa-refinement-entry` ou quando o argumento recebido for um ID de card ou caminho de spec e não houver código implementado na branch ainda.
18
18
  - Fonte de dados: card no $TASK_MANAGER via integração disponível (Jira MCP)
19
19
  - Não executar `git diff`, `git log` ou qualquer comando que dependa de código
20
- - Saída: `$DOCS_FOLDER/engineering/qa/strategies/{task-id}-test-strategy.md`
20
+ - Saída: `$ENG_DOCS/qa/strategies/{task-id}-test-strategy.md`
21
21
 
22
22
  **Modo B — Análise de Cobertura (pós-código)**
23
23
  Aplicar quando invocado via `eng-qa`, `eng-qa-planner` ou quando houver código implementado na branch (git diff retorna resultados).
24
24
  - Fonte de dados: `git diff origin/main...HEAD`
25
- - Saída: `$DOCS_FOLDER/engineering/qa/{task-id}-test_coverage_branch_report.md`
25
+ - Saída: `$ENG_DOCS/qa/{task-id}-test_coverage_branch_report.md`
26
26
 
27
27
  Regra de decisão: se `git diff origin/main...HEAD` retornar vazio, operar em Modo A. Se retornar código, operar em Modo B.
28
28
 
@@ -225,7 +225,7 @@ Antes de finalizar cada cenário, aplicar este filtro:
225
225
 
226
226
  ### A.7. Salvar o Documento
227
227
 
228
- Salvar em: `$DOCS_FOLDER/engineering/qa/strategies/{task-id}-test-strategy.md`
228
+ Salvar em: `$ENG_DOCS/qa/strategies/{task-id}-test-strategy.md`
229
229
 
230
230
  Estrutura obrigatória:
231
231
  ```
@@ -353,7 +353,7 @@ Isso permite:
353
353
 
354
354
  ### B.6. Gerar Relatório de Cobertura de Testes
355
355
 
356
- Crie um arquivo **`$DOCS_FOLDER/engineering/qa/{task-id}-test_coverage_branch_report.md`** contendo:
356
+ Crie um arquivo **`$ENG_DOCS/qa/{task-id}-test_coverage_branch_report.md`** contendo:
357
357
 
358
358
  ```markdown
359
359
  # Análise de Cobertura de Testes da Branch
@@ -456,9 +456,9 @@ Esforço estimado: [estimativa aproximada]
456
456
 
457
457
  ## Saída
458
458
 
459
- **Modo A**: `$DOCS_FOLDER/engineering/qa/strategies/{task-id}-test-strategy.md` (gerado em A.7)
459
+ **Modo A**: `$ENG_DOCS/qa/strategies/{task-id}-test-strategy.md` (gerado em A.7)
460
460
 
461
- **Modo B**: `$DOCS_FOLDER/engineering/qa/{task-id}-test_coverage_branch_report.md`
461
+ **Modo B**: `$ENG_DOCS/qa/{task-id}-test_coverage_branch_report.md`
462
462
 
463
463
  As recomendações devem ser **específicas, acionáveis** e, quando possível, incluir **exemplos de estrutura de teste**.
464
464
  Foque **exclusivamente** no que foi alterado na branch atual para manter o escopo controlado.
@@ -470,7 +470,7 @@ Foque **exclusivamente** no que foi alterado na branch atual para manter o escop
470
470
  Após gerar o relatório de cobertura, sugira ao usuário invocar o agente **eng.qa.testing-engineer** para escrever os testes identificados como ausentes:
471
471
 
472
472
  ```
473
- @eng.qa.testing-engineer Escreva os testes identificados no relatório $DOCS_FOLDER/engineering/qa/{task-id}-test_coverage_branch_report.md
473
+ @eng.qa.testing-engineer Escreva os testes identificados no relatório $ENG_DOCS/qa/{task-id}-test_coverage_branch_report.md
474
474
  ```
475
475
 
476
476
  Fluxo completo recomendado:
@@ -75,7 +75,7 @@ Não use quando já existe uma spec (use `/prod.spec.clarify`) ou quando o escop
75
75
  As skills são apoio, nunca a fonte da decisão. A busca em `$PROD_DOCS` não é uma skill: é feita sempre, antes de perguntar.
76
76
 
77
77
  ### jarvis-docs-central
78
- Para buscar documentação do produto no Central docs, quando `CENTRAL_DOCS_STORAGE` estiver configurado:
78
+ Para conhecer o que já foi implementado no produto (funcionalidades do Central docs), quando `CENTRAL_DOCS_STORAGE` estiver configurado:
79
79
  - Arquivo: `$IDE/skills/jarvis-docs-central/SKILL.md`
80
80
  - Confiança: sempre
81
81
 
@@ -1,6 +1,6 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { openStorageFromEnv } from "../lib/docs/fetch-file.js";
3
- import { publishFile, VALID_TYPES } from "../lib/docs/publish-file.js";
3
+ import { publishFile, VALID_TYPES, WORKING_DOC_TYPES } from "../lib/docs/publish-file.js";
4
4
  import { logger, configureFromFlags } from "../lib/utils/logger.js";
5
5
 
6
6
  /**
@@ -9,9 +9,9 @@ import { logger, configureFromFlags } from "../lib/utils/logger.js";
9
9
  *
10
10
  * @param {Object} flags - Flags do comando
11
11
  * @param {string} flags.file - Caminho do arquivo local
12
- * @param {string} flags.tipo - Tipo do documento (ver VALID_TYPES)
12
+ * @param {string} flags.tipo - feature | delivery (ver VALID_TYPES)
13
13
  * @param {string} [flags.produto] - Pasta do produto (padrão: WORKSPACE do ENV.md)
14
- * @param {string} [flags.feature] - Slug, só se o nome do arquivo fugir do padrão {tipo}-{id}-{nome}
14
+ * @param {string} [flags.feature] - Slug, só se o nome do arquivo fugir do padrão {tipo}-{nome}.md
15
15
  * @param {string} [flags.squad] - Override do SQUAD do ENV.md
16
16
  * @param {string} [flags.workspace] - Override do WORKSPACE (padrão do --produto)
17
17
  * @param {string} flags.envFile - Path customizado do ENV.md
@@ -33,13 +33,23 @@ export async function docsPublish(flags = {}) {
33
33
  logger.error(
34
34
  `Uso: jarvis docs publish --file <path> --tipo <${VALID_TYPES.join("|")}> [--produto <produto>] [--feature <slug>] [--squad <squad>]\n`
35
35
  );
36
- logger.error("Exemplo (o nome do arquivo já segue {tipo}-{id}-{nome}):");
37
- logger.error(" jarvis docs publish --file ./docs/product/prd-001-checkout.md --tipo prd");
38
- logger.error("");
39
- logger.error(" # Arquivo fora do padrão de nome:");
40
36
  logger.error(
41
- " jarvis docs publish --file ./docs/engineering/swagger/api.yaml --tipo swagger --feature api-wallet"
37
+ "Normalmente chamado pelo /eng.spec-consolidate, que gera os dois arquivos na sessão:"
42
38
  );
39
+ logger.error(
40
+ " jarvis docs publish --file .jarvis/sessions/eng/task-123/consolidation/delivery-2026-10-15-task-123.md --tipo delivery"
41
+ );
42
+ logger.error(
43
+ " jarvis docs publish --file .jarvis/sessions/eng/task-123/consolidation/feature-checkout.md --tipo feature"
44
+ );
45
+ process.exit(1);
46
+ }
47
+
48
+ if (WORKING_DOC_TYPES.includes(tipo)) {
49
+ logger.error(
50
+ `❌ O Central docs guarda só o que foi implementado: "${tipo}" é um documento de trabalho.`
51
+ );
52
+ logger.error(" Ele fica em docs/jarvis/. Gere a consolidação com /eng.spec-consolidate.");
43
53
  process.exit(1);
44
54
  }
45
55
 
@@ -1,7 +1,8 @@
1
1
  import { openStorageFromEnv } from "../lib/docs/fetch-file.js";
2
2
  import { logger, configureFromFlags } from "../lib/utils/logger.js";
3
3
 
4
- const COUNTED_TYPES = ["prd", "frd", "feat", "epic", "story", "task", "ard", "rfc"];
4
+ const COUNTED_TYPES = ["feature", "delivery"];
5
+ const LABELS = { feature: "funcionalidade(s)", delivery: "entrega(s) recente(s)" };
5
6
 
6
7
  /**
7
8
  * Sincroniza a documentação do Central docs (lê `{SQUAD}/index.md` pelo adaptador).
@@ -55,7 +56,7 @@ export async function docsSync(flags = {}) {
55
56
 
56
57
  if (total > 0) {
57
58
  logger.info(`📊 ${total} documentos disponíveis:`);
58
- for (const [tipo, n] of counts) logger.info(` - ${n} ${tipo.toUpperCase()}(s)`);
59
+ for (const [tipo, n] of counts) logger.info(` - ${n} ${LABELS[tipo]}`);
59
60
  }
60
61
  } catch (error) {
61
62
  logger.error("❌ Erro ao sincronizar docs:", error.message);
@@ -132,12 +132,12 @@ export function buildProgram() {
132
132
 
133
133
  const docsPublishCmd = cmd(docs, "publish")
134
134
  .description(
135
- "Publicar documento no Central docs (pasta: copia e regenera o índice; com git: branch + PR)"
135
+ "Publicar a consolidação (feature/delivery) no Central docs (pasta: copia e regenera o índice; com git: branch + PR)"
136
136
  )
137
137
  .option("--file <path>", "Caminho do arquivo local")
138
- .option("--tipo <tipo>", "prd|frd|feat|epic|story|task|ard|rfc|swagger|qa-report")
138
+ .option("--tipo <tipo>", "feature|delivery (consolidação do /eng.spec-consolidate)")
139
139
  .option("--produto <produto>", "Pasta do produto no Central docs (padrão: WORKSPACE do ENV.md)")
140
- .option("--feature <slug>", "Só se o nome do arquivo fugir do padrão {tipo}-{id}-{nome}")
140
+ .option("--feature <slug>", "Só se o nome do arquivo fugir do padrão {tipo}-{nome}.md")
141
141
  .option("--squad <squad>", "Override do SQUAD do ENV.md")
142
142
  .option(
143
143
  "--workspace <workspace>",
@@ -1,8 +1,10 @@
1
1
  /**
2
- * @fileoverview Publica um documento no Central docs pelo adaptador configurado
3
- * (`CENTRAL_DOCS_STORAGE`). O destino segue a estrutura única
4
- * `{SQUAD}/{product|engineering}/{produto}/{arquivo}` e o índice do squad é
5
- * regenerado a cada publicação (ver `storage/build-index.js`).
2
+ * @fileoverview Publica no Central docs, pelo adaptador configurado
3
+ * (`CENTRAL_DOCS_STORAGE`), a consolidação do que foi implementado, gerada pelo
4
+ * `/eng.spec-consolidate`: o documento da funcionalidade (`feature-*.md`, em
5
+ * `{SQUAD}/product/{produto}/`) e o registro da entrega (`delivery-*.md`, em
6
+ * `{SQUAD}/engineering/{produto}/`). Documentos de trabalho (PRD, FRD, ARD, RFC…)
7
+ * não são publicados. O índice do squad é regenerado a cada publicação.
6
8
  * @module docs/publish-file
7
9
  */
8
10
 
@@ -12,18 +14,24 @@ import { logger } from "../utils/logger.js";
12
14
 
13
15
  /** @constant {Readonly<Record<string, "product"|"engineering">>} Área de cada tipo */
14
16
  export const AREA_BY_TYPE = Object.freeze({
15
- prd: "product",
16
- frd: "product",
17
- feat: "product",
18
- epic: "product",
19
- story: "product",
20
- task: "product",
21
- ard: "engineering",
22
- rfc: "engineering",
23
- swagger: "engineering",
24
- "qa-report": "engineering",
17
+ feature: "product",
18
+ delivery: "engineering",
25
19
  });
26
20
 
21
+ /** @constant {ReadonlyArray<string>} Documentos de trabalho, que não vão mais para o Central docs */
22
+ export const WORKING_DOC_TYPES = Object.freeze([
23
+ "prd",
24
+ "frd",
25
+ "feat",
26
+ "epic",
27
+ "story",
28
+ "task",
29
+ "ard",
30
+ "rfc",
31
+ "swagger",
32
+ "qa-report",
33
+ ]);
34
+
27
35
  /** @constant {ReadonlyArray<string>} Tipos aceitos pelo `jarvis docs publish` */
28
36
  export const VALID_TYPES = Object.freeze(Object.keys(AREA_BY_TYPE));
29
37
 
@@ -39,8 +47,8 @@ function assertSegment(label, value) {
39
47
 
40
48
  /**
41
49
  * Calcula o destino do documento no Central docs.
42
- * O nome é o do arquivo local quando ele já segue `{tipo}-…` (ex: `prd-001-checkout.md`);
43
- * senão vem de `--feature` (`{tipo}-{feature}.{ext}`).
50
+ * O nome é o do arquivo local quando ele já segue `{tipo}-…` (ex: `feature-checkout.md`,
51
+ * `delivery-2026-10-15-task-123.md`); senão vem de `--feature` (`{tipo}-{feature}.md`).
44
52
  *
45
53
  * @param {Object} p
46
54
  * @param {string} p.tipo
@@ -52,6 +60,12 @@ function assertSegment(label, value) {
52
60
  */
53
61
  export function resolveDestPath({ tipo, squad, produto, localFile, feature }) {
54
62
  const area = AREA_BY_TYPE[tipo];
63
+ if (!area && WORKING_DOC_TYPES.includes(tipo)) {
64
+ throw new Error(
65
+ `O Central docs guarda só o que foi implementado: "${tipo}" é um documento de trabalho e fica em docs/jarvis/.\n` +
66
+ "Gere a consolidação com /eng.spec-consolidate (tipos: feature, delivery)."
67
+ );
68
+ }
55
69
  if (!area) {
56
70
  throw new Error(`Tipo inválido: ${tipo}\nTipos válidos: ${VALID_TYPES.join(", ")}`);
57
71
  }
@@ -60,7 +74,7 @@ export function resolveDestPath({ tipo, squad, produto, localFile, feature }) {
60
74
 
61
75
  const local = basename(localFile);
62
76
  const ext = extname(local).toLowerCase() || ".md";
63
- const followsPattern = local.toLowerCase().startsWith(`${tipo}-`) && /\.(md|ya?ml|json)$/.test(ext);
77
+ const followsPattern = local.toLowerCase().startsWith(`${tipo}-`) && ext === ".md";
64
78
 
65
79
  let fileName;
66
80
  if (followsPattern) {
@@ -70,7 +84,7 @@ export function resolveDestPath({ tipo, squad, produto, localFile, feature }) {
70
84
  fileName = `${tipo}-${feature}${ext}`;
71
85
  } else {
72
86
  throw new Error(
73
- `O arquivo "${local}" não segue o padrão {tipo}-{id}-{nome}${ext}.\n` +
87
+ `O arquivo "${local}" não segue o padrão ${tipo}-{nome}.md.\n` +
74
88
  `Renomeie o arquivo ou informe --feature <slug>.`
75
89
  );
76
90
  }
@@ -97,12 +111,9 @@ export async function publishFile({ storage, localFile, tipo, squad, produto, fe
97
111
 
98
112
  const { destPath } = resolveDestPath({ tipo, squad, produto, localFile, feature });
99
113
 
100
- const isStructuredSwagger = tipo === "swagger" && !localFile.toLowerCase().endsWith(".md");
101
- if (!isStructuredSwagger) {
102
- logger.info("Validando frontmatter...");
103
- validateFrontmatter(localFile, tipo);
104
- logger.info("✅ Frontmatter válido");
105
- }
114
+ logger.info("Validando frontmatter...");
115
+ validateFrontmatter(localFile, tipo);
116
+ logger.info("✅ Frontmatter válido");
106
117
 
107
118
  logger.info("");
108
119
  logger.info("📋 Resumo da Publicação:");
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @fileoverview Gera o `{SQUAD}/index.md` do Central docs a partir do frontmatter
3
- * dos documentos. O índice é sempre regenerado pela listagem (nunca editado), para
3
+ * da consolidação (funcionalidades e entregas). O índice é sempre regenerado pela listagem (nunca editado), para
4
4
  * duas publicações seguidas não apagarem a entrada uma da outra.
5
5
  * @module docs/storage/build-index
6
6
  */
@@ -27,9 +27,20 @@ export function walkFiles(dir) {
27
27
  });
28
28
  }
29
29
 
30
+ /** @constant {Readonly<Record<string, {prefix: string, title: string}>>} O que cada área lista no índice */
31
+ export const INDEXED = Object.freeze({
32
+ product: { prefix: "feature-", title: "Funcionalidades (estado atual)" },
33
+ engineering: { prefix: "delivery-", title: "Entregas recentes" },
34
+ });
35
+
36
+ /** @constant {number} Entregas listadas por produto (as mais recentes; o nome começa pela data) */
37
+ export const MAX_DELIVERIES_PER_PRODUCT = 10;
38
+
30
39
  /**
31
- * Monta o conteúdo do índice de um squad.
32
- * Formato: `# SQUAD` › `## área` › `### produto` › `- [arquivo](caminho) | vX | status | nome`.
40
+ * Monta o conteúdo do índice de um squad. Lista só a consolidação do
41
+ * `/eng.spec-consolidate`: funcionalidades (`feature-*`) e as entregas mais recentes
42
+ * (`delivery-*`). Outros arquivos (ex.: PRD/ARD publicados na 4.0.0) ficam fora.
43
+ * Formato: `# SQUAD` › `## área` › `### produto` › `- [arquivo](caminho) | status | nome | atualizado`.
33
44
  * @param {string} root - Pasta do Central docs
34
45
  * @param {string} squad
35
46
  * @returns {string}
@@ -38,9 +49,13 @@ export function renderIndex(root, squad) {
38
49
  const out = [`# ${squad}`, ""];
39
50
 
40
51
  for (const area of AREAS) {
52
+ const { prefix, title } = INDEXED[area];
41
53
  const areaDir = join(root, squad, area);
42
- const files = walkFiles(areaDir).filter((f) => !f.endsWith(`${sep}index.md`));
43
- out.push(`## ${area}`, "");
54
+ const files = walkFiles(areaDir).filter((f) => {
55
+ const name = f.split(sep).pop();
56
+ return name.startsWith(prefix) && name.endsWith(".md");
57
+ });
58
+ out.push(`## ${area}`, "", `> ${title}`, "");
44
59
  if (files.length === 0) {
45
60
  out.push("_Nenhum documento._", "");
46
61
  continue;
@@ -55,15 +70,21 @@ export function renderIndex(root, squad) {
55
70
  }
56
71
 
57
72
  for (const [product, productFiles] of byProduct) {
73
+ const listed =
74
+ area === "engineering"
75
+ ? [...productFiles].sort().reverse().slice(0, MAX_DELIVERIES_PER_PRODUCT)
76
+ : productFiles;
58
77
  out.push(`### ${product}`);
59
- for (const file of productFiles) {
78
+ for (const file of listed) {
60
79
  const rel = relative(join(root, squad), file).split(sep).join("/");
61
80
  const name = rel.split("/").pop();
62
- const meta = file.endsWith(".md") ? parseFrontmatter(readFileSync(file, "utf-8")) : {};
81
+ const meta = parseFrontmatter(readFileSync(file, "utf-8"));
63
82
  let line = `- [${name}](${rel})`;
64
- if (meta.version) line += ` | v${meta.version}`;
65
83
  if (meta.status) line += ` | ${meta.status}`;
66
84
  if (meta.name) line += ` | ${meta.name}`;
85
+ if (meta.task_key) line += ` | ${meta.task_key}`;
86
+ const when = meta.updated_at || meta.date;
87
+ if (when) line += ` | ${when}`;
67
88
  out.push(line);
68
89
  }
69
90
  out.push("");
@@ -80,6 +80,10 @@ export function validateFrontmatter(filePath, tipo) {
80
80
  */
81
81
  function getRequiredFields(tipo) {
82
82
  const fields = {
83
+ // Consolidação do Central docs (/eng.spec-consolidate)
84
+ feature: ['id', 'name', 'status', 'product', 'updated_at'],
85
+ delivery: ['id', 'feature', 'task_key', 'pr', 'date'],
86
+ // Documentos de trabalho (validação usada fora do publish)
83
87
  prd: ['id', 'name', 'version', 'status'],
84
88
  frd: ['id', 'name', 'version', 'status', 'related_prd'],
85
89
  feat: ['id', 'name', 'version', 'status', 'related_prd'],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jarvis-ai-framework",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Jarvis framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,8 +18,8 @@ Aplicável sempre que um robô novo for implementado, um bug estrutural for reso
18
18
 
19
19
  #### Localização
20
20
 
21
- - Sempre criar em `docs/engineering/robots/{robot-tag}-robot.md`
22
- - Exemplos: `docs/engineering/robots/consulta-orgao-robot.md`, `docs/engineering/robots/extrator-dados-robot.md`
21
+ - Sempre criar em `$ENG_DOCS/robots/{robot-tag}-robot.md`
22
+ - Exemplos: `$ENG_DOCS/robots/consulta-orgao-robot.md`, `$ENG_DOCS/robots/extrator-dados-robot.md`
23
23
 
24
24
  #### Conteúdo obrigatório
25
25
 
@@ -44,7 +44,7 @@ Todo arquivo `{robot-tag}-robot.md` deve conter:
44
44
 
45
45
  ### Proibido
46
46
 
47
- - ❌ Criar em `docs/robots/` — pasta incorreta, usar `docs/engineering/robots/`
47
+ - ❌ Criar em `docs/robots/` — pasta incorreta, usar `$ENG_DOCS/robots/`
48
48
  - ❌ Omitir a seção de **Limitações Conhecidas** — é fundamental para evitar que outros devs tentem implementar algo impossível
49
49
  - ❌ Omitir o **Histórico de Bugs** — descobertas custam tempo; documentar evita retrabalho
50
50
 
@@ -61,4 +61,4 @@ Nenhuma — todo robô deve ter sua documentação, independente do tamanho ou c
61
61
 
62
62
  ## Referências
63
63
 
64
- - `docs/engineering/robots/{robot-tag}-robot.md` — referência de implementação completa
64
+ - `$ENG_DOCS/robots/{robot-tag}-robot.md` — referência de implementação completa
@@ -37,7 +37,7 @@ Com board definido, se o key não veio nos argumentos, perguntar o id do card na
37
37
 
38
38
  Só se `TASK_MANAGER` estiver preenchido com um vendor. Freelance → pular. Falha no comentário não bloqueia o workflow.
39
39
 
40
- Comentar **somente** em eventos relevantes: (a) **desvio do plano** (mudança de direção, fase bloqueada), (b) **auditoria do Advisor** (as questões do `architecture.md` com as opções junto da escolha), (c) **bloqueio** com valor de rastreabilidade (ex.: pré-PR reprovado), (d) **link do MR**, uma única vez. **Nunca** comentar início ou fim de etapa ("Iniciando…", "concluído…"): o acompanhamento fica no fluxo e no PR.
40
+ Comentar **somente** em eventos relevantes: (a) **desvio do plano** (mudança de direção, fase bloqueada), (b) **auditoria do Advisor** (as questões do `architecture.md` com as opções junto da escolha), (c) **bloqueio** com valor de rastreabilidade, (d) **link do MR**, uma única vez, (e) o **`gate-checklist.md` do `eng.pre-pr`**, só se o usuário responder Sim. **Nunca** comentar início ou fim de etapa ("Iniciando…", "concluído…"): o acompanhamento fica no fluxo e no PR.
41
41
 
42
42
  ```
43
43
  /eng-global-task-comment {TASK_MANAGER_KEY} {mensagem}
@@ -188,7 +188,7 @@ Quando o robô interage com interface visual (browser headless), usar a especial
188
188
 
189
189
  Seguir `$IDE/rules/engineering/eng.docs-scraping-rules.md` sem exceções.
190
190
 
191
- Criar ou atualizar `docs/engineering/robots/{robot-tag}-robot.md` com:
191
+ Criar ou atualizar `$ENG_DOCS/robots/{robot-tag}-robot.md` com:
192
192
  - Visão Geral (o que coleta e o que **não** coleta)
193
193
  - Fluxo de Execução (sequência de passos com URLs)
194
194
  - Fontes de Dados e Campos Extraídos
@@ -39,20 +39,20 @@ PROD_FOLDER_NAME=product
39
39
  PROD_RULES=$RULES_FOLDER/$PROD_FOLDER_NAME
40
40
  PROD_FLOWS=.$IDE/$FLOWS_FOLDER
41
41
  PROD_TEMPLATES=.$IDE/$TEMPLATES_FOLDER/$PROD_FOLDER_NAME
42
- PROD_DOCS=$DOCS_FOLDER/$PROD_FOLDER_NAME
42
+ PROD_DOCS=$DOCS_FOLDER/jarvis/$PROD_FOLDER_NAME
43
43
  ```
44
44
 
45
45
  Abaixo, segue uma descrição de algumas das variáveis mais importantes para as rotinas de produto:
46
46
 
47
47
  - $DOCS_FOLDER é o nome da pasta principal de documentações do projeto. Ela fica localizada na raiz do projeto.
48
- - $PROD_DOCS é o nome da pasta principal de documentações de produto do projeto. No projeto único (sem workspace), fica em `docs/jarvis/product`, fora do versionamento do código.
48
+ - $PROD_DOCS é a pasta dos documentos de produto gerados pelos comandos (PRD, FRD, épicos, histórias, discovery): `$JARVIS_DOCS/product` (`docs/jarvis/product`), nos dois modos de trabalho e fora do versionamento do código. Os de engenharia ficam em `$ENG_DOCS` (`docs/jarvis/engineering`).
49
49
  - $PROD_FOLDER_NAME é o nome padrão da pasta de produto que será usada em diversos contextos do projeto.
50
50
  - $TEMPLATES_FOLDER é o nome da pasta principal de templates do projeto.
51
51
  - $PROD_TEMPLATES é o caminho completo para os templates de produto.
52
52
  - $FLOWS_FOLDER é o nome da pasta de workflows e comandos utilizados pelos IDEs. (tenha em mente que o nome da pasta pode variar de acordo com a IDE utilizada)
53
53
  - $RULES_FOLDER é o nome da pasta principal de regras invioláveis que os agentes devem seguir.
54
54
  - $PROD_RULES é o caminho para a pasta que contém as regras de produto. Leia todos os arquivos dentro dessa pasta para entender as regras de produto.
55
- - $CENTRAL_DOCS_STORAGE e $CENTRAL_DOCS_LOCATION configuram o Central docs (opcional): onde ficam as especificações aprovadas e o índice global de todas elas. Vazio = desligado. Hoje o único armazenamento é `filesystem` (uma pasta; se tiver `.git`, publica por PR). Leitura e publicação sempre por `jarvis docs fetch | sync | publish`.
55
+ - $CENTRAL_DOCS_STORAGE e $CENTRAL_DOCS_LOCATION configuram o Central docs: o registro do que **foi implementado** (um documento por funcionalidade e um por entrega, gerados pelo `/eng.spec-consolidate`), com um índice global. Ligado por padrão (`filesystem`); vazio = desligado. Os documentos de trabalho (PRD, FRD, ARD, RFC) não são publicados lá. Leitura e publicação sempre por `jarvis docs fetch | sync | publish`.
56
56
 
57
57
 
58
58
  ## VARIÁVEL `$IDE` - DETECÇÃO AUTOMÁTICA DA PASTA DA IDE
@@ -279,7 +279,7 @@ O MR deve seguir o template em `$IDE/templates/engineering/PR-template.md`:
279
279
  - ✅ Verificar `git status` antes do commit
280
280
  - ✅ Usar mensagens de commit descritivas
281
281
  - ✅ Referenciar o TASK_MANAGER_KEY no commit
282
- - ✅ **Limpar sessão após criar MR**
282
+ - ✅ Gerar o `pull-request.md` na sessão e publicar só com o **Sim**
283
283
 
284
284
  ---
285
285
 
@@ -316,40 +316,18 @@ Antes de considerar o PR completo:
316
316
  - [ ] Arquivos adicionados individualmente (não `git add .`)
317
317
  - [ ] Commit com mensagem padronizada
318
318
  - [ ] Commit referencia o TASK_MANAGER_KEY
319
- - [ ] Push realizado
320
- - [ ] MR criado com template preenchido
319
+ - [ ] Push realizado (só com o Sim)
320
+ - [ ] MR criado a partir do `pull-request.md` (só com o Sim)
321
321
  - [ ] Branch de destino correta
322
322
  - [ ] Card do Jira movido para "In Review"
323
323
  - [ ] Comentários de code review processados
324
- - [ ] **Sessão limpa** (`$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/` removida)
324
+ - [ ] `pull-request.md` aprovado na sessão (e publicado, se o usuário respondeu Sim)
325
+ - [ ] Lembrete do `/eng.spec-consolidate` na mensagem final
325
326
 
326
327
  ---
327
328
 
328
- ## Limpeza da Sessão
329
+ ## Sessão e publicação
329
330
 
330
- ### Por que limpar?
331
-
332
- 1. **Evitar poluição**: Sessões antigas ocupam espaço e confundem
333
- 2. **Fonte da verdade**: A documentação oficial está no Jira e no MR
334
- 3. **Organizacão**: Manter apenas sessões ativas
335
-
336
- ### O que é removido?
337
-
338
- ```
339
- $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/
340
- ├── architecture.md → Removido
341
- ├── plan.md → Removido
342
- └── context.md → Removido (se existir)
343
- ```
344
-
345
- ### Onde a documentação permanece?
346
-
347
- - **Card do Jira**: Tech spec anexada, comentários
348
- - **Merge Request**: Descrição, histórico de commits
349
- - **Código**: Comentários inline, docstrings
350
-
351
- ### Comando de limpeza
352
-
353
- ```bash
354
- rm -rf $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/
355
- ```
331
+ - O texto do PR fica em **`$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/pull-request.md`**, aprovado pelo usuário.
332
+ - **Publicar (push + MR/PR) só com o Sim** do `AskUserQuestion` "Publicar o PR agora?". Com Não, o arquivo fica na sessão e nada é enviado.
333
+ - **A sessão nunca é apagada por este comando:** o `/eng.spec-consolidate`, que roda em seguida, precisa do `architecture.md`, do `plan.md`, do `gate-checklist.md` e do `pull-request.md`. A pessoa apaga à mão quando quiser.
@@ -63,25 +63,21 @@ Confirmar que está na branch certa? (s/n)
63
63
 
64
64
  ## Regras de Validação
65
65
 
66
+ ### Só revisar
67
+
68
+ O `eng.pre-pr` **aponta lacunas e não corrige nada**: não altera código, não escreve testes, não atualiza documentação e não publica no Central docs. Quem decide o que ajustar é o usuário.
69
+
66
70
  ### Escopo de Análise
67
71
 
68
- Avaliar **apenas** as mudanças da branch atual em relação ao branch base (`main`/`develop`):
72
+ Avaliar **apenas** as mudanças da branch atual em relação à branch base (`Branch base:` do `architecture.md`; sem ele, perguntar):
69
73
 
70
74
  ```bash
71
- git diff main...HEAD
75
+ git diff {BRANCH_BASE}...HEAD
72
76
  ```
73
77
 
74
78
  ### Evidências Obrigatórias
75
79
 
76
- Ao citar "testes passando" ou "validações OK", incluir:
77
- - Qual comando foi executado
78
- - Output do resultado (ou smoke test manual se não houver suíte)
79
-
80
- ### Revalidação após Mudanças
81
-
82
- Se qualquer gate levar a mudanças de código, reexecutar obrigatoriamente:
83
- - Revisão técnica do código alterado
84
- - Testes/validações
80
+ Cada lacuna cita onde está (`arquivo:linha`) ou o comando que a revelou e o resultado.
85
81
 
86
82
  ---
87
83
 
@@ -89,11 +85,8 @@ Se qualquer gate levar a mudanças de código, reexecutar obrigatoriamente:
89
85
 
90
86
  O workflow **deve sempre** terminar com:
91
87
 
92
- 1. **Semáforo de status**:
93
- - 🟢 Green: pronto para PR
94
- - 🟡 Yellow: pode abrir PR com ressalvas documentadas
95
- - 🔴 Red: bloqueado — listar o que impede o PR
96
-
97
- 2. **Comentário no card só se a validação reprovar** (🔴 RED, bloqueio), com o motivo (via `/eng-global-task-comment`) — pular se freelance; GREEN e YELLOW não comentam
98
-
99
- 3. **Aguardar permissão explícita** do usuário para prosseguir para `/eng.pr`
88
+ 1. **`gate-checklist.md`** em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/`:
89
+ - semáforo (🟢 / 🟡 / 🔴), resumo, lacunas por área (o quê, onde, por que importa, sugestão, severidade, **Decisão**), evidências e PR Brief.
90
+ 2. **Decisões do usuário** gravadas na coluna Decisão (Ajustar / Não ajustar + motivo).
91
+ 3. **Pergunta Sim / Não** (`AskUserQuestion`) para publicar o relatório como comentário na issue/card (`/eng-global-task-comment`). Nunca publicar sem a resposta. Freelance: só na sessão.
92
+ 4. **Aguardar permissão explícita** do usuário para prosseguir para `/eng.pr`.
@@ -42,7 +42,7 @@ Criar e manter documentação de arquitetura usando os 4 níveis do C4:
42
42
 
43
43
  - **Script de detecção**: `$IDE/scripts/detect-stack.sh`
44
44
  - **Template**: `$IDE/templates/engineering/c4-model-template.md`
45
- - **Saída**: `$DOCS_FOLDER/engineering/c4/`
45
+ - **Saída**: `$ENG_DOCS/c4/`
46
46
 
47
47
  ### Exemplos de Output
48
48
 
@@ -84,7 +84,7 @@ Code -> Quais classes/interfaces críticas?
84
84
  ### 1. Verificar Documentação Existente
85
85
 
86
86
  ```bash
87
- ls -la $DOCS_FOLDER/engineering/c4/ 2>/dev/null || echo "Nenhum diagrama C4"
87
+ ls -la $ENG_DOCS/c4/ 2>/dev/null || echo "Nenhum diagrama C4"
88
88
  ls -la $DOCS_FOLDER/architecture/adr/ 2>/dev/null
89
89
  ```
90
90
 
@@ -318,7 +318,7 @@ git diff origin/main --name-only | grep -E "docker|config|src/(domain|infrastruc
318
318
  ```
319
319
  ✅ Diagrama C4 criado/atualizado!
320
320
 
321
- 📄 Arquivo: $DOCS_FOLDER/engineering/c4/{arquivo}.md
321
+ 📄 Arquivo: $ENG_DOCS/c4/{arquivo}.md
322
322
  📊 Nível: {nivel}
323
323
  🏗️ Sistema: {nome}
324
324