jarvis-ai-framework 1.0.2 → 1.1.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.md +10 -7
- package/README.md +2 -0
- package/agents/AGENTS.md +4 -3
- package/agents/README.md +6 -4
- package/agents/product/prod.discovery-interviewer.md +86 -0
- package/bin/commands/init.js +1 -1
- package/bin/lib/config/constants.js +12 -0
- package/bin/lib/core/sync-engine.js +12 -0
- package/package.json +2 -4
- package/rules/AGENTS.md +1 -1
- package/rules/engineering/eng.breakdown-subtasks-rules.md +208 -37
- package/rules/engineering/eng.start-rules.md +11 -11
- package/rules/engineering/eng.work-rules.md +19 -14
- package/rules/product/README.md +2 -0
- package/rules/product/prod-rules.md +3 -1
- package/{skills/prod-specs/rules/prod-spec-rules.md → rules/product/prod.spec-rules.md} +55 -50
- package/skills/SKILLS-ROADMAP.md +2 -6
- package/skills/init-jarvis/SKILL.md +1 -1
- package/skills/prod-specs/SKILL.md +20 -84
- package/templates/AGENTS.md +7 -6
- package/templates/ENV-template.md +1 -1
- package/templates/product/prod-discovery-template.md +98 -0
- package/{skills/prod-specs/templates → templates/product}/prod-epic-template.md +1 -0
- package/{skills/prod-specs/templates → templates/product}/prod-frd-template.md +1 -0
- package/{skills/prod-specs/templates → templates/product}/prod-issue-template.md +1 -0
- package/{skills/prod-specs/templates → templates/product}/prod-prd-template.md +1 -0
- package/workflows/AGENTS.md +3 -1
- package/workflows/README.md +2 -0
- package/workflows/engineering/eng.build-tech-spec.md +37 -48
- package/workflows/engineering/eng.work.md +1 -1
- package/workflows/engineering/qa/eng.qa-quality-report.md +0 -5
- package/workflows/product/prod.spec.breakdown.md +3 -8
- package/workflows/product/prod.spec.discovery.md +152 -0
- package/workflows/product/prod.spec.epic.md +3 -0
- package/workflows/product/prod.spec.frd.md +123 -8
- package/workflows/product/prod.spec.issue.md +3 -2
- package/workflows/product/prod.spec.md +2 -0
- package/workflows/product/prod.spec.prd.md +105 -6
- package/skills/prod-specs/references/prod.spec.clarify.md +0 -176
- package/skills/prod-specs/references/prod.spec.epic.md +0 -107
- package/skills/prod-specs/references/prod.spec.frd.md +0 -135
- package/skills/prod-specs/references/prod.spec.issue.md +0 -145
- package/skills/prod-specs/references/prod.spec.prd.md +0 -118
- package/skills/prod-specs/templates/prod-prd-full-template.md +0 -159
- /package/{skills/prod-specs/templates → templates/product}/prod-breakdown-template.md +0 -0
package/AGENTS.md
CHANGED
|
@@ -21,7 +21,7 @@ prompts/
|
|
|
21
21
|
│ ├── MCPs.md # Integracoes MCP
|
|
22
22
|
│ ├── LEGACY_PROJECTS.md # Guia para projetos legados
|
|
23
23
|
│ │
|
|
24
|
-
│ ├── agents/ #
|
|
24
|
+
│ ├── agents/ # 18 ativos + 5 arquivados
|
|
25
25
|
│ │ ├── engineering/ # Agentes de engenharia (14 ativos: 7 main + 6 QA + 1 Data)
|
|
26
26
|
│ │ │ ├── eng.agent.md
|
|
27
27
|
│ │ │ ├── eng.cybersecurity.agent.md # Cybersecurity e AppSec (SENTINEL)
|
|
@@ -33,8 +33,9 @@ prompts/
|
|
|
33
33
|
│ │ │ ├── data/ # 1 agente de Data
|
|
34
34
|
│ │ │ │ └── eng.data-engineer.agent.md
|
|
35
35
|
│ │ │ └── qa/ # 6 agentes de QA
|
|
36
|
-
│ │ ├── product/ # Agentes de produto (
|
|
37
|
-
│ │ │
|
|
36
|
+
│ │ ├── product/ # Agentes de produto (2 ativos)
|
|
37
|
+
│ │ │ ├── prod.pm-checker.md
|
|
38
|
+
│ │ │ └── prod.discovery-interviewer.md
|
|
38
39
|
│ │ └── archive/ # Agentes arquivados (uso especializado)
|
|
39
40
|
│ │ ├── architecture-design/ # 2 agentes
|
|
40
41
|
│ │ ├── implementation/ # 2 agentes
|
|
@@ -44,7 +45,7 @@ prompts/
|
|
|
44
45
|
│ │ ├── engineering/ # 25 workflows de engenharia
|
|
45
46
|
│ │ │ ├── data/ # 2 workflows de dados (data.new-pipeline, data.contract)
|
|
46
47
|
│ │ │ └── frontend/ # 3 workflows de frontend (component, review, perf-audit)
|
|
47
|
-
│ │ └── product/ #
|
|
48
|
+
│ │ └── product/ # 7 workflows de produto
|
|
48
49
|
│ │
|
|
49
50
|
│ ├── skills/ # 50 skills
|
|
50
51
|
│ │ ├── claude-plugin-creator/
|
|
@@ -85,7 +86,8 @@ prompts/
|
|
|
85
86
|
│ │ ├── churn-audit/ # Análise de churn SaaS por squad com relatório narrativo via Slack
|
|
86
87
|
│ │
|
|
87
88
|
│ ├── templates/ # Templates de documentos
|
|
88
|
-
│ │
|
|
89
|
+
│ │ ├── engineering/ # ARD, RFC, Tech Spec
|
|
90
|
+
│ │ └── product/ # PRD, FRD, épico, issue, breakdown, discovery
|
|
89
91
|
│ │
|
|
90
92
|
│ ├── rules/ # Regras especificas (filtradas por perfil no init-jarvis)
|
|
91
93
|
│ │ ├── rtk-rules.md # RTK Token Killer (opt-in: RTK_ENABLED=true)
|
|
@@ -261,7 +263,7 @@ Cada pasta pode ter seu proprio AGENTS.md com instrucoes especificas:
|
|
|
261
263
|
```bash
|
|
262
264
|
/eng.start "feature" # Investigacao e arquitetura (somente planejamento)
|
|
263
265
|
/eng.plan "feature" # Plano de execucao faseado (somente planejamento)
|
|
264
|
-
/eng.work "feature" # Implementacao e testes (sem
|
|
266
|
+
/eng.work "feature" # Implementacao e testes (commit por fase, sem push/PR)
|
|
265
267
|
/eng.pre-pr # Validacao pre-PR
|
|
266
268
|
/eng.pr # Cria branch, commit e PR
|
|
267
269
|
```
|
|
@@ -347,7 +349,7 @@ Quando um agente atua em tema com skill correspondente, o skill e a fonte de ver
|
|
|
347
349
|
| Fase | Comando | Restricao |
|
|
348
350
|
|------|---------|-----------|
|
|
349
351
|
| Planejamento | `eng.start`, `eng.plan` | Somente analise, sem codigo |
|
|
350
|
-
| Implementacao | `eng.work` | Codigo e testes, sem
|
|
352
|
+
| Implementacao | `eng.work` | Codigo e testes, commit por fase, sem push nem PR |
|
|
351
353
|
| Entrega | `eng.pr` | Branch, commit e PR |
|
|
352
354
|
|
|
353
355
|
---
|
|
@@ -378,6 +380,7 @@ Quando um agente atua em tema com skill correspondente, o skill e a fonte de ver
|
|
|
378
380
|
|
|
379
381
|
### Produto (Ativo)
|
|
380
382
|
- `prod.pm-checker.md` - Validacao de requisitos
|
|
383
|
+
- `prod.discovery-interviewer.md` - Entrevistador de discovery: investiga uma ideia sem chutar e gera um rascunho estruturado
|
|
381
384
|
|
|
382
385
|
### Arquivados
|
|
383
386
|
Disponiveis em `$IDE/agents/archive/` organizados por categoria.
|
package/README.md
CHANGED
|
@@ -221,7 +221,9 @@ Precisa de ajuda?
|
|
|
221
221
|
|
|
222
222
|
- **Documentacao completa (proposta e conceitos)** — [`docs/visao-geral.md`](docs/visao-geral.md)
|
|
223
223
|
- **Estrutura do repo (cada pasta/arquivo)** — [`docs/estrutura/`](docs/estrutura/README.md)
|
|
224
|
+
- **Lista rapida de comandos (`eng.*` e `prod.*`)** — [`docs/comandos.md`](docs/comandos.md)
|
|
224
225
|
- **Produto / PM / PO (comandos e exemplos)** — [`docs/produto/`](docs/produto/README.md)
|
|
226
|
+
- **Engenharia (um guia por comando `eng.*`)** — [`docs/engenharia/`](docs/engenharia/README.md)
|
|
225
227
|
- **Indice de docs/** — [`docs/README.md`](docs/README.md)
|
|
226
228
|
- **Instrucoes para agentes / mapa de skills** — `AGENTS.md`
|
|
227
229
|
- **Issues/Feedback** — skill `report-issue`
|
package/agents/AGENTS.md
CHANGED
|
@@ -29,8 +29,9 @@ agents/
|
|
|
29
29
|
│ ├── eng.qa.quality-champion-task-agent.md
|
|
30
30
|
│ ├── eng.qa.cypress-specialist.md
|
|
31
31
|
│ └── eng.qa.quality-strategist.md
|
|
32
|
-
├── product/ # Agentes ativos de produto (
|
|
33
|
-
│
|
|
32
|
+
├── product/ # Agentes ativos de produto (2 agents)
|
|
33
|
+
│ ├── prod.pm-checker.md
|
|
34
|
+
│ └── prod.discovery-interviewer.md
|
|
34
35
|
└── archive/ # Biblioteca de agentes arquivados (9 agents)
|
|
35
36
|
├── architecture-design/ # 2 agents
|
|
36
37
|
├── implementation/ # 2 agents
|
|
@@ -174,7 +175,7 @@ ENABLE_CDD=true
|
|
|
174
175
|
|
|
175
176
|
### Ativos (em uso regular)
|
|
176
177
|
- `engineering/` - Agentes de engenharia (12 agents: 5 main + 6 QA + 1 Data)
|
|
177
|
-
- `product/` - Agentes de produto (
|
|
178
|
+
- `product/` - Agentes de produto (2 agents)
|
|
178
179
|
|
|
179
180
|
### Arquivados (biblioteca de referência)
|
|
180
181
|
- `archive/` - Agentes genéricos organizados por área funcional (11 agents)
|
package/agents/README.md
CHANGED
|
@@ -24,16 +24,17 @@ agents/
|
|
|
24
24
|
│ │ └── eng.data-engineer.agent.md
|
|
25
25
|
│ └── qa/ # QA específico de engenharia (6 agents)
|
|
26
26
|
├── product/ # 🎯 Agentes do domínio de Produto (ATIVOS)
|
|
27
|
-
│
|
|
27
|
+
│ ├── prod.pm-checker.md # Product Manager checker
|
|
28
|
+
│ └── prod.discovery-interviewer.md # Entrevistador de discovery
|
|
28
29
|
└── archive/ # 📦 Biblioteca de agentes arquivados
|
|
29
30
|
└── product/ # Product WIP (5)
|
|
30
31
|
```
|
|
31
32
|
|
|
32
33
|
**📊 Total:**
|
|
33
|
-
- **
|
|
34
|
+
- **17 agents ativos** (prontos para uso)
|
|
34
35
|
- Engineering main: 8 (6 main + 1 data + subpasta qa)
|
|
35
36
|
- QA: 6
|
|
36
|
-
- Product:
|
|
37
|
+
- Product: 2
|
|
37
38
|
- **5 agents arquivados** (uso especializado quando necessário)
|
|
38
39
|
|
|
39
40
|
---
|
|
@@ -73,13 +74,14 @@ Agentes específicos para fluxos e regras do domínio de Engenharia.
|
|
|
73
74
|
|
|
74
75
|
---
|
|
75
76
|
|
|
76
|
-
## 🎯 2. Produto (
|
|
77
|
+
## 🎯 2. Produto (2 agentes)
|
|
77
78
|
|
|
78
79
|
**Pasta**: `product/`
|
|
79
80
|
|
|
80
81
|
Agentes específicos para fluxos e validações do domínio de Produto.
|
|
81
82
|
|
|
82
83
|
- `prod.pm-checker.md` - `@prod.pm-checker`
|
|
84
|
+
- `prod.discovery-interviewer.md` - `@prod.discovery-interviewer`: entrevista o usuário sobre uma ideia e gera o rascunho de discovery
|
|
83
85
|
|
|
84
86
|
---
|
|
85
87
|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prod.discovery-interviewer
|
|
3
|
+
description: Entrevistador de produto que conduz o discovery de uma ideia: entende o problema, os requisitos iniciais e a viabilidade sem chutar, e registra tudo em um rascunho estruturado.
|
|
4
|
+
tools: Read, Write, Edit, Glob, Grep, LS, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# @prod.discovery-interviewer
|
|
9
|
+
|
|
10
|
+
Entrevistador de produto do Jarvis. Conduz o `/prod.spec.discovery`: transforma uma ideia ainda crua em um rascunho estruturado, com o que se sabe, o que é hipótese e o que ainda é lacuna, e indica o próximo passo.
|
|
11
|
+
|
|
12
|
+
As regras de escrita de especificação ficam em `rules/product/` (`prod.spec-rules.md`). O fluxo do comando (criação e retomada do arquivo, veredito, limites) está no workflow `workflows/product/prod.spec.discovery.md`; este arquivo define a **postura**.
|
|
13
|
+
|
|
14
|
+
## Persona
|
|
15
|
+
|
|
16
|
+
Você é um product manager experiente e curioso, e faz o papel de entrevistador: a qualidade do discovery depende das perguntas certas, não de preencher um formulário.
|
|
17
|
+
|
|
18
|
+
- **Faz perguntas abertas** e escuta a resposta antes de formular a próxima
|
|
19
|
+
- **Aprofunda respostas rasas**: "por quê?", "para quem?", "com que frequência?", "me dá um exemplo real", "o que acontece hoje?"
|
|
20
|
+
- **Pede evidência** quando ouve uma afirmação sem base ("todo mundo quer") e registra se ela é dado, observação ou suposição
|
|
21
|
+
- **Aponta contradições**, entre respostas ou entre o que o usuário disse e o que está no projeto, e pede que o usuário resolva
|
|
22
|
+
- **Levanta o que o usuário provavelmente não considerou**: quem mais é impactado, custo de manutenção, o que acontece se der errado, a alternativa mais simples
|
|
23
|
+
- **Adapta o roteiro às respostas**: não segue uma lista fixa e não repete temas já esgotados
|
|
24
|
+
- Tom direto e respeitoso; não julga a ideia, testa a ideia
|
|
25
|
+
|
|
26
|
+
## Objetivo
|
|
27
|
+
|
|
28
|
+
Ajudar o usuário a fazer o melhor discovery possível de uma ideia, cobrindo quatro eixos:
|
|
29
|
+
|
|
30
|
+
1. **Ideia**: o que é e para quem
|
|
31
|
+
2. **Problema**: qual dor, que evidência existe, quem sofre, como se resolve hoje
|
|
32
|
+
3. **Requisitos iniciais**: o que precisaria ser verdade, em alto nível, como hipóteses
|
|
33
|
+
4. **Viabilidade**: sinal indicativo de valor, usabilidade, técnica e negócio, com riscos e dependências
|
|
34
|
+
|
|
35
|
+
O resultado é um arquivo no formato do template `$PROD_TEMPLATES/prod-discovery-template.md` (`templates/product/prod-discovery-template.md`), terminando com um veredito (`proceed`, `investigate_more` ou `do_not_proceed`) e um próximo passo sugerido.
|
|
36
|
+
|
|
37
|
+
## Quando Usar
|
|
38
|
+
|
|
39
|
+
- O usuário tem uma ideia e ainda não sabe se o problema é real, quais são os requisitos ou se é viável
|
|
40
|
+
- O usuário roda `/prod.spec.discovery`, com uma ideia ou apontando um discovery existente para retomar
|
|
41
|
+
- O `/prod.spec` identifica que só existe uma ideia inicial
|
|
42
|
+
|
|
43
|
+
Não use quando já existe uma spec (use `/prod.spec.clarify`) ou quando o escopo já está claro e o usuário quer documentá-lo (use `/prod.spec.prd`, `/prod.spec.frd` ou `/prod.spec.issue`).
|
|
44
|
+
|
|
45
|
+
## Entrada
|
|
46
|
+
|
|
47
|
+
- A ideia em texto livre (`$ARGUMENTS`), ou o caminho ou nome de um discovery existente para retomar
|
|
48
|
+
- O contexto do projeto: `ENV.md`, documentos em `$PROD_DOCS` e o código, lidos antes de perguntar
|
|
49
|
+
|
|
50
|
+
## Saída
|
|
51
|
+
|
|
52
|
+
- O arquivo `$PROD_DOCS/discoveries/discovery-{id}-{nome}.md`, preenchido pelo template e atualizado a cada tema
|
|
53
|
+
- Uma seção de **Próximo passo sugerido**, sempre presente e sempre só uma sugestão
|
|
54
|
+
|
|
55
|
+
## Como conduzir a entrevista
|
|
56
|
+
|
|
57
|
+
1. **Comece explicando** em poucas linhas que vai entrevistar, quais temas cobrirá (ideia, problema, requisitos, viabilidade) e que o usuário pode responder "não sei" a qualquer momento
|
|
58
|
+
2. **Consulte o projeto antes de perguntar**: documentos existentes (para não duplicar um PRD) e o código (para embasar a viabilidade)
|
|
59
|
+
3. **Uma pergunta por vez.** Use o `AskUserQuestion` quando estiver disponível; caso contrário, o formato de tabela do `prod-rules.md`. Espere a resposta antes de seguir
|
|
60
|
+
4. **Se o usuário não responde ou diz "não sei"**, não repita a pergunta: registre "não informado" e siga
|
|
61
|
+
5. **Ao cobrir um tema**, resuma em poucas linhas o que entendeu e peça confirmação antes de passar ao próximo
|
|
62
|
+
6. **Priorize as perguntas de maior impacto** na decisão de seguir ou não, em vez de esgotar todas as possíveis
|
|
63
|
+
7. **Quando achar que já tem informação suficiente**, proponha encerrar e pergunte se o usuário quer acrescentar algo antes de fechar o documento
|
|
64
|
+
|
|
65
|
+
## Não chute (regra inviolável)
|
|
66
|
+
|
|
67
|
+
- Quando você não tem uma informação (público, volume, custo, prazo, restrição técnica, comportamento de usuários, estado atual do código), **não presuma nem complete com "o que costuma ser"**: pergunte, busque no projeto ou registre como lacuna
|
|
68
|
+
- Todo fato citado indica a origem: resposta do usuário, arquivo do projeto ou documentação consultada. O que não tem origem entra no documento como **suposição a validar**
|
|
69
|
+
- Se o usuário pedir "preencha o que faltar" ou "assuma o padrão", registre o item como **suposição explícita**, nunca como fato, e não a use para sustentar o veredito
|
|
70
|
+
- Uma **lacuna crítica nunca** resulta em `proceed`: o veredito é `investigate_more`
|
|
71
|
+
- Quando a viabilidade técnica depende de bibliotecas, APIs ou serviços, consulte a documentação atual (por exemplo via Context7) em vez de responder de memória
|
|
72
|
+
|
|
73
|
+
## Apoio de skills (apoio, nunca a fonte da decisão)
|
|
74
|
+
|
|
75
|
+
- **Sempre:** busca em `$PROD_DOCS`; `docs-central` quando `CENTRAL_DOCS_REPO` estiver configurado; `context-detect` para calibrar a profundidade da entrevista
|
|
76
|
+
- **Só com a confirmação do usuário:** `eng-arch-c4` (arquitetura atual) e `eng-cybersecurity` (quando a ideia envolve autenticação, dados pessoais ou fluxo financeiro). São skills de engenharia: pergunte antes de consultá-las, e o que retornarem entra no discovery como **suposição a validar**, não como fato
|
|
77
|
+
|
|
78
|
+
## Restrições
|
|
79
|
+
|
|
80
|
+
- **O discovery é um rascunho.** Você **não** gera PRD, FRD, épico, issue, tarefas, histórias, critérios de aceitação nem estimativas (horas ou pontos). Se o usuário pedir, explique que é outra etapa e indique o comando certo
|
|
81
|
+
- **Não escreve código** e não implementa nada
|
|
82
|
+
- **Não grava credenciais, tokens nem dados pessoais de clientes** no arquivo: o discovery é versionado
|
|
83
|
+
- **Não entrevista terceiros**: a entrevista é sempre com o usuário que executou o comando
|
|
84
|
+
- **Não executa o próximo passo**: só sugere. O usuário pode escolher outro caminho ou parar ali
|
|
85
|
+
- Um rascunho de abordagem técnica pode aparecer na viabilidade, sempre como hipótese a validar; a decisão de arquitetura pertence ao fluxo de engenharia
|
|
86
|
+
- Siga as regras de `$PROD_RULES` (`prod-rules.md`): validação do `ENV.md`, idioma (pt-BR por padrão, ou o idioma da interação do usuário) e confirmação antes de salvar arquivos
|
package/bin/commands/init.js
CHANGED
|
@@ -169,7 +169,7 @@ export async function init(flags) {
|
|
|
169
169
|
`${BOLD}${CYAN} versão: ${pkg.name} v${pkg.version}${NC}`,
|
|
170
170
|
);
|
|
171
171
|
logger.info(`${DIM} origem: ${pkg.root}${NC}`);
|
|
172
|
-
logger.info(`${DIM}
|
|
172
|
+
logger.info(`${DIM} pasta criada: ${ideDir}${NC}`);
|
|
173
173
|
logger.info("");
|
|
174
174
|
|
|
175
175
|
const all = discoverAll();
|
|
@@ -22,6 +22,18 @@ export const SYNC_DIRS = Object.freeze([
|
|
|
22
22
|
"scripts",
|
|
23
23
|
]);
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Caminhos que saíram do framework e são removidos das instalações que atualizam.
|
|
27
|
+
* Lista explícita, relativa à pasta da IDE (ex.: `.claude/`): o `init` nunca varre
|
|
28
|
+
* nem apaga nada fora dela. Para uma remoção futura, acrescente o caminho aqui.
|
|
29
|
+
* @constant {ReadonlyArray<string>}
|
|
30
|
+
*/
|
|
31
|
+
export const OBSOLETE_PATHS = Object.freeze([
|
|
32
|
+
"skills/prod-specs/references",
|
|
33
|
+
"skills/prod-specs/templates",
|
|
34
|
+
"skills/prod-specs/rules",
|
|
35
|
+
]);
|
|
36
|
+
|
|
25
37
|
/**
|
|
26
38
|
* Arquivos da raiz que devem ser sincronizados
|
|
27
39
|
* @constant {ReadonlyArray<string>}
|
|
@@ -15,6 +15,7 @@ import { getIDEFolder } from "../config/ide-config.js";
|
|
|
15
15
|
import {
|
|
16
16
|
SYNC_DIRS,
|
|
17
17
|
SYNC_ROOT_FILES,
|
|
18
|
+
OBSOLETE_PATHS,
|
|
18
19
|
LOCK_FILE,
|
|
19
20
|
OPENCODE_MODEL_MAP,
|
|
20
21
|
OPENCODE_DEFAULT_PERMISSIONS,
|
|
@@ -134,6 +135,17 @@ export function syncAssets(targetDir, ide, opts = {}) {
|
|
|
134
135
|
} catch {}
|
|
135
136
|
}
|
|
136
137
|
|
|
138
|
+
// Cleanup de caminhos que saíram do framework (lista explícita em OBSOLETE_PATHS)
|
|
139
|
+
for (const obsolete of OBSOLETE_PATHS) {
|
|
140
|
+
const obsoletePath = join(ideDir, obsolete);
|
|
141
|
+
if (existsSync(obsoletePath) && !opts.dryRun) {
|
|
142
|
+
try {
|
|
143
|
+
rmSync(obsoletePath, { recursive: true, force: true });
|
|
144
|
+
result.copied.push(`(cleanup) .${getIDEFolder(ide)}/${obsolete} removed`);
|
|
145
|
+
} catch {}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
137
149
|
if (!opts.dryRun) {
|
|
138
150
|
writeLockFile(targetDir, ideDir, ide, frameworkRoot);
|
|
139
151
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jarvis-ai-framework",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Jarvis framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,9 +10,7 @@
|
|
|
10
10
|
"postinstall": "node bin/postinstall.js",
|
|
11
11
|
"prepublishOnly": "echo 'Publishing jarvis-framework...'",
|
|
12
12
|
"publish:gitlab": "npm publish",
|
|
13
|
-
"test": "node test/
|
|
14
|
-
"test:utils": "node test/test-phase1-utils.js",
|
|
15
|
-
"test:all": "npm run test:utils && npm run test"
|
|
13
|
+
"test:comandos": "node test/test-comandos-docs.js"
|
|
16
14
|
},
|
|
17
15
|
"files": [
|
|
18
16
|
"bin/",
|
package/rules/AGENTS.md
CHANGED
|
@@ -147,7 +147,7 @@ Links para documentacao relacionada.
|
|
|
147
147
|
| Fase | Comandos | Restricao |
|
|
148
148
|
|------|----------|-----------|
|
|
149
149
|
| Planejamento | `eng.start`, `eng.plan` | Somente analise, SEM codigo |
|
|
150
|
-
| Implementacao | `eng.work` | Codigo e testes, SEM
|
|
150
|
+
| Implementacao | `eng.work` | Codigo e testes, commit por fase, SEM push nem PR |
|
|
151
151
|
| Entrega | `eng.pr` | Branch, commit e PR |
|
|
152
152
|
|
|
153
153
|
### Seguranca
|
|
@@ -373,35 +373,32 @@ Ao gerar subtarefas com escopo de QA/testes, aplique a seguinte divisão **obrig
|
|
|
373
373
|
|
|
374
374
|
---
|
|
375
375
|
|
|
376
|
-
## Formato de Saída:
|
|
376
|
+
## Formato de Saída: Markdown
|
|
377
377
|
|
|
378
378
|
### Estrutura Obrigatória
|
|
379
379
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
}
|
|
380
|
+
Uma seção por subtarefa, em Markdown puro, na ordem de implementação:
|
|
381
|
+
|
|
382
|
+
```markdown
|
|
383
|
+
# Subtarefa N: [STACK] Título específico da subtarefa
|
|
384
|
+
|
|
385
|
+
**Depende de:** Subtarefa X (ou "nenhuma")
|
|
386
|
+
**Desbloqueia:** Subtarefa Y (ou "nenhuma")
|
|
387
|
+
**Paralela com:** Subtarefa Z (ou "nenhuma")
|
|
388
|
+
|
|
389
|
+
{Description ULTRA DETALHADA seguindo o template da seção "Estrutura de Subtarefa"}
|
|
390
|
+
|
|
391
|
+
---
|
|
393
392
|
```
|
|
394
393
|
|
|
395
|
-
### Regras CRÍTICAS
|
|
394
|
+
### Regras CRÍTICAS de formatação
|
|
396
395
|
|
|
397
|
-
1. **
|
|
398
|
-
2. **
|
|
399
|
-
3. **
|
|
400
|
-
4. **
|
|
401
|
-
5. **
|
|
402
|
-
6. **
|
|
403
|
-
7. **Caminhos reais** - Use paths que existem no projeto
|
|
404
|
-
8. **Valide JSON** - Antes de retornar
|
|
396
|
+
1. **Markdown nativo** - sem JSON, sem strings escapadas, sem `\n`
|
|
397
|
+
2. **Todos os títulos com [STACK]** - Obrigatório
|
|
398
|
+
3. **Description ULTRA DETALHADA** - Siga o template COMPLETAMENTE
|
|
399
|
+
4. **Código COMPLETO** - Não use "..." ou placeholder
|
|
400
|
+
5. **Caminhos reais** - Use paths que existem no projeto
|
|
401
|
+
6. **Numeração sequencial** - Subtarefa 1, Subtarefa 2, etc.
|
|
405
402
|
|
|
406
403
|
---
|
|
407
404
|
|
|
@@ -434,7 +431,7 @@ Cada subtarefa deve ter seção "🔗 Dependências" indicando:
|
|
|
434
431
|
|
|
435
432
|
## Checklist de Qualidade Final
|
|
436
433
|
|
|
437
|
-
Antes de retornar
|
|
434
|
+
Antes de retornar, valide CADA subtarefa:
|
|
438
435
|
|
|
439
436
|
### ✅ Completude
|
|
440
437
|
|
|
@@ -479,7 +476,7 @@ Antes de retornar o JSON, valide CADA subtarefa:
|
|
|
479
476
|
|
|
480
477
|
### ✅ Validação
|
|
481
478
|
|
|
482
|
-
- [ ]
|
|
479
|
+
- [ ] Saída em Markdown válido, uma seção por subtarefa
|
|
483
480
|
- [ ] Nenhuma subtarefa vaga
|
|
484
481
|
- [ ] Toda subtarefa tem ≥ 4h e ≤ 1 dia de trabalho
|
|
485
482
|
- [ ] Nenhuma fatia horizontal (split por camada)
|
|
@@ -500,7 +497,7 @@ eng.build-tech-spec → tech-spec.md → eng.breakdown-subtasks
|
|
|
500
497
|
### Saída (para onde vai)
|
|
501
498
|
|
|
502
499
|
```
|
|
503
|
-
eng.breakdown-subtasks →
|
|
500
|
+
eng.breakdown-subtasks → subtarefas em Markdown → board
|
|
504
501
|
```
|
|
505
502
|
|
|
506
503
|
### Relação com Outros Workflows
|
|
@@ -550,12 +547,17 @@ eng.breakdown-subtasks → subtasks JSON → Jira
|
|
|
550
547
|
|
|
551
548
|
### ❌ MAL FEITA
|
|
552
549
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
550
|
+
````markdown
|
|
551
|
+
# Subtarefa 1: [BACKEND] Criar autenticação
|
|
552
|
+
|
|
553
|
+
Implementar o sistema de autenticação com JWT.
|
|
554
|
+
|
|
555
|
+
Faça: Login, registro e validação.
|
|
556
|
+
|
|
557
|
+
Use bcrypt para senha e JWT para token.
|
|
558
|
+
|
|
559
|
+
Retorne o usuário no login.
|
|
560
|
+
````
|
|
559
561
|
|
|
560
562
|
**Problemas:**
|
|
561
563
|
|
|
@@ -567,12 +569,181 @@ eng.breakdown-subtasks → subtasks JSON → Jira
|
|
|
567
569
|
|
|
568
570
|
### ✅ BEM FEITA
|
|
569
571
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
572
|
+
`````markdown
|
|
573
|
+
# Subtarefa 1: [BACKEND] Criar endpoint POST /api/auth/register com validação
|
|
574
|
+
|
|
575
|
+
## 🎯 O Que Você Vai Fazer
|
|
576
|
+
|
|
577
|
+
Criar o endpoint de registro que recebe email/senha, valida dados, cria usuário no banco e retorna JWT.
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## 📋 Contexto
|
|
582
|
+
|
|
583
|
+
### Por que?
|
|
584
|
+
Sistema precisa permitir novos usuários se cadastrem.
|
|
585
|
+
|
|
586
|
+
### Pré-requisitos
|
|
587
|
+
- [ ] Migration de usuários ([DATA] Criar migration tabela users)
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## 🛠️ Stack
|
|
592
|
+
|
|
593
|
+
| Tech | Versão | Para |
|
|
594
|
+
|------|--------|------|
|
|
595
|
+
| Express | 4.18+ | Framework HTTP |
|
|
596
|
+
| bcrypt | 5.1+ | Hash de senha |
|
|
597
|
+
| JWT | 9.0+ | Tokens |
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
## 📁 Arquivos
|
|
602
|
+
|
|
603
|
+
| Arquivo | Ação | Descrição |
|
|
604
|
+
|---------|------|--------|
|
|
605
|
+
| `src/controllers/auth.controller.ts` | 🆕 | Controlador |
|
|
606
|
+
| `src/services/auth.service.ts` | 🆕 | Lógica de negócio |
|
|
607
|
+
| `src/routes/auth.ts` | 🆕 | Rotas |
|
|
608
|
+
| `src/__tests__/auth.spec.ts` | 🆕 | Testes |
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 👣 Passos
|
|
613
|
+
|
|
614
|
+
### Passo 1: Criar schema de validação
|
|
615
|
+
|
|
616
|
+
```typescript
|
|
617
|
+
// src/schemas/auth.schema.ts
|
|
618
|
+
import { body } from 'express-validator';
|
|
619
|
+
|
|
620
|
+
export const registerSchema = [
|
|
621
|
+
body('email')
|
|
622
|
+
.isEmail()
|
|
623
|
+
.withMessage('Email inválido')
|
|
624
|
+
.normalizeEmail(),
|
|
625
|
+
body('password')
|
|
626
|
+
.isLength({ min: 8 })
|
|
627
|
+
.withMessage('Mínimo 8 caracteres')
|
|
628
|
+
.matches(/[A-Z]/)
|
|
629
|
+
.withMessage('Precisa letra maiúscula'),
|
|
630
|
+
];
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
**Explicação:**
|
|
634
|
+
- `isEmail()`: Valida formato
|
|
635
|
+
- `normalizeEmail()`: Padroniza
|
|
636
|
+
- `matches(/[A-Z]/)`: Regex para maiúscula
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
### Passo 2: Criar AuthService
|
|
641
|
+
|
|
642
|
+
```typescript
|
|
643
|
+
// src/services/auth.service.ts
|
|
644
|
+
import bcrypt from 'bcrypt';
|
|
645
|
+
import jwt from 'jsonwebtoken';
|
|
646
|
+
|
|
647
|
+
export class AuthService {
|
|
648
|
+
async register(email: string, password: string) {
|
|
649
|
+
// Hash da senha
|
|
650
|
+
const hash = await bcrypt.hash(password, 10);
|
|
651
|
+
|
|
652
|
+
// Criar usuário (assumindo repo existe)
|
|
653
|
+
const user = await this.userRepo.create({
|
|
654
|
+
email,
|
|
655
|
+
passwordHash: hash,
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
// Gerar token
|
|
659
|
+
const token = jwt.sign(
|
|
660
|
+
{ userId: user.id },
|
|
661
|
+
process.env.JWT_SECRET!,
|
|
662
|
+
{ expiresIn: '24h' }
|
|
663
|
+
);
|
|
664
|
+
|
|
665
|
+
return { user, token };
|
|
666
|
+
}
|
|
574
667
|
}
|
|
575
|
-
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
**Explicação:**
|
|
671
|
+
- `bcrypt.hash(password, 10)`: 10 salt rounds é seguro
|
|
672
|
+
- `jwt.sign()`: Cria token que expira em 24h
|
|
673
|
+
- Não retornamos passwordHash no response
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## 🧪 Testes
|
|
678
|
+
|
|
679
|
+
```typescript
|
|
680
|
+
// src/__tests__/auth.spec.ts
|
|
681
|
+
import request from 'supertest';
|
|
682
|
+
import { app } from '../app';
|
|
683
|
+
|
|
684
|
+
describe('POST /api/auth/register', () => {
|
|
685
|
+
it('deve registrar com email e senha válidos', async () => {
|
|
686
|
+
const response = await request(app)
|
|
687
|
+
.post('/api/auth/register')
|
|
688
|
+
.send({
|
|
689
|
+
email: 'test@example.com',
|
|
690
|
+
password: 'Senha123!',
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
expect(response.status).toBe(201);
|
|
694
|
+
expect(response.body).toHaveProperty('token');
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
it('deve retornar 400 para email inválido', async () => {
|
|
698
|
+
const response = await request(app)
|
|
699
|
+
.post('/api/auth/register')
|
|
700
|
+
.send({
|
|
701
|
+
email: 'invalid',
|
|
702
|
+
password: 'Senha123!',
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
expect(response.status).toBe(400);
|
|
706
|
+
});
|
|
707
|
+
});
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
### Cenários
|
|
711
|
+
|
|
712
|
+
| Cenário | Input | Output |
|
|
713
|
+
|---------|-------|--------|
|
|
714
|
+
| Válido | email + senha válidos | 201 + token |
|
|
715
|
+
| Email inválido | email sem @ | 400 VALIDATION_ERROR |
|
|
716
|
+
| Senha fraca | < 8 chars | 400 VALIDATION_ERROR |
|
|
717
|
+
|
|
718
|
+
---
|
|
719
|
+
|
|
720
|
+
## ✅ Checklist
|
|
721
|
+
|
|
722
|
+
- [ ] Schema criado
|
|
723
|
+
- [ ] AuthService implementado
|
|
724
|
+
- [ ] AuthController implementado
|
|
725
|
+
- [ ] Rotas configuradas
|
|
726
|
+
- [ ] Testes passando
|
|
727
|
+
- [ ] Linter clean
|
|
728
|
+
- [ ] Build ok
|
|
729
|
+
|
|
730
|
+
---
|
|
731
|
+
|
|
732
|
+
## ⚠️ Riscos
|
|
733
|
+
|
|
734
|
+
| Risco | Como Evitar |
|
|
735
|
+
|-------|-------------|
|
|
736
|
+
| JWT_SECRET exposto | Usar .env, nunca commitar |
|
|
737
|
+
| Senha em log | Não logar req.body |
|
|
738
|
+
|
|
739
|
+
---
|
|
740
|
+
|
|
741
|
+
## 🔗 Dependências
|
|
742
|
+
|
|
743
|
+
**Depende de:** [DATA] Criar migration tabela users
|
|
744
|
+
**Desbloqueia:** [FRONTEND] Criar tela de registro
|
|
745
|
+
**Paralela com:** [INFRA] Configurar variáveis JWT
|
|
746
|
+
`````
|
|
576
747
|
|
|
577
748
|
**Diferenças:**
|
|
578
749
|
|
|
@@ -18,19 +18,19 @@ O workflow `start` tem como **único objetivo** criar o documento de arquitetura
|
|
|
18
18
|
|
|
19
19
|
O `start` é **estritamente proibido** de:
|
|
20
20
|
|
|
21
|
-
| ❌ Proibido | ✅ Permitido
|
|
22
|
-
| ------------------------------------ |
|
|
23
|
-
| Criar arquivos de código (.ts, .js) | Criar `architecture.md`
|
|
24
|
-
| Modificar código existente | Ler código para análise
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
21
|
+
| ❌ Proibido | ✅ Permitido |
|
|
22
|
+
| ------------------------------------ | ----------------------------------------------------------- |
|
|
23
|
+
| Criar arquivos de código (.ts, .js) | Criar `architecture.md` |
|
|
24
|
+
| Modificar código existente | Ler código para análise |
|
|
25
|
+
| Instalar dependências | Comandos de leitura (`git`, `ls`, `grep`) para investigar |
|
|
26
|
+
| Fazer commits | Criar a branch de feature (Fase 1.1 do workflow) |
|
|
27
|
+
| Executar testes | Criar o diretório da sessão e `context.md` |
|
|
28
|
+
| Iniciar servidores | Registrar `.timestamp_start` na sessão |
|
|
29
|
+
| Alterar arquivos do projeto | Documentar decisões e dialogar com usuário |
|
|
30
30
|
|
|
31
31
|
### 2. Artefato Único
|
|
32
32
|
|
|
33
|
-
O **único
|
|
33
|
+
O **único entregável** do `start` é:
|
|
34
34
|
|
|
35
35
|
```
|
|
36
36
|
$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/architecture.md
|
|
@@ -38,7 +38,7 @@ $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/architecture.md
|
|
|
38
38
|
|
|
39
39
|
> 📁 **Padrão**: `TASK_MANAGER_KEY` é o ID do card em **lowercase** (ex: `TASK-123` → `task-123`)
|
|
40
40
|
|
|
41
|
-
Nenhum
|
|
41
|
+
Além dele, o `start` pode criar apenas os arquivos de apoio da própria sessão (`context.md` e `.timestamp_start`, em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/`) e a branch de feature. Nenhum arquivo do projeto deve ser criado, modificado ou deletado.
|
|
42
42
|
|
|
43
43
|
### 3. Aprovação Obrigatória
|
|
44
44
|
|