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.
- package/agents/engineering/eng.docs-consolidator.agent.md +81 -0
- package/agents/engineering/qa/eng.qa.test-planner.md +7 -7
- package/agents/product/prod.discovery-interviewer.md +1 -1
- package/bin/commands/docs-publish.js +18 -8
- package/bin/commands/docs-sync.js +3 -2
- package/bin/lib/cli/program.js +3 -3
- package/bin/lib/docs/publish-file.js +35 -24
- package/bin/lib/docs/storage/build-index.js +29 -8
- package/bin/lib/docs/validate-frontmatter.js +4 -0
- package/package.json +1 -1
- package/rules/engineering/eng.docs-scraping-rules.md +4 -4
- package/rules/engineering/eng.integrations-rules.md +1 -1
- package/rules/engineering/rpa/eng.rpa-rules.md +1 -1
- package/rules/product/prod-rules.md +3 -3
- package/rules-on-demand/engineering/eng.pr-rules.md +9 -31
- package/rules-on-demand/engineering/eng.pre-pr-rules.md +12 -19
- package/skills/eng-backend-arch-c4/SKILL.md +3 -3
- package/skills/eng-global-docs-write/SKILL.md +1 -1
- package/skills/eng-qa-planner/SKILL.md +5 -5
- package/skills/jarvis-docs-central/README.md +18 -30
- package/skills/jarvis-docs-central/SKILL.md +80 -97
- package/skills/jarvis-init/SKILL.md +60 -26
- package/templates/ENV-template.md +15 -9
- package/templates/engineering/ARD-template.md +1 -1
- package/templates/engineering/central-delivery-template.md +65 -0
- package/templates/engineering/central-feature-template.md +86 -0
- package/workflows/engineering/eng.build-tech-spec.md +3 -3
- package/workflows/engineering/eng.create-ard-from-code.md +12 -36
- package/workflows/engineering/eng.create-ard.md +14 -38
- package/workflows/engineering/eng.create-rfc.md +8 -32
- package/workflows/engineering/eng.pr.md +31 -62
- package/workflows/engineering/eng.pre-pr.md +52 -89
- package/workflows/engineering/eng.rpa.robot.md +5 -5
- package/workflows/engineering/eng.spec-consolidate.md +140 -0
- package/workflows/engineering/eng.start.md +6 -6
- package/workflows/engineering/eng.work.md +1 -1
- package/workflows/engineering/qa/eng.qa-refinement-entry.md +1 -1
- package/workflows/engineering/qa/eng.qa-release-signoff.md +3 -3
- package/workflows/engineering/qa/eng.qa-sprint-planning.md +2 -2
- package/workflows/product/prod.spec.ard.md +4 -4
- package/workflows/product/prod.spec.breakdown.md +1 -1
- package/workflows/product/prod.spec.epic.md +5 -35
- package/workflows/product/prod.spec.frd.md +6 -34
- package/workflows/product/prod.spec.prd.md +6 -35
- 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: `$
|
|
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: `$
|
|
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: `$
|
|
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 **`$
|
|
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**: `$
|
|
459
|
+
**Modo A**: `$ENG_DOCS/qa/strategies/{task-id}-test-strategy.md` (gerado em A.7)
|
|
460
460
|
|
|
461
|
-
**Modo B**: `$
|
|
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 $
|
|
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
|
|
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 -
|
|
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}-{
|
|
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
|
-
"
|
|
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 = ["
|
|
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
|
|
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);
|
package/bin/lib/cli/program.js
CHANGED
|
@@ -132,12 +132,12 @@ export function buildProgram() {
|
|
|
132
132
|
|
|
133
133
|
const docsPublishCmd = cmd(docs, "publish")
|
|
134
134
|
.description(
|
|
135
|
-
"Publicar
|
|
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>", "
|
|
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}-{
|
|
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
|
|
3
|
-
* (`CENTRAL_DOCS_STORAGE`)
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
-
|
|
16
|
-
|
|
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: `
|
|
43
|
-
* senão vem de `--feature` (`{tipo}-{feature}.
|
|
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}-`) &&
|
|
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}-{
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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) =>
|
|
43
|
-
|
|
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
|
|
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 =
|
|
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
|
@@ -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
|
|
22
|
-
- Exemplos:
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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 é
|
|
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
|
|
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
|
-
- ✅
|
|
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
|
|
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
|
-
- [ ]
|
|
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
|
-
##
|
|
329
|
+
## Sessão e publicação
|
|
329
330
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
|
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
|
|
75
|
+
git diff {BRANCH_BASE}...HEAD
|
|
72
76
|
```
|
|
73
77
|
|
|
74
78
|
### Evidências Obrigatórias
|
|
75
79
|
|
|
76
|
-
|
|
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.
|
|
93
|
-
- 🟢
|
|
94
|
-
|
|
95
|
-
|
|
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**: `$
|
|
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 $
|
|
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: $
|
|
321
|
+
📄 Arquivo: $ENG_DOCS/c4/{arquivo}.md
|
|
322
322
|
📊 Nível: {nivel}
|
|
323
323
|
🏗️ Sistema: {nome}
|
|
324
324
|
|