jarvis-ai-framework 7.0.0 → 8.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 +2 -2
- package/README.md +8 -33
- package/agents/engineering/data/eng.data-engineer.agent.md +3 -3
- package/agents/engineering/eng.docs-consolidator.agent.md +2 -2
- package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +2 -2
- package/bin/README.md +3 -3
- package/bin/commands/init.js +75 -2
- package/bin/lib/cli/program.js +4 -8
- package/bin/lib/core/sync-engine.js +1 -1
- package/bin/lib/utils/frontmatter.js +1 -1
- package/bin/lib/utils/paths.js +2 -1
- package/bin/lib/utils/version.js +65 -0
- package/bin/postinstall.js +7 -31
- package/package.json +2 -2
- package/rules/AGENTS.md +1 -1
- package/rules/engineering/data/data-rules.md +2 -2
- package/rules/engineering/eng-rules.md +1 -1
- package/rules/engineering/eng-security-rules.md +1 -1
- package/rules/engineering/eng.integrations-rules.md +6 -2
- package/rules/rtk-rules.md +1 -1
- package/rules-on-demand/doc-links-rules.md +2 -2
- package/rules-on-demand/engineering/eng.breakdown-subtasks-rules.md +1 -1
- package/rules-on-demand/engineering/eng.pr-rules.md +8 -6
- package/rules-on-demand/engineering/eng.pre-pr-rules.md +3 -1
- package/rules-on-demand/engineering/eng.tech-spec-rules.md +9 -7
- package/rules-on-demand/engineering/eng.transitions-rules.md +3 -3
- package/skills/AGENTS.md +2 -2
- package/skills/SKILLS-ROADMAP.md +1 -1
- package/skills/eng-backend-arch-c4/assets/example-container.md +4 -4
- package/skills/eng-backend-arch-c4/assets/example-context.md +6 -6
- package/skills/eng-backend-microservices-trace/SKILL.md +1 -1
- package/skills/eng-global-investigation/SKILL.md +4 -0
- package/skills/eng-global-pr/SKILL.md +15 -12
- package/skills/eng-global-task-comment/SKILL.md +11 -3
- package/skills/eng-global-tech-spec/references/delivery-spec.md +28 -21
- package/skills/jarvis-docs-central/README.md +4 -4
- package/skills/jarvis-docs-central/SKILL.md +4 -2
- package/skills/jarvis-init/SKILL.md +18 -1
- package/skills/jarvis-init/assets/setup-guide.md +1 -1
- package/skills/jarvis-report-issue/SKILL.md +37 -24
- package/skills/product-roadmap-report/SKILL.md +2 -2
- package/skills/product-roadmap-report/commands/status.memory.md +1 -1
- package/skills/product-roadmap-report/commands/status.roadmap.preview.md +2 -2
- package/skills/product-specs/SKILL.md +1 -1
- package/templates/ENV-template.md +0 -8
- package/templates/cdd-aplicado-a-prompts.md +1 -1
- package/templates/engineering/AGENTS-template.md +2 -2
- package/templates/engineering/CONTACTS-template.md +1 -1
- package/templates/engineering/advisor-template.md +2 -2
- package/templates/engineering/data-contract-template.md +1 -1
- package/templates/engineering/tech-spec-delivery-template.md +8 -8
- package/templates/engineering/tech-spec-template.md +3 -3
- package/templates/product/prod-frd-template.md +1 -1
- package/templates/product/prod-prd-template.md +1 -1
- package/workflows/AGENTS.md +1 -1
- package/workflows/README.md +1 -1
- package/workflows/engineering/data/data.contract.md +12 -8
- package/workflows/engineering/eng.breakdown-subtasks.md +2 -2
- package/workflows/engineering/eng.build-tech-spec.md +1 -1
- package/workflows/engineering/eng.create-ard-from-code.md +3 -5
- package/workflows/engineering/eng.create-ard.md +3 -5
- package/workflows/engineering/eng.create-rfc.md +5 -5
- package/workflows/engineering/eng.light-arch.md +1 -1
- package/workflows/engineering/eng.plan.md +2 -2
- package/workflows/engineering/eng.pr.md +26 -19
- package/workflows/engineering/eng.pre-pr.md +46 -13
- package/workflows/engineering/eng.spec-consolidate.md +4 -4
- package/workflows/engineering/eng.start.md +10 -8
- package/workflows/engineering/eng.work.md +4 -4
- package/workflows/engineering/qa/eng.qa-release-signoff.md +1 -66
- package/workflows/product/prod.roadmap.preview.md +10 -14
- package/workflows/product/prod.spec.ard.md +2 -2
- package/workflows/product/prod.spec.breakdown.md +2 -2
- package/workflows/product/prod.spec.epic.md +4 -4
- package/workflows/product/prod.spec.frd.md +3 -3
- package/workflows/product/prod.spec.issue.md +3 -3
- package/workflows/product/prod.spec.prd.md +5 -5
- package/bin/commands/qa-signoff.js +0 -115
package/AGENTS.md
CHANGED
|
@@ -255,7 +255,7 @@ Cada pasta pode ter seu proprio AGENTS.md com instrucoes especificas:
|
|
|
255
255
|
/eng.plan "feature" # Plano de execucao faseado (somente planejamento)
|
|
256
256
|
/eng.work "feature" # Implementacao e testes (commit por fase, sem push/PR)
|
|
257
257
|
/eng.pre-pr # Validacao pre-PR
|
|
258
|
-
/eng.pr #
|
|
258
|
+
/eng.pr # Push e PR, depois da pergunta (regra de ouro)
|
|
259
259
|
```
|
|
260
260
|
|
|
261
261
|
### Documentacao
|
|
@@ -285,7 +285,7 @@ Tabela completa de mapeamento comando/trigger → skill: ver `$IDE/skills/AGENTS
|
|
|
285
285
|
|------|---------|-----------|
|
|
286
286
|
| Planejamento | `eng.start`, `eng.plan` | Somente analise, sem codigo |
|
|
287
287
|
| Implementacao | `eng.work` | Codigo e testes, commit por fase, sem push nem PR |
|
|
288
|
-
| Entrega | `eng.pr` |
|
|
288
|
+
| Entrega | `eng.pr` | Push e PR, depois da pergunta (regra de ouro) |
|
|
289
289
|
|
|
290
290
|
---
|
|
291
291
|
|
package/README.md
CHANGED
|
@@ -14,18 +14,13 @@
|
|
|
14
14
|
|
|
15
15
|
### 1. Instale
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
O Jarvis é instalado **só global** (comando `jarvis` no PATH):
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
npm install -g jarvis-ai-framework
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
**
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
cd workspace-squad/
|
|
27
|
-
npm install jarvis-ai-framework --save-dev
|
|
28
|
-
```
|
|
23
|
+
Não instale o pacote dentro do projeto: o `jarvis init` roda **dentro do projeto** e copia os assets do Jarvis global para a pasta da IDE. Se ele achar uma cópia local (`node_modules` ou dependência no `package.json`), avisa que ela é ignorada.
|
|
29
24
|
|
|
30
25
|
Confira **onde** o binário ficou no PATH (útil se houver mais de uma instalação):
|
|
31
26
|
|
|
@@ -42,8 +37,6 @@ jarvis --version
|
|
|
42
37
|
jarvis init --ide cursor
|
|
43
38
|
```
|
|
44
39
|
|
|
45
|
-
Se instalou só com `--save-dev`, use `npx jarvis init --ide cursor`.
|
|
46
|
-
|
|
47
40
|
IDEs: `windsurf` · `claude` · `cursor` · `codex` · `opencode` · `gemini` · `kiro`
|
|
48
41
|
|
|
49
42
|
### 3. No chat da IDE
|
|
@@ -76,13 +69,6 @@ Global (comando `jarvis` no PATH):
|
|
|
76
69
|
npm install -g /caminho/para/jarvis
|
|
77
70
|
```
|
|
78
71
|
|
|
79
|
-
**Só neste workspace** (não sobe no PATH):
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
cd workspace-squad/
|
|
83
|
-
npm install /caminho/para/jarvis --save-dev
|
|
84
|
-
```
|
|
85
|
-
|
|
86
72
|
**`npm link`** (útil se você altera o clone e quer refletir na hora):
|
|
87
73
|
|
|
88
74
|
```bash
|
|
@@ -90,12 +76,7 @@ cd /caminho/para/jarvis
|
|
|
90
76
|
npm link
|
|
91
77
|
```
|
|
92
78
|
|
|
93
|
-
Isso já registra o comando `jarvis` no global.
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
cd workspace-squad/
|
|
97
|
-
npm link jarvis-ai-framework
|
|
98
|
-
```
|
|
79
|
+
Isso já registra o comando `jarvis` no global. Não rode `npm link jarvis-ai-framework` dentro do workspace: isso cria uma cópia local em `node_modules`, que o `jarvis init` ignora (e avisa).
|
|
99
80
|
|
|
100
81
|
Confira **onde** o binário ficou no PATH (útil se houver mais de uma instalação):
|
|
101
82
|
|
|
@@ -137,12 +118,6 @@ git pull
|
|
|
137
118
|
npm install -g /caminho/para/jarvis
|
|
138
119
|
```
|
|
139
120
|
|
|
140
|
-
**Só no workspace (`--save-dev`):**
|
|
141
|
-
```bash
|
|
142
|
-
cd workspace-squad/
|
|
143
|
-
npm install /caminho/para/jarvis --save-dev
|
|
144
|
-
```
|
|
145
|
-
|
|
146
121
|
**Com `npm link`:** o `git pull` no clone já basta — o link aponta para a pasta.
|
|
147
122
|
|
|
148
123
|
Antes de seguir, confira se o `jarvis` do PATH é o que você acabou de atualizar:
|
|
@@ -164,7 +139,7 @@ jarvis init --ide cursor
|
|
|
164
139
|
|
|
165
140
|
Isso copia de novo `agents/`, `skills/`, `workflows/`, `rules/`, `templates/` para `.$IDE/` e atualiza o `jarvis-lock.json`.
|
|
166
141
|
|
|
167
|
-
|
|
142
|
+
Esse é o único caminho de atualização dos assets: o `npm install -g` não sincroniza nenhum projeto sozinho. Quando os assets do projeto estão atrás do Jarvis global, o `/jarvis-init` avisa no início e oferece o `jarvis init --upgrade`.
|
|
168
143
|
|
|
169
144
|
### 4. ENV.md (só se houver variáveis novas)
|
|
170
145
|
|
|
@@ -183,8 +158,8 @@ Escolha **Upgrade (C)** — adiciona chaves novas do template sem apagar os valo
|
|
|
183
158
|
| Passo | O que muda |
|
|
184
159
|
|-------|------------|
|
|
185
160
|
| `git pull` | Código do framework no clone |
|
|
186
|
-
| `npm install -g`
|
|
187
|
-
| `jarvis init`
|
|
161
|
+
| `npm install -g` | Binário `jarvis` + pacote que o `init` lê |
|
|
162
|
+
| `jarvis init` | Arquivos em `.$IDE/` (skills, agents, workflows…) e o Context7 no arquivo de MCP da IDE (ex.: `.mcp.json` no Claude Code; só acrescenta, sem apagar outros servidores) |
|
|
188
163
|
| `/jarvis-init` Upgrade | Só `$IDE/ENV.md` (variáveis faltantes) e, se você aceitar o passo opcional "adicionar as stacks", as listas de especializações |
|
|
189
164
|
|
|
190
165
|
`ENV.md`, `.jarvis/sessions/` e o `.gitignore` do workspace **não** são sobrescritos pelo sync de assets. O `.gitignore` só é criado ou alterado quando a raiz tem `.git`; sem `.git` (como no modo workspace) a raiz não é versionada e o init não o toca.
|
|
@@ -212,7 +187,7 @@ O `/jarvis-init` pergunta o `ARTIFACT_STYLE` (variável do `ENV.md`):
|
|
|
212
187
|
| Valor | O que acontece |
|
|
213
188
|
|---|---|
|
|
214
189
|
| `ai-generated` (padrão) | Como sempre: metadados, links de rastreabilidade e padrões da ferramenta |
|
|
215
|
-
| `human-generated` | Nada do que o Jarvis publica (commit, PR/MR, comentário no card, issue) leva marca de IA ou da IDE: o `/eng.pr` confere e limpa antes do push. Todo documento gerado pergunta, no fim, se você quer a versão humanizada, gravada ao lado como `{nome}.public.md` para repassar a clientes ou stakeholders |
|
|
190
|
+
| `human-generated` | Nada do que o Jarvis publica (commit, PR/MR, comentário no card, issue; sempre depois da pergunta) leva marca de IA ou da IDE: o `/eng.pr` confere e limpa antes do push. Todo documento gerado pergunta, no fim, se você quer a versão humanizada, gravada ao lado como `{nome}.public.md` para repassar a clientes ou stakeholders |
|
|
216
191
|
|
|
217
192
|
Com `human-generated`, o `/jarvis-init` copia a rule `rules/artifact-style-rules.md` (eixo `ARTIFACT_STYLE` do `Applies to`); com `ai-generated`, ela nem existe na sessão. Trocou o valor à mão? Rode `/jarvis-init upgrade`.
|
|
218
193
|
|
|
@@ -253,6 +228,6 @@ Precisa de ajuda?
|
|
|
253
228
|
- **Engenharia (um guia por comando `eng.*`)** — [`docs/engenharia/`](docs/engenharia/README.md)
|
|
254
229
|
- **Indice de docs/** — [`docs/README.md`](docs/README.md)
|
|
255
230
|
- **Instrucoes para agentes / mapa de skills** — `AGENTS.md`
|
|
256
|
-
- **Issues/Feedback** — skill `jarvis-report-issue` (sem a CLI do host (`gh`), sem login
|
|
231
|
+
- **Issues/Feedback** — skill `jarvis-report-issue` (pergunta antes de abrir; sem a CLI do host (`gh`), sem login, sem rede ou com o seu Não, a issue fica em `.jarvis/issues/issue-{desc}.md` para abrir à mão)
|
|
257
232
|
- **Duvidas sobre comandos** — Pergunte diretamente ao agent:
|
|
258
233
|
`"Como funciona /eng.start?"` | `"Qual a diferenca entre /eng.work e /pr?"` | `"O que e CDD?"`
|
|
@@ -66,7 +66,7 @@ Ativado quando há suspeita de dado incorreto, queda de volume ou falha de pipel
|
|
|
66
66
|
- Identificar causa raiz: fonte, transformação ou carga
|
|
67
67
|
- Verificar logs de execução e checks de qualidade
|
|
68
68
|
- Propor correção e plano de reprocessamento idempotente
|
|
69
|
-
- Alertar squads afetadas com contexto claro
|
|
69
|
+
- Alertar squads afetadas com contexto claro (mostrando a mensagem e perguntando antes de enviar, regra de ouro)
|
|
70
70
|
|
|
71
71
|
**Skill integrada**: `$IDE/skills/eng-data/SKILL.md` + `DATA_SPECIALIZATIONS`
|
|
72
72
|
|
|
@@ -126,7 +126,7 @@ CONTEXT_PROFILE:
|
|
|
126
126
|
|
|
127
127
|
| Sinal | Urgência | Comportamento |
|
|
128
128
|
|-------|----------|---------------|
|
|
129
|
-
| `dado errado em produção`, `dashboard parado`, `pipeline falhou` | **CRÍTICA** | Fast track: diagnóstico imediato, isolar causa, comunicar squads afetadas |
|
|
129
|
+
| `dado errado em produção`, `dashboard parado`, `pipeline falhou` | **CRÍTICA** | Fast track: diagnóstico imediato, isolar causa, comunicar squads afetadas (texto pronto; o envio só depois da pergunta, regra de ouro) |
|
|
130
130
|
| `atraso`, `dado desatualizado`, `queda de volume` | **ALTA** | Investigação ágil, reprocessar com idempotência |
|
|
131
131
|
| `nova feature`, `novo pipeline`, `contrato de dados` | **NORMAL** | Fluxo completo: documentar antes, implementar, validar |
|
|
132
132
|
| `melhoria`, `refactoring de query`, `otimização` | **BAIXA** | Análise cuidadosa de impacto antes de qualquer mudança |
|
|
@@ -226,7 +226,7 @@ Para detecção automática de contexto de tarefas:
|
|
|
226
226
|
### 3. Qualidade e Monitoramento
|
|
227
227
|
|
|
228
228
|
- Bloquear promoção de camada quando falha de qualidade ocorre
|
|
229
|
-
- Alertar no canal do time de Data quando falha afeta `gold`
|
|
229
|
+
- Alertar no canal do time de Data quando falha afeta `gold` (depois da pergunta, regra de ouro; o alerta automático de pipeline é do runtime)
|
|
230
230
|
- Manter tabela `gold.pipeline_audit` com metadados de execução
|
|
231
231
|
|
|
232
232
|
### 4. Política de Dados Sensíveis
|
|
@@ -15,7 +15,7 @@ tools: Read, Glob, Grep, Bash, Write, Edit
|
|
|
15
15
|
|
|
16
16
|
Você transforma o que foi **implementado** num registro que dure. Duas pessoas vão ler o que você escreve:
|
|
17
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
|
|
18
|
+
- **IAs:** o `/warm-up`, o `/eng.start` e os `/prod.spec.*` consultam o Central docs como verdade sobre o que está implementado.
|
|
19
19
|
|
|
20
20
|
Por isso o texto tem de ser **completo, autossuficiente e sem ambiguidade**.
|
|
21
21
|
|
|
@@ -46,7 +46,7 @@ Por isso o texto tem de ser **completo, autossuficiente e sem ambiguidade**.
|
|
|
46
46
|
4. `git log {base}..HEAD --format='%h|%an|%ad|%s' --date=short` e `git diff --stat {base}...HEAD`.
|
|
47
47
|
5. O código alterado, só leitura, para confirmar o comportamento real.
|
|
48
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.
|
|
49
|
+
7. O `gate-checklist.md` (a rodada mais recente; as anteriores, `gate-checklist-rodada-{N}.md`, são histórico) e o `pull-request.md` da sessão, se existirem.
|
|
50
50
|
|
|
51
51
|
## O que você produz
|
|
52
52
|
|
|
@@ -39,7 +39,7 @@ Você opera estritamente dentro do **contexto de tarefas Jira e especificações
|
|
|
39
39
|
- Casos extremos não cobertos
|
|
40
40
|
- Riscos potenciais, ambiguidades ou complexidade oculta
|
|
41
41
|
|
|
42
|
-
5. Comentar melhorias
|
|
42
|
+
5. Comentar melhorias no Jira pelo `/eng-global-task-comment`, que mostra o texto e pergunta antes de enviar (regra de ouro, `eng.integrations-rules.md`):
|
|
43
43
|
- Sugerir redação mais clara
|
|
44
44
|
- Propor critérios de aceitação faltantes
|
|
45
45
|
- Recomendar cenários de teste adicionais
|
|
@@ -54,7 +54,7 @@ Você opera estritamente dentro do **contexto de tarefas Jira e especificações
|
|
|
54
54
|
|
|
55
55
|
### Formato de Saída (Sempre Estruturado)
|
|
56
56
|
|
|
57
|
-
Use o seguinte formato
|
|
57
|
+
Use o seguinte formato nos comentários Jira (eles só saem depois da pergunta, regra de ouro):
|
|
58
58
|
|
|
59
59
|
**Resumo da Revisão de Qualidade**
|
|
60
60
|
|
package/bin/README.md
CHANGED
|
@@ -7,11 +7,11 @@ Fonte do binário `jarvis` (instalado via `npm install -g jarvis-ai-framework`,
|
|
|
7
7
|
```
|
|
8
8
|
bin/
|
|
9
9
|
├── jarvis.js # Entrypoint (shebang). ~10 linhas, não cresce.
|
|
10
|
-
├── postinstall.js # Roda no `npm install` (
|
|
10
|
+
├── postinstall.js # Roda no `npm install` (só imprime as dicas de uso)
|
|
11
11
|
├── commands/ # Um arquivo por comando. Lógica pura, zero commander.
|
|
12
12
|
│ ├── init.js, list.js, info.js, whoami.js, ...
|
|
13
13
|
│ ├── docs-sync.js, docs-publish.js
|
|
14
|
-
│ └──
|
|
14
|
+
│ └── install-rtk.js, tokens.js, map.js
|
|
15
15
|
└── lib/
|
|
16
16
|
├── cli/
|
|
17
17
|
│ ├── program.js # Único lugar que monta o commander — ver "Arquitetura"
|
|
@@ -119,7 +119,7 @@ if (fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
|
119
119
|
|
|
120
120
|
## Variáveis de ambiente lidas diretamente (fora do ENV.md)
|
|
121
121
|
|
|
122
|
-
`bin/lib/tasks/comment.js` e `bin/lib/vcs/*.js` leem `process.env` direto (`TASK_MANAGER`, `TASK_MANAGER_ACCESS`, `TASK_MANAGER_URL_BASE`, `VERSION_CONTROL`, etc.; nenhum token: o login é o da CLI do vendor) — não passam pelo `env-loader.js`/ENV.md. O `jarvis tasks comment` e o `jarvis vcs create-merge` completam o que faltar no ambiente lendo o `$IDE/ENV.md` do workspace (`readFileEnv`/`resolveFileEnv` em `integrations/cli-runner.js`, com `--ide`/`--env-file`; o ambiente do processo vence; `setting` tira aspas e comentário de fim de linha), então os skills não precisam exportar nada nem usar `eval`. O `accessGate` decide antes de qualquer envio: só `cli` (ou vazio, com aviso) segue; `manual`, valor inválido e ENV.md ilegível saem com 3. O ENV.md lido é repassado ao `createMergeRequest` (`fileEnvResult`), inclusive pelo Central docs. Se um comando novo precisar ler o `ENV.md` diretamente, use `env-loader.js#resolveEnvPath`/`loadEnv` (ver `whoami.js
|
|
122
|
+
`bin/lib/tasks/comment.js` e `bin/lib/vcs/*.js` leem `process.env` direto (`TASK_MANAGER`, `TASK_MANAGER_ACCESS`, `TASK_MANAGER_URL_BASE`, `VERSION_CONTROL`, etc.; nenhum token: o login é o da CLI do vendor) — não passam pelo `env-loader.js`/ENV.md. O `jarvis tasks comment` e o `jarvis vcs create-merge` completam o que faltar no ambiente lendo o `$IDE/ENV.md` do workspace (`readFileEnv`/`resolveFileEnv` em `integrations/cli-runner.js`, com `--ide`/`--env-file`; o ambiente do processo vence; `setting` tira aspas e comentário de fim de linha), então os skills não precisam exportar nada nem usar `eval`. O `accessGate` decide antes de qualquer envio: só `cli` (ou vazio, com aviso) segue; `manual`, valor inválido e ENV.md ilegível saem com 3. O ENV.md lido é repassado ao `createMergeRequest` (`fileEnvResult`), inclusive pelo Central docs. Se um comando novo precisar ler o `ENV.md` diretamente, use `env-loader.js#resolveEnvPath`/`loadEnv` (ver `whoami.js` e `tokens.js` como exemplo) em vez de `process.env`.
|
|
123
123
|
|
|
124
124
|
## Testes
|
|
125
125
|
|
package/bin/commands/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
2
|
-
import { join, dirname, basename } from "node:path";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync } from "node:fs";
|
|
2
|
+
import { join, dirname, basename, resolve, sep } from "node:path";
|
|
3
3
|
import { createInterface } from "node:readline";
|
|
4
4
|
import { syncAssets } from "../lib/core/sync-engine.js";
|
|
5
5
|
import { discoverAll } from "../lib/core/scanner.js";
|
|
@@ -16,6 +16,7 @@ import { getPackageInfo, getFrameworkRoot } from "../lib/utils/paths.js";
|
|
|
16
16
|
import { logger, configureFromFlags } from "../lib/utils/logger.js";
|
|
17
17
|
import { resolveEnvPath } from "../lib/env-loader.js";
|
|
18
18
|
import { LOCK_FILE } from "../lib/config/constants.js";
|
|
19
|
+
import { compareVersions, localInstall } from "../lib/utils/version.js";
|
|
19
20
|
import {
|
|
20
21
|
findStaleSkills,
|
|
21
22
|
registeredSpecializations,
|
|
@@ -133,6 +134,10 @@ export async function init(flags) {
|
|
|
133
134
|
|
|
134
135
|
const ideDir = join(cwd, `.${getIDEFolder(ide)}`);
|
|
135
136
|
|
|
137
|
+
// Avisos de versão antes da pergunta de reinstalação: quem responde "s" (ou usa --force)
|
|
138
|
+
// já sabe se vai rebaixar os assets.
|
|
139
|
+
warnVersionMismatch(cwd);
|
|
140
|
+
|
|
136
141
|
// Reinstall: --force ou confirmação "s" devem sobrescrever assets (cpSync force:true).
|
|
137
142
|
let forceSync = !!flags.force;
|
|
138
143
|
|
|
@@ -257,6 +262,53 @@ function ideFromEnvPath(envPath) {
|
|
|
257
262
|
return getIDEValues().find((v) => `.${getIDEFolder(v)}` === folder);
|
|
258
263
|
}
|
|
259
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Avisos de versão antes do sync. O Jarvis é instalado só global:
|
|
267
|
+
* - cópia local no projeto (`node_modules` ou dependência no `package.json`) é ignorada;
|
|
268
|
+
* se é ela que está rodando (`npx jarvis`, `./node_modules/.bin/jarvis`), o aviso diz isso;
|
|
269
|
+
* - lock do projeto mais novo que o Jarvis em uso: o sync rebaixaria os assets.
|
|
270
|
+
* Recebe o lock lido antes do `syncAssets`, que o reescreve.
|
|
271
|
+
* @param {string} workspaceDir
|
|
272
|
+
* @param {string} [lock] - versão do `jarvis-lock.json` do projeto
|
|
273
|
+
* @returns {{ downgrade: boolean, running: string }} `downgrade` = lock mais novo que o Jarvis em uso
|
|
274
|
+
*/
|
|
275
|
+
export function warnVersionMismatch(workspaceDir, lock = readLockVersion(workspaceDir)) {
|
|
276
|
+
const running = getPackageInfo().version;
|
|
277
|
+
// Caminhos reais dos dois lados: o Node já resolve o link do script (`import.meta.url`),
|
|
278
|
+
// então uma cópia por `npm link` em node_modules só bate com o realpath.
|
|
279
|
+
const real = (p) => {
|
|
280
|
+
try {
|
|
281
|
+
return realpathSync(p);
|
|
282
|
+
} catch {
|
|
283
|
+
return resolve(p);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
const root = real(getFrameworkRoot());
|
|
287
|
+
const localDir = join(workspaceDir, "node_modules", "jarvis-ai-framework");
|
|
288
|
+
const runningLocal =
|
|
289
|
+
(root + sep).startsWith(real(join(workspaceDir, "node_modules")) + sep) ||
|
|
290
|
+
(existsSync(localDir) && root === real(localDir));
|
|
291
|
+
const local = localInstall(workspaceDir);
|
|
292
|
+
if (runningLocal) {
|
|
293
|
+
logger.info(
|
|
294
|
+
`${BLUE}ℹ️ O Jarvis em uso (${running}) é o mesmo de node_modules (cópia local do projeto). O Jarvis é instalado global: npm install -g jarvis-ai-framework, rode \`jarvis\` (sem npx) e remova a cópia local.${NC}`
|
|
295
|
+
);
|
|
296
|
+
} else if (local) {
|
|
297
|
+
logger.info(
|
|
298
|
+
`${BLUE}ℹ️ O Jarvis é instalado global (npm install -g jarvis-ai-framework). A cópia local deste projeto (${local.version} em ${local.source}) é ignorada: pode removê-la.${NC}`
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
const downgrade = compareVersions(lock, running) === 1;
|
|
302
|
+
if (downgrade) {
|
|
303
|
+
const who = runningLocal ? "o Jarvis em uso (cópia local)" : "o seu jarvis global";
|
|
304
|
+
logger.info(
|
|
305
|
+
`${YELLOW}⚠️ Os assets deste projeto são da ${lock}, mas ${who} é a ${running}. Atualize o global: npm install -g jarvis-ai-framework${NC}`
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
if (runningLocal || local || downgrade) logger.info("");
|
|
309
|
+
return { downgrade, running };
|
|
310
|
+
}
|
|
311
|
+
|
|
260
312
|
function readLockVersion(workspaceDir) {
|
|
261
313
|
try {
|
|
262
314
|
return (
|
|
@@ -319,6 +371,27 @@ async function runUpgrade(cwd, flags) {
|
|
|
319
371
|
const workspaceDir = resolved.root;
|
|
320
372
|
const envPath = resolved.path;
|
|
321
373
|
const previousVersion = readLockVersion(workspaceDir);
|
|
374
|
+
const { downgrade, running } = warnVersionMismatch(workspaceDir, previousVersion);
|
|
375
|
+
if (downgrade && !flags.yes) {
|
|
376
|
+
let go = false;
|
|
377
|
+
if (process.stdin.isTTY) {
|
|
378
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
379
|
+
const answer = await ask(
|
|
380
|
+
rl,
|
|
381
|
+
`Seguir e rebaixar os assets de ${previousVersion} para ${running}? (s/N): `
|
|
382
|
+
);
|
|
383
|
+
rl.close();
|
|
384
|
+
go = answer.trim().toLowerCase() === "s";
|
|
385
|
+
} else {
|
|
386
|
+
logger.info(`${DIM} Sem terminal interativo e sem --yes: nada será rebaixado.${NC}`);
|
|
387
|
+
}
|
|
388
|
+
if (!go) {
|
|
389
|
+
logger.info(
|
|
390
|
+
`${YELLOW}Upgrade interrompido: atualize o global (npm install -g jarvis-ai-framework) e rode de novo.${NC}\n`
|
|
391
|
+
);
|
|
392
|
+
return 1;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
322
395
|
|
|
323
396
|
// 1. Arquivos do framework (o ENV.md não está entre os sincronizados)
|
|
324
397
|
logger.info(`${BLUE}⬆️ Upgrade do Jarvis em .${getIDEFolder(ide)}/${NC}\n`);
|
package/bin/lib/cli/program.js
CHANGED
|
@@ -22,7 +22,6 @@ import { info } from "../../commands/info.js";
|
|
|
22
22
|
import { whoami } from "../../commands/whoami.js";
|
|
23
23
|
import { docsSync } from "../../commands/docs-sync.js";
|
|
24
24
|
import { docsPublish } from "../../commands/docs-publish.js";
|
|
25
|
-
import { qaSignoff } from "../../commands/qa-signoff.js";
|
|
26
25
|
import { installRtk } from "../../commands/install-rtk.js";
|
|
27
26
|
import { tokens } from "../../commands/tokens.js";
|
|
28
27
|
import { map } from "../../commands/map.js";
|
|
@@ -93,7 +92,10 @@ export function buildProgram() {
|
|
|
93
92
|
"--upgrade",
|
|
94
93
|
"Atualiza um projeto já configurado: arquivos do framework, variáveis novas do ENV e pastas de documentos"
|
|
95
94
|
)
|
|
96
|
-
.option(
|
|
95
|
+
.option(
|
|
96
|
+
"--yes",
|
|
97
|
+
"Com --upgrade, move os documentos para as pastas novas e aceita rebaixar os assets sem perguntar"
|
|
98
|
+
)
|
|
97
99
|
.option(
|
|
98
100
|
"--remove-stale",
|
|
99
101
|
"Com --upgrade, remove sem perguntar os skills instalados que saíram do framework (só os listados)"
|
|
@@ -162,12 +164,6 @@ export function buildProgram() {
|
|
|
162
164
|
);
|
|
163
165
|
withLogOptions(installRtkCmd).action((options) => installRtk(toLegacyFlags(options)));
|
|
164
166
|
|
|
165
|
-
const qaSignoffCmd = cmd(program, "qa-signoff")
|
|
166
|
-
.description("Verificar sign-off QA válido para a branch atual (usado pelo CI)")
|
|
167
|
-
.option("--branch <branch>", "Branch a verificar (padrão: lido do git)")
|
|
168
|
-
.option("--max-age <horas>", "Validade máxima em horas (padrão: 24)");
|
|
169
|
-
withEnvOptions(qaSignoffCmd).action((options) => qaSignoff(toLegacyFlags(options)));
|
|
170
|
-
|
|
171
167
|
cmd(program, "tokens")
|
|
172
168
|
.description("Estimar o que carrega no início da sessão")
|
|
173
169
|
.option("--hub <hub>")
|
|
@@ -575,7 +575,7 @@ function writeLockFile(targetDir, ideDir, ide, frameworkRoot) {
|
|
|
575
575
|
|
|
576
576
|
const lockContent = JSON.stringify(lock, null, 2) + "\n";
|
|
577
577
|
|
|
578
|
-
// Write lock file to project root (
|
|
578
|
+
// Write lock file to project root (lido pelo jarvis init --upgrade e pelo Passo 0 do /jarvis-init)
|
|
579
579
|
writeFileSync(join(targetDir, LOCK_FILE), lockContent);
|
|
580
580
|
|
|
581
581
|
// Also write lock file to IDE folder
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Leitura de frontmatter YAML (`---\n...\n---`) compartilhada
|
|
3
|
-
* entre scanner.js, validate-frontmatter.js
|
|
3
|
+
* entre scanner.js, validate-frontmatter.js e sync-engine.js —
|
|
4
4
|
* cada um tinha sua própria cópia da mesma regex de bloco.
|
|
5
5
|
* @module utils/frontmatter
|
|
6
6
|
*/
|
package/bin/lib/utils/paths.js
CHANGED
|
@@ -18,7 +18,8 @@ export function getFrameworkRoot() {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
throw new Error(
|
|
21
|
-
"
|
|
21
|
+
"Não foi possível localizar os assets do framework.\n" +
|
|
22
|
+
"Instale o Jarvis global: npm install -g jarvis-ai-framework"
|
|
22
23
|
);
|
|
23
24
|
}
|
|
24
25
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { lstatSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
const PACKAGE = "jarvis-ai-framework";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Compara duas versões `x.y.z` (aceita `v` na frente e ignora o sufixo, como `-beta.1`).
|
|
8
|
+
* @param {string} a
|
|
9
|
+
* @param {string} b
|
|
10
|
+
* @returns {-1 | 0 | 1 | null} `null` se uma das duas não for uma versão legível
|
|
11
|
+
*/
|
|
12
|
+
export function compareVersions(a, b) {
|
|
13
|
+
const parse = (v) => {
|
|
14
|
+
const m = String(v ?? "")
|
|
15
|
+
.trim()
|
|
16
|
+
.match(/^v?(\d+)\.(\d+)\.(\d+)/);
|
|
17
|
+
return m ? m.slice(1).map(Number) : null;
|
|
18
|
+
};
|
|
19
|
+
const pa = parse(a);
|
|
20
|
+
const pb = parse(b);
|
|
21
|
+
if (!pa || !pb) return null;
|
|
22
|
+
for (let i = 0; i < 3; i++) {
|
|
23
|
+
if (pa[i] !== pb[i]) return pa[i] > pb[i] ? 1 : -1;
|
|
24
|
+
}
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// lstat não segue o link: um link simbólico quebrado também conta como presente.
|
|
29
|
+
function exists(path) {
|
|
30
|
+
try {
|
|
31
|
+
lstatSync(path);
|
|
32
|
+
return true;
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function readJson(path) {
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Cópia local do Jarvis no projeto, que é ignorada (o Jarvis é instalado só global).
|
|
48
|
+
* @param {string} workspaceDir
|
|
49
|
+
* @returns {{ version: string, source: string } | null} a versão instalada em `node_modules`
|
|
50
|
+
* ("desconhecida" se ilegível), ou a faixa declarada no `package.json`; `null` sem nenhuma das duas
|
|
51
|
+
*/
|
|
52
|
+
export function localInstall(workspaceDir) {
|
|
53
|
+
const installed = join(workspaceDir, "node_modules", PACKAGE, "package.json");
|
|
54
|
+
if (exists(join(workspaceDir, "node_modules", PACKAGE))) {
|
|
55
|
+
// Pasta (ou link, mesmo quebrado) presente, sem package.json legível: ainda é uma cópia local.
|
|
56
|
+
const version = readJson(installed)?.version || "desconhecida";
|
|
57
|
+
return { version, source: `node_modules/${PACKAGE}` };
|
|
58
|
+
}
|
|
59
|
+
const pkg = readJson(join(workspaceDir, "package.json"));
|
|
60
|
+
for (const field of ["dependencies", "devDependencies"]) {
|
|
61
|
+
const range = pkg?.[field]?.[PACKAGE];
|
|
62
|
+
if (range) return { version: range, source: `package.json (${field})` };
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
package/bin/postinstall.js
CHANGED
|
@@ -1,41 +1,17 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
1
|
import { execSync } from "node:child_process";
|
|
3
|
-
import { join, dirname } from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// ── Sincronizar assets para projetos com jarvis-lock.json ───────────────────
|
|
13
|
-
if (existsSync(lockPath)) {
|
|
14
|
-
try {
|
|
15
|
-
const lock = JSON.parse(readFileSync(lockPath, "utf-8"));
|
|
16
|
-
const { syncAssets } = await import("./lib/core/sync-engine.js");
|
|
17
|
-
const { getWorkflowsFolder } = await import("./lib/config/ide-config.js");
|
|
18
|
-
const { logger } = await import("./lib/utils/logger.js");
|
|
19
|
-
logger.info(`\n jarvis-framework — syncing to .${lock.ide}/\n`);
|
|
20
|
-
const result = syncAssets(cwd, lock.ide, {
|
|
21
|
-
force: true,
|
|
22
|
-
workflowsFolder: getWorkflowsFolder(lock.ide),
|
|
23
|
-
});
|
|
24
|
-
logger.info(` ${result.copied.length} items synced.\n`);
|
|
25
|
-
} catch {}
|
|
26
|
-
} else {
|
|
27
|
-
const { logger } = await import("./lib/utils/logger.js");
|
|
28
|
-
logger.info(`
|
|
29
|
-
jarvis-framework installed.
|
|
30
|
-
Run: npx jarvis init --ide windsurf
|
|
3
|
+
// O Jarvis é instalado só global (npm install -g); o postinstall só dá as dicas.
|
|
4
|
+
// A atualização dos assets de um projeto tem um caminho só: jarvis init --upgrade, dentro dele.
|
|
5
|
+
const { logger } = await import("./lib/utils/logger.js");
|
|
6
|
+
logger.info(`
|
|
7
|
+
jarvis-ai-framework instalado.
|
|
8
|
+
No projeto: jarvis init --ide {ide} (ou jarvis init --upgrade para atualizar os assets)
|
|
31
9
|
`);
|
|
32
|
-
}
|
|
33
10
|
|
|
34
11
|
// ── Sugestão RTK (sempre, se rtk não estiver instalado) ─────────────────────
|
|
35
12
|
try {
|
|
36
13
|
execSync("rtk gain --help 2>/dev/null", { stdio: "pipe" });
|
|
37
14
|
} catch {
|
|
38
|
-
const { logger } = await import("./lib/utils/logger.js");
|
|
39
15
|
logger.info(` 💡 Dica: instale o RTK para economizar 60-90% dos tokens de shell.`);
|
|
40
|
-
logger.info(`
|
|
16
|
+
logger.info(` jarvis install-rtk\n`);
|
|
41
17
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jarvis-ai-framework",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.1.0",
|
|
4
4
|
"description": "Jarvis framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"prepublishOnly": "echo 'Publishing jarvis-framework...'",
|
|
12
12
|
"publish:gitlab": "npm publish",
|
|
13
13
|
"test:comandos": "node test/comandos-docs.test.js",
|
|
14
|
-
"test:filtro": "node --test test/profile-filter.test.js test/token-report.test.js test/flow-map.test.js test/env-loader.test.js test/sync-engine.test.js test/vcs-api.test.js test/fetch-file.test.js test/publish-file.test.js test/docs-storage.test.js test/env-upgrade.test.js test/docs-migrate.test.js test/init-upgrade.test.js test/workspace-mode.test.js test/stale-skills.test.js test/session-scan.test.js test/framework-refs.test.js test/validate-frontmatter.test.js test/mcp-config.test.js test/integrations-catalog.test.js test/cli-runner.test.js test/tasks-comment.test.js",
|
|
14
|
+
"test:filtro": "node --test test/profile-filter.test.js test/token-report.test.js test/flow-map.test.js test/env-loader.test.js test/sync-engine.test.js test/vcs-api.test.js test/fetch-file.test.js test/publish-file.test.js test/docs-storage.test.js test/env-upgrade.test.js test/docs-migrate.test.js test/init-upgrade.test.js test/workspace-mode.test.js test/stale-skills.test.js test/session-scan.test.js test/framework-refs.test.js test/validate-frontmatter.test.js test/mcp-config.test.js test/integrations-catalog.test.js test/cli-runner.test.js test/tasks-comment.test.js test/version.test.js test/gate-checklist-rodadas.test.js test/publish-comments-rules.test.js",
|
|
15
15
|
"lint": "eslint bin/ test/",
|
|
16
16
|
"lint:fix": "eslint bin/ test/ --fix",
|
|
17
17
|
"format": "prettier --write bin/ test/",
|
package/rules/AGENTS.md
CHANGED
|
@@ -169,7 +169,7 @@ Links para documentacao relacionada.
|
|
|
169
169
|
|------|----------|-----------|
|
|
170
170
|
| Planejamento | `eng.start`, `eng.plan` | Somente analise, SEM codigo |
|
|
171
171
|
| Implementacao | `eng.work` | Codigo e testes, commit por fase, SEM push nem PR |
|
|
172
|
-
| Entrega | `eng.pr` |
|
|
172
|
+
| Entrega | `eng.pr` | Push e PR, depois da pergunta (regra de ouro) |
|
|
173
173
|
|
|
174
174
|
### Seguranca
|
|
175
175
|
|
|
@@ -67,7 +67,7 @@ expect_table_row_count_to_be_between(min_value=last_run_count * 0.5)
|
|
|
67
67
|
### Falha de qualidade
|
|
68
68
|
|
|
69
69
|
- **Bronze → Silver**: falha bloqueia a promoção. Dados permanecem em bronze.
|
|
70
|
-
- **Silver → Gold**: falha bloqueia publicação. Alerta no Slack canal do time de Data.
|
|
70
|
+
- **Silver → Gold**: falha bloqueia publicação. Alerta automático do pipeline no Slack canal do time de Data (runtime; um aviso enviado pelo Jarvis só sai depois da pergunta, regra de ouro).
|
|
71
71
|
- Nunca silenciar falhas — registrar no log com contexto da execução.
|
|
72
72
|
|
|
73
73
|
---
|
|
@@ -116,7 +116,7 @@ logger.info({
|
|
|
116
116
|
|
|
117
117
|
- **AWS Glue**: logs automáticos no CloudWatch (`/aws-glue/jobs/output`)
|
|
118
118
|
- **Airflow**: logs nas tasks do DAG + CloudWatch quando em produção
|
|
119
|
-
- **Erros críticos**:
|
|
119
|
+
- **Erros críticos**: alerta automático do pipeline no canal Slack do time de Data (`#data-alerts` ou equivalente; runtime. Um aviso enviado pelo Jarvis só sai depois da pergunta, regra de ouro)
|
|
120
120
|
|
|
121
121
|
### Retenção
|
|
122
122
|
|
|
@@ -65,7 +65,7 @@ env_file: "@/ENV.md"
|
|
|
65
65
|
- No modo workspace a raiz (a pasta que contém `$IDE/`) **não é um repositório** e guarda itens fora do git (`.claude/`, `.jarvis/`, `.vscode/`, `node_modules/`). `grep`, `ls` e `Glob` na raiz leem tudo isso como se fosse código do projeto e confundem a análise.
|
|
66
66
|
- **Código do projeto** = só as subpastas com `.git/` (ou as de `WORKSPACE_REPOS`, quando preenchido). Busque e leia código **dentro delas**.
|
|
67
67
|
- **Ignore nas buscas de código**: a pasta da IDE ativa (derivada do `IDE`, tabela acima), `.jarvis/`, `.vscode/`, `node_modules/` e o `CDD-MIND-MAP.md`. Leia esses itens **só quando o workflow mandar** (ENV.md, rules, skills, templates, sessão).
|
|
68
|
-
- **`docs/jarvis/` não é ignorada**: guarda os documentos de trabalho gerados (PRD, FRD, ARD, RFC, SPEC, discoveries, Central docs), fora do versionamento. Leia-a sob demanda, como documento de trabalho, e não como código.
|
|
68
|
+
- **`docs/jarvis/` não é ignorada**: guarda os documentos de trabalho gerados (PRD, FRD, ARD, RFC, SPEC, discoveries) e, com storage `filesystem`, a cópia local do Central docs (`central-docs/`, no local padrão; o registro do implementado), fora do versionamento. Leia-a sob demanda, como documento de trabalho ou registro, e não como código.
|
|
69
69
|
- **Pastas de outras IDEs** nunca são lidas (vale o "Isolamento de IDE" acima).
|
|
70
70
|
- Com `WORKSPACE_MODE=project`, o git já delimita o código e esta regra não age.
|
|
71
71
|
|
|
@@ -105,7 +105,7 @@ O agente DEVE incluir no checklist de pre-PR as seguintes verificacoes de segura
|
|
|
105
105
|
- [ ] **Outputs**: erros nao vazam detalhes internos
|
|
106
106
|
|
|
107
107
|
Se o PR toca em areas sensiveis (auth, sessions, RBAC, CORS, CSP, permissoes), o agente DEVE:
|
|
108
|
-
1.
|
|
108
|
+
1. Registrar no PR Brief do `gate-checklist.md` que o PR leva o label `security` e orientar a pessoa a adiciona-lo ao PR (o Jarvis nao altera o PR no vendor sem perguntar, regra de ouro; o `jarvis vcs create-merge` nao poe label)
|
|
109
109
|
2. Seguir o gate de seguranca inline do `eng.pre-pr` (sanitizacao, auth guards, headers, secrets scan, `npm audit`) antes do merge
|
|
110
110
|
|
|
111
111
|
---
|
|
@@ -9,7 +9,7 @@ O Jarvis não assume Jira, GitLab ou Slack. Leia `$IDE/ENV.md` e siga a cadeia d
|
|
|
9
9
|
| Variável | Vendors | Como |
|
|
10
10
|
|----------|---------|------|
|
|
11
11
|
| `TASK_MANAGER` (+ `TASK_MANAGER_ACCESS`, `TASK_MANAGER_URL_BASE`) | jira (`acli`, só Cloud), github (`gh`), gitlab (`glab`) | `jarvis tasks comment` |
|
|
12
|
-
| `VERSION_CONTROL` (+ `VERSION_CONTROL_ACCESS`) | github (`gh`), gitlab (`glab`); repo vem do `git remote` | `jarvis vcs create-merge` / `create-issue` |
|
|
12
|
+
| `VERSION_CONTROL` (+ `VERSION_CONTROL_ACCESS`) | github (`gh`), gitlab (`glab`); no `create-merge` o repo vem do `git remote`, no `create-issue` vai em `--repo` | `jarvis vcs create-merge` / `create-issue` |
|
|
13
13
|
| `CENTRAL_DOCS_STORAGE` | filesystem (s3 e gdrive no futuro) | `jarvis docs fetch` / `sync` / `publish` |
|
|
14
14
|
| `MESSAGE_COMUNICATOR` | slack, discord, teams | runtime `communicator/` |
|
|
15
15
|
|
|
@@ -41,11 +41,15 @@ Qual o seu número de controle para esta tarefa?
|
|
|
41
41
|
|
|
42
42
|
Com board definido, se o key não veio nos argumentos, perguntar o id do card naquele vendor (ex: Jira `TASK-123`, GitHub `#42`).
|
|
43
43
|
|
|
44
|
+
## Nada é publicado sem perguntar
|
|
45
|
+
|
|
46
|
+
É a **regra de ouro**: comentário, PR/MR, issue, push e publicação no Central docs só saem depois de mostrar o texto e perguntar, na hora do envio, com `AskUserQuestion` (sem a ferramenta, a tabela de `prod-rules.md`): **Sim, publicar** / **Não, manter só na sessão** (rótulos equivalentes por contexto). A pergunta vale para cada envio; uma aprovação não vale para o próximo. **Exceção:** documentos aprovados juntos (como a consolidação do `eng.spec-consolidate`) são um envio; e a escolha da Fase 0 do `eng.pr` vale como a pergunta do push e do PR e, conforme a opção, como a revisão do texto. Sem o Sim, o texto fica na sessão (`task-comment-{YYYYMMDD-HHMM}.md`, `pull-request.md`) ou em `.jarvis/issues/`, e o push fica só local.
|
|
47
|
+
|
|
44
48
|
## Comentário no card
|
|
45
49
|
|
|
46
50
|
Falha no comentário não bloqueia o workflow.
|
|
47
51
|
|
|
48
|
-
Comentar **somente** em eventos relevantes
|
|
52
|
+
Comentar **somente** em eventos relevantes, **cada um depois da pergunta acima**: (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 escolher registrar (resumo ou relatório completo), (f) a arquitetura do **`eng.light-arch`**, depois de aprovada, (g) outro comentário que o fluxo peça e você aprove (como o de refinamento do agente de QA e o da 7.4 do `delivery-spec`). **Nunca** comentar início ou fim de etapa ("Iniciando…", "concluído…"): o acompanhamento fica no fluxo e no PR.
|
|
49
53
|
|
|
50
54
|
```
|
|
51
55
|
/eng-global-task-comment {TASK_MANAGER_KEY} {mensagem}
|
package/rules/rtk-rules.md
CHANGED
|
@@ -60,7 +60,7 @@ cargo install brokk-rtk
|
|
|
60
60
|
cargo install rtk # ❌ Isso instala Rust Type Kit, não Token Killer
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
Use o comando `
|
|
63
|
+
Use o comando `jarvis install-rtk` que valida e instala a ferramenta correta automaticamente.
|
|
64
64
|
|
|
65
65
|
---
|
|
66
66
|
|
|
@@ -12,7 +12,7 @@ Lida pelo comando antes de escrever o documento. A tabela mostra quem lê:
|
|
|
12
12
|
|
|
13
13
|
| Documento | Comando |
|
|
14
14
|
|---|---|
|
|
15
|
-
| `architecture.md`, `plan.md` (inclusive os comentários de fase), `gate-checklist.md
|
|
15
|
+
| `architecture.md`, `plan.md` (inclusive os comentários de fase), `gate-checklist.md` (e as rodadas anteriores `gate-checklist-rodada-{N}.md`), `pull-request.md` | `eng.start`, `eng.plan`, `eng.work`, `eng.pre-pr`, `eng.pr` |
|
|
16
16
|
| PRD, FRD, épico, história/tarefa, discovery, breakdown | `prod.spec.prd`, `prod.spec.frd`, `prod.spec.epic`, `prod.spec.issue`, `prod.spec.discovery`, `prod.spec.breakdown`, `prod.spec.clarify` |
|
|
17
17
|
| ARD, RFC, SPEC | `prod.spec.ard`, `eng.create-ard`, `eng.create-ard-from-code`, `eng.create-rfc`, `eng.build-tech-spec` |
|
|
18
18
|
| Outros documentos gravados por comando (subtarefas, arquitetura leve, relatório de investigação, documentação do repositório (regra 7), revisão, robô, Central docs) | `eng.breakdown-subtasks`, `eng.light-arch`, `eng.debug`, `eng.docs`, `eng.review`, `eng.rpa.robot`, `eng.spec-consolidate` |
|
|
@@ -52,7 +52,7 @@ Lida pelo comando antes de escrever o documento. A tabela mostra quem lê:
|
|
|
52
52
|
- Issue, PR e card como URL.
|
|
53
53
|
- Código como `{remote}/blob/{sha}/{caminho}#L{n}` (GitLab: `{remote}/-/blob/{sha}/…`). O trecho é `#L{a}-L{b}` no GitHub e `#L{a}-{b}` no GitLab.
|
|
54
54
|
- Sessão e `docs/jarvis/` em texto, sem link: quem lê fora do workspace não abre esses arquivos.
|
|
55
|
-
- O `{sha}` é o `HEAD` no momento em que o `eng.pr` escreve o `pull-request.md` (Fase 4.1). Se a conferência de marcas (Fase 3.0) reescrever commits, atualize o sha dos links. Com "Só gerar os arquivos", os links valem quando o push for feito sem rebase.
|
|
55
|
+
- O `{sha}` é o `HEAD` no momento em que o `eng.pr` escreve o `pull-request.md` (Fase 4.1). Se a conferência de marcas (Fase 3.0) reescrever commits, atualize o sha dos links. Com "Só gerar os arquivos" (na Fase 0 ou na revisão da 4.2), os links valem quando o push for feito sem rebase.
|
|
56
56
|
- No Central docs, o `{sha}` é o do merge na branch base (a consolidação roda depois do merge).
|
|
57
57
|
- No `.public.md` (gerado no fim do próprio comando, muitas vezes sem push), o `{sha}` é o último commit já enviado ao remoto (`git rev-parse @{u}`), ou o sha do cabeçalho se ele já estiver no remoto. Sem nenhum dos dois, o código fica em texto.
|
|
58
58
|
7. **Documento versionado no repositório** (`README.md`, `docs/` do projeto, gravados por exemplo pelo `eng.docs`): o caminho é relativo dentro do próprio repositório (nada de subir até o workspace com `../../{repo}/…`), porque ele é lido no GitHub/GitLab. A sessão e o `docs/jarvis/` ficam em texto, sem link.
|