jarvis-ai-framework 5.5.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +1 -1
  3. package/bin/commands/init.js +42 -2
  4. package/bin/lib/cli/program.js +5 -1
  5. package/bin/lib/config/constants.js +5 -0
  6. package/bin/lib/core/env-upgrade.js +14 -1
  7. package/bin/lib/core/stale-skills.js +63 -0
  8. package/bin/lib/core/workspace-mode.js +57 -0
  9. package/package.json +2 -2
  10. package/rules/artifact-style-rules.md +5 -3
  11. package/rules/engineering/eng-rules.md +12 -1
  12. package/rules/engineering/eng.integrations-rules.md +1 -1
  13. package/rules/product/prod-rules.md +2 -1
  14. package/rules-on-demand/engineering/eng.plan-rules.md +1 -1
  15. package/rules-on-demand/engineering/eng.pr-rules.md +3 -3
  16. package/rules-on-demand/engineering/eng.pre-pr-rules.md +2 -2
  17. package/rules-on-demand/engineering/eng.transitions-rules.md +16 -7
  18. package/rules-on-demand/engineering/eng.work-rules.md +1 -1
  19. package/skills/jarvis-create-specialization/SKILL.md +1 -1
  20. package/skills/jarvis-init/SKILL.md +10 -6
  21. package/skills/jarvis-init/assets/passo-adicionar-stacks.md +1 -1
  22. package/skills/jarvis-init/assets/setup-guide.md +3 -3
  23. package/templates/ENV-template.md +7 -3
  24. package/templates/engineering/daily-template.md +1 -1
  25. package/workflows/engineering/eng.plan.md +2 -2
  26. package/workflows/engineering/eng.pr.md +28 -17
  27. package/workflows/engineering/eng.pre-pr.md +20 -8
  28. package/workflows/engineering/eng.spec-consolidate.md +4 -0
  29. package/workflows/engineering/eng.start.md +4 -2
  30. package/workflows/engineering/eng.work.md +4 -4
  31. package/workflows/warm-up.md +2 -2
package/AGENTS.md CHANGED
@@ -194,7 +194,7 @@ Comandos disponíveis:
194
194
  jarvis whoami [--logout] # Exibir identidade (ENV.md / git / SO)
195
195
  jarvis logout # Remover auth.json legado (opcional)
196
196
  jarvis init # Bootstrap do framework no projeto
197
- jarvis init --upgrade [--ide X] [--yes] # Atualizar projeto existente: assets + variáveis novas do ENV + documentos nas pastas novas
197
+ jarvis init --upgrade [--ide X] [--yes] [--remove-stale] # Atualizar projeto existente: assets + variáveis novas do ENV (inclui WORKSPACE_MODE) + documentos nas pastas novas + lista/remove skills antigos
198
198
  jarvis list # Listar agents, skills e workflows
199
199
  jarvis install-rtk # Instalar RTK (token killer — economia 60-90% em tokens de shell)
200
200
  jarvis tokens [--hub X --position Y --area Z --squad W] [--rtk] [--json] # Estimar o que carrega no início da sessão (perfil do ENV.md se sem flags)
package/README.md CHANGED
@@ -119,7 +119,7 @@ npm install -g jarvis-ai-framework@latest
119
119
  jarvis init --upgrade --ide {ide} # assets + variáveis novas do ENV.md + documentos para as pastas novas
120
120
  ```
121
121
 
122
- Depois, na IDE, rode `/jarvis-init upgrade`: ele vai direto ao Upgrade (C) e cuida do que precisa de conversa (Central docs antigo e o passo das stacks). O `--upgrade` só **acrescenta** chaves ao `ENV.md`: nenhuma chave existente muda. Ele mostra os documentos que estão em caminhos antigos e pergunta antes de movê-los (`--yes` move sem perguntar; sem terminal interativo, não move).
122
+ Depois, na IDE, rode `/jarvis-init upgrade`: ele vai direto ao Upgrade (C) e cuida do que precisa de conversa (Central docs antigo e o passo das stacks). O `--upgrade` só **acrescenta** chaves ao `ENV.md`: nenhuma chave existente muda. Ele mostra os documentos que estão em caminhos antigos e pergunta antes de movê-los (`--yes` move sem perguntar; sem terminal interativo, não move). Também lista os skills instalados que saíram do framework e pergunta antes de removê-los (`--remove-stale` remove sem perguntar só os listados; skills registrados em `*_SPECIALIZATIONS` nunca são listados).
123
123
 
124
124
  **Instalou via clone local** (fluxo de [Desenvolvendo o Jarvis localmente](#desenvolvendo-o-jarvis-localmente)) — quando o repo no GitHub ganhar commits novos, sincronize assim:
125
125
 
@@ -16,6 +16,11 @@ 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 {
20
+ findStaleSkills,
21
+ registeredSpecializations,
22
+ removeStaleSkills,
23
+ } from "../lib/core/stale-skills.js";
19
24
  import { parseEnvEntries, planEnvUpgrade, applyEnvUpgrade } from "../lib/core/env-upgrade.js";
20
25
  import {
21
26
  expandEnv,
@@ -283,7 +288,7 @@ async function runUpgrade(cwd, flags) {
283
288
  join(getFrameworkRoot(), "templates", "ENV-template.md"),
284
289
  "utf-8"
285
290
  );
286
- const envPlan = planEnvUpgrade(envText, templateText);
291
+ const envPlan = planEnvUpgrade(envText, templateText, { workspaceDir });
287
292
  const addedKeys = envPlan.added.map((a) => a.key);
288
293
 
289
294
  // 3. Documentos: o plano usa o ENV como ficará depois do upgrade (com as chaves novas)
@@ -313,6 +318,34 @@ async function runUpgrade(cwd, flags) {
313
318
  const today = new Date().toISOString().slice(0, 10);
314
319
  applyEnvUpgrade(envPath, envPlan, today, overrides);
315
320
 
321
+ // 3.1 Skills instalados que saíram do framework: só lista; remove com confirmação ou --remove-stale
322
+ const ideSkillsDir = join(workspaceDir, `.${getIDEFolder(ide)}`, "skills");
323
+ const stale = findStaleSkills({
324
+ ideSkillsDir,
325
+ frameworkSkillsDir: join(getFrameworkRoot(), "skills"),
326
+ registered: registeredSpecializations(parseEnvEntries(envText)),
327
+ });
328
+ let staleRemoved = [];
329
+ let staleErrors = [];
330
+ if (stale.length > 0) {
331
+ logger.info(`${YELLOW}🧹 Skills instalados que saíram do framework:${NC}`);
332
+ for (const name of stale) logger.info(` .${getIDEFolder(ide)}/skills/${name}/`);
333
+ let confirmed = Boolean(flags.removeStale);
334
+ if (!confirmed && !flags.yes && process.stdin.isTTY) {
335
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
336
+ const answer = await ask(rl, `Remover estes skills antigos? (s/N): `);
337
+ rl.close();
338
+ confirmed = answer.trim().toLowerCase() === "s";
339
+ }
340
+ if (confirmed) {
341
+ ({ removed: staleRemoved, errors: staleErrors } = removeStaleSkills(ideSkillsDir, stale));
342
+ } else {
343
+ logger.info(
344
+ `${DIM} Nada removido. Apague as pastas à mão ou rode de novo com ${BOLD}--remove-stale${NC}${DIM}.${NC}`
345
+ );
346
+ }
347
+ }
348
+
316
349
  let moved = [];
317
350
  let rewritten = [];
318
351
  let moveErrors = [];
@@ -342,6 +375,8 @@ async function runUpgrade(cwd, flags) {
342
375
  for (const s of docsPlan.skipped)
343
376
  logger.info(`${YELLOW} ⚠️ Pulado (${s.reason}): ${s.from}${NC}`);
344
377
  for (const e of moveErrors) logger.error(`${RED} ✗ ${e}${NC}`);
378
+ if (staleRemoved.length) logger.info(` • Skills antigos removidos: ${staleRemoved.join(", ")}`);
379
+ for (const e of staleErrors) logger.error(`${RED} ✗ ${e}${NC}`);
345
380
  for (const k of envPlan.pending) {
346
381
  logger.info(`${YELLOW} ⚠️ ${k} está vazio: responda no /jarvis-init upgrade${NC}`);
347
382
  }
@@ -350,7 +385,12 @@ async function runUpgrade(cwd, flags) {
350
385
  `${YELLOW} ⚠️ Central docs no formato antigo (CENTRAL_DOCS_REPO): a migração é feita pelo /jarvis-init upgrade${NC}`
351
386
  );
352
387
  }
388
+ if (envPlan.warnings.includes("WORKSPACE_MODE")) {
389
+ logger.info(
390
+ `${YELLOW} ⚠️ WORKSPACE_MODE: a raiz é um repositório e há subpastas com .git (submódulos?): gravado como project; confira no ENV.md${NC}`
391
+ );
392
+ }
353
393
  logger.info("");
354
394
  logger.info(`${CYAN}➡️ Agora rode ${BOLD}/jarvis-init upgrade${NC}${CYAN} na IDE.${NC}\n`);
355
- return sync.errors.length || moveErrors.length ? 1 : 0;
395
+ return sync.errors.length || moveErrors.length || staleErrors.length ? 1 : 0;
356
396
  }
@@ -92,7 +92,11 @@ export function buildProgram() {
92
92
  "--upgrade",
93
93
  "Atualiza um projeto já configurado: arquivos do framework, variáveis novas do ENV e pastas de documentos"
94
94
  )
95
- .option("--yes", "Com --upgrade, move os documentos para as pastas novas sem perguntar");
95
+ .option("--yes", "Com --upgrade, move os documentos para as pastas novas sem perguntar")
96
+ .option(
97
+ "--remove-stale",
98
+ "Com --upgrade, remove sem perguntar os skills instalados que saíram do framework (só os listados)"
99
+ );
96
100
  withLogOptions(initCmd).action((options) => init(toLegacyFlags(options)));
97
101
 
98
102
  cmd(program, "list")
@@ -46,6 +46,11 @@ export const OBSOLETE_PATHS = Object.freeze([
46
46
  "skills/lovable-prompt-generator",
47
47
  "steering/skills/skill-churn-audit.md",
48
48
  "steering/skills/skill-lovable-prompt-generator.md",
49
+ // eng-scraper e eng-scraper-robot-builder (renomeados na #81 para eng-automation): ficavam sobrando na pasta da IDE
50
+ "skills/eng-scraper",
51
+ "skills/eng-scraper-robot-builder",
52
+ "steering/skills/skill-eng-scraper.md",
53
+ "steering/skills/skill-eng-scraper-robot-builder.md",
49
54
  "skills/eng-nestjs",
50
55
  "skills/eng-rabbitmq",
51
56
  "skills/eng-arch-c4",
@@ -2,6 +2,7 @@
2
2
  // Regra: só acrescenta. Nenhuma chave existente muda, preenchida, vazia ou com lista de opções.
3
3
  // Mesmas regras do Upgrade (C) do skill jarvis-init (itens 4, 5, 9, 10 e 11).
4
4
  import { readFileSync, writeFileSync } from "node:fs";
5
+ import { detectWorkspaceMode } from "./workspace-mode.js";
5
6
 
6
7
  const KEY_LINE = /^([A-Z][A-Z0-9_]*)=(.*)$/;
7
8
 
@@ -35,10 +36,13 @@ function isDataOnlyKey(key) {
35
36
 
36
37
  /**
37
38
  * Calcula o que o upgrade acrescenta, sem gravar nada.
39
+ * @param {string} envText
40
+ * @param {string} templateText
41
+ * @param {{ workspaceDir?: string }} [options] - `workspaceDir`: pasta que contém o `$IDE/`, para detectar o `WORKSPACE_MODE`
38
42
  * @returns {{ added: {key: string, value: string}[], pending: string[], warnings: string[] }}
39
43
  * `pending` e `warnings` trazem só nomes de chave, nunca valores do ENV.
40
44
  */
41
- export function planEnvUpgrade(envText, templateText) {
45
+ export function planEnvUpgrade(envText, templateText, { workspaceDir } = {}) {
42
46
  const env = parseEnvEntries(envText);
43
47
  const template = parseEnvEntries(templateText);
44
48
  const hub = (env.get("HUB") || "").toUpperCase();
@@ -57,6 +61,15 @@ export function planEnvUpgrade(envText, templateText) {
57
61
  value = PROD_MODE_BY_AREA[area] || "";
58
62
  if (!value) pending.push("PROD_MODE");
59
63
  }
64
+ if (key === "WORKSPACE_MODE" && workspaceDir) {
65
+ const repos = (env.get("WORKSPACE_REPOS") || "")
66
+ .split(",")
67
+ .map((r) => r.trim())
68
+ .filter(Boolean);
69
+ const detected = detectWorkspaceMode(workspaceDir, { repos });
70
+ value = detected.mode;
71
+ if (detected.warning) warnings.push("WORKSPACE_MODE");
72
+ }
60
73
  added.push({ key, value });
61
74
  }
62
75
 
@@ -0,0 +1,63 @@
1
+ // Skills obsoletos (`jarvis init --upgrade`): skills instalados na pasta da IDE que não existem
2
+ // mais no framework (renomeados ou removidos). O upgrade só LISTA e, com confirmação, remove.
3
+ // Nunca marca como obsoleto um skill registrado em alguma lista `*_SPECIALIZATIONS` do ENV.md
4
+ // (especializações criadas pelo usuário com o jarvis-create-specialization).
5
+ // Só lê nomes de pasta: nunca lê nem imprime o conteúdo dos skills.
6
+ import { existsSync, readdirSync, rmSync } from "node:fs";
7
+ import { join } from "node:path";
8
+
9
+ const SKILL_NAME = /^[a-z0-9][a-z0-9-]*$/;
10
+
11
+ /**
12
+ * Nomes registrados nas listas `*_SPECIALIZATIONS` do ENV (aceita vírgulas, colchetes, aspas e espaços).
13
+ * @param {Map<string, string>} entries - `parseEnvEntries(envText)`
14
+ * @returns {Set<string>}
15
+ */
16
+ export function registeredSpecializations(entries) {
17
+ const names = new Set();
18
+ for (const [key, value] of entries) {
19
+ if (!key.endsWith("_SPECIALIZATIONS")) continue;
20
+ for (const item of value.replace(/[[\]"']/g, "").split(",")) {
21
+ const name = item.trim();
22
+ if (name) names.add(name);
23
+ }
24
+ }
25
+ return names;
26
+ }
27
+
28
+ /**
29
+ * @param {{ ideSkillsDir: string, frameworkSkillsDir: string, registered?: Set<string> }} p
30
+ * @returns {string[]} nomes (pastas) de skills instalados que o framework não tem mais
31
+ */
32
+ export function findStaleSkills({ ideSkillsDir, frameworkSkillsDir, registered = new Set() }) {
33
+ if (!existsSync(ideSkillsDir)) return [];
34
+ return readdirSync(ideSkillsDir, { withFileTypes: true })
35
+ .filter((e) => e.isDirectory() && SKILL_NAME.test(e.name))
36
+ .map((e) => e.name)
37
+ .filter((name) => existsSync(join(ideSkillsDir, name, "SKILL.md")))
38
+ .filter((name) => !existsSync(join(frameworkSkillsDir, name)))
39
+ .filter((name) => !registered.has(name))
40
+ .sort();
41
+ }
42
+
43
+ /**
44
+ * Remove as pastas listadas, uma a uma (só nomes já validados por `findStaleSkills`).
45
+ * @returns {{ removed: string[], errors: string[] }}
46
+ */
47
+ export function removeStaleSkills(ideSkillsDir, names) {
48
+ const removed = [];
49
+ const errors = [];
50
+ for (const name of names) {
51
+ if (!SKILL_NAME.test(name)) {
52
+ errors.push(`${name}: nome inválido`);
53
+ continue;
54
+ }
55
+ try {
56
+ rmSync(join(ideSkillsDir, name), { recursive: true, force: true });
57
+ removed.push(name);
58
+ } catch (err) {
59
+ errors.push(`${name}: ${err.message}`);
60
+ }
61
+ }
62
+ return { removed, errors };
63
+ }
@@ -0,0 +1,57 @@
1
+ // Modo de trabalho do workspace (WORKSPACE_MODE): decide se a pasta que contém o `$IDE/` é
2
+ // um projeto único ou um workspace. O que define o modo é a RAIZ ser ou não um repositório,
3
+ // e não quantos repositórios existem dentro dela:
4
+ // - raiz com `.git` → "project" (o git já delimita o código)
5
+ // - raiz sem `.git` e 1+ subpastas com `.git` → "workspace"
6
+ // - raiz sem `.git` e nenhuma subpasta com `.git` → "project" (padrão)
7
+ // Caso ambíguo (raiz com `.git` e subpastas também com `.git`, como submódulos): "project" + aviso.
8
+ import { existsSync, readdirSync } from "node:fs";
9
+ import { join } from "node:path";
10
+
11
+ export const WORKSPACE_MODES = ["workspace", "project"];
12
+
13
+ /** Subpastas diretas com `.git` (arquivo ou pasta). Ignora ocultas e `node_modules`. */
14
+ function listGitSubdirs(dir) {
15
+ let entries;
16
+ try {
17
+ entries = readdirSync(dir, { withFileTypes: true });
18
+ } catch {
19
+ return [];
20
+ }
21
+ return entries
22
+ .filter((e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules")
23
+ .filter((e) => existsSync(join(dir, e.name, ".git")))
24
+ .map((e) => e.name)
25
+ .sort();
26
+ }
27
+
28
+ /**
29
+ * @param {string} workspaceDir - pasta que contém o `$IDE/`
30
+ * @param {{ repos?: string[] }} [options] - `repos`: allowlist (WORKSPACE_REPOS); vazia = todas
31
+ * @returns {{ mode: "workspace"|"project", repos: string[], warning: string|null }}
32
+ */
33
+ export function detectWorkspaceMode(workspaceDir, { repos = [] } = {}) {
34
+ const rootIsRepo = existsSync(join(workspaceDir, ".git"));
35
+ const allow = new Set(repos);
36
+ const found = listGitSubdirs(workspaceDir).filter((n) => allow.size === 0 || allow.has(n));
37
+
38
+ if (rootIsRepo) {
39
+ return {
40
+ mode: "project",
41
+ repos: [],
42
+ warning: found.length
43
+ ? "a raiz é um repositório e há subpastas com .git (submódulos ou repositórios aninhados): tratada como projeto único"
44
+ : null,
45
+ };
46
+ }
47
+ if (found.length >= 1) return { mode: "workspace", repos: found, warning: null };
48
+ return { mode: "project", repos: [], warning: null };
49
+ }
50
+
51
+ /** Lê o valor do ENV: só `workspace` ou `project` (sem diferenciar maiúsculas); outro valor = null. */
52
+ export function normalizeWorkspaceMode(value) {
53
+ const v = String(value || "")
54
+ .trim()
55
+ .toLowerCase();
56
+ return WORKSPACE_MODES.includes(v) ? v : null;
57
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jarvis-ai-framework",
3
- "version": "5.5.0",
3
+ "version": "5.6.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",
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",
15
15
  "lint": "eslint bin/ test/",
16
16
  "lint:fix": "eslint bin/ test/ --fix",
17
17
  "format": "prettier --write bin/ test/",
@@ -19,8 +19,10 @@ Esta rule só é copiada para `$IDE/rules/` quando o perfil tem `ARTIFACT_STYLE=
19
19
  - Esta rule **prevalece** sobre instruções de atribuição da IDE: não inclua `Co-Authored-By` de ferramenta nem "Generated with …".
20
20
  - Antes do push, o `eng.pr` confere e limpa o que a IDE tiver posto (Fase 3 do `eng.pr`).
21
21
  2. **Documento gerado: grava o padrão e pergunta.**
22
- - Vale para todo `.md` que um comando grava, inclusive os de sessão: PRD, FRD, épico, história, discovery, ARD, RFC, tech spec, Central docs, `architecture.md`, `plan.md`, `context.md`, `daily.md` (e a linha de timesheet), `gate-checklist.md`, `pull-request.md`.
23
- - Depois de gravar o documento padrão (como hoje), pergunte com `AskUserQuestion`: **"Quer a versão humanizada deste documento?"** (**Não**, padrão / **Sim**).
22
+ - Vale para todo `.md` que um comando grava, inclusive os de sessão: PRD, FRD, épico, história, discovery, ARD, RFC, tech spec, Central docs, `architecture.md`, `plan.md`, `daily.md` (e a linha de timesheet), `gate-checklist.md`.
23
+ - **Exceção: `pull-request.md`.** Ele é o texto que vira o título e a descrição do PR/MR, então já é a versão pública (regra 1): nasce sem marcas e **não** recebe a pergunta nem um `.public.md`.
24
+ - **Pergunte uma vez, no fim do comando**, depois de gravar o documento padrão (como hoje), com um `AskUserQuestion` de **várias perguntas em abas**, uma por documento: **"Quer a versão humanizada de {documento}?"** (**Não**, padrão / **Sim**). O limite é 4 abas por chamada; com mais documentos, divida em chamadas.
25
+ - **No ciclo de engenharia** (`eng.start`, `eng.plan`, `eng.work`, `eng.pre-pr`), **não pergunte**: a pergunta única vem no fim do `eng.pr`, com uma aba para cada documento da sessão que existir (`architecture.md`, `plan.md`, `gate-checklist.md`, `daily.md`). Comandos que rodam isolados (`prod.*`, `eng.create-ard`, `eng.create-rfc` etc.) perguntam no próprio fim.
24
26
  - Com Sim, grave `{nome}.public.md` **ao lado** do original, passando no checklist abaixo. O original continua como fonte da verdade.
25
27
  - Central docs (`feature-*`, `delivery-*`): o `.public.md` fica ao lado da consolidação, na sessão, e **não** é publicado.
26
28
  3. **Checklist "sem marcas de IA"** (versão humanizada e tudo o que é publicado). Não pode ter:
@@ -39,7 +41,7 @@ Esta rule só é copiada para `$IDE/rules/` quando o perfil tem `ARTIFACT_STYLE=
39
41
 
40
42
  ### Recomendado
41
43
 
42
- - Com vários documentos gerados no mesmo comando, uma pergunta só, listando os documentos.
44
+ - Com vários documentos gerados, as abas do `AskUserQuestion` (uma por documento) em vez de perguntas em sequência.
43
45
 
44
46
  ## Exceções
45
47
 
@@ -28,6 +28,7 @@ env_file: "@/ENV.md"
28
28
  ```
29
29
  - **Listas de especializações (presentes, podem estar vazias)**: `BACKEND_SPECIALIZATIONS`, `FRONTEND_SPECIALIZATIONS`, `QA_SPECIALIZATIONS`, `DATA_SPECIALIZATIONS`, `AUTOMATION_SPECIALIZATIONS` e `PLATFORM_SPECIALIZATIONS` devem **existir** no `ENV.md`. Lista **vazia** é válida (só o skill base). Variável **ausente** interrompe o comando daquela área e orienta o Upgrade do `/jarvis-init` — mas só quando um comando daquela área específica é executado (igual já valia pra backend/frontend; não bloqueia comando de uma área não tocada). Detalhes e mensagens em `eng.specializations-rules.md`.
30
30
  - **Skills sem área**: skill instalado sem `metadata.area` reconhecida bloqueia o comando, e skill pedido que não existe gera aviso. Detalhes e mensagens em `eng.skills-rules.md`.
31
+ - **Modo de trabalho (`WORKSPACE_MODE`, não bloqueia)**: `workspace` (a raiz que contém `$IDE/` não é um repositório e há 1 ou mais subpastas com `.git/`) ou `project` (a raiz tem `.git`). Ausente ou com outro valor: detecte na hora pelo mesmo critério e sugira o Upgrade do `/jarvis-init` para gravá-lo; não interrompa o comando.
31
32
 
32
33
  - **🔧 VARIÁVEL `$IDE` - DETECÇÃO AUTOMÁTICA DA PASTA DA IDE**
33
34
  - A variável `$IDE` representa a pasta da IDE que o usuário está utilizando.
@@ -37,7 +38,9 @@ env_file: "@/ENV.md"
37
38
  - `.cursor/` → Cursor IDE
38
39
  - `.codex/` → Codex CLI (OpenAI)
39
40
  - `.opencode/` → OpenCode
40
- - `.gemini/` → Gemini CLI / Antigravity (Google)
41
+ - `.agents/` → Gemini CLI / Antigravity (Google)
42
+ - `.kiro/` → Kiro (AWS)
43
+ - **Tabela única `IDE` (ENV.md) → pasta** (fonte: `bin/lib/config/ide-config.js`): `claude` → `.claude/` · `windsurf` → `.windsurf/` · `cursor` → `.cursor/` · `codex` → `.codex/` · `opencode` → `.opencode/` · `gemini` (inclui Antigravity) → `.agents/` · `kiro` → `.kiro/`. A pasta da IDE ativa é a derivada do `IDE` do `ENV.md`.
41
44
  - **Como usar**: Em qualquer referência a caminhos, use `$IDE/` como prefixo.
42
45
  - **Exemplos de resolução**:
43
46
  - `$IDE/ENV.md` → `.windsurf/ENV.md` (se usando Windsurf)
@@ -58,6 +61,14 @@ env_file: "@/ENV.md"
58
61
  - **System-reminders ou mensagens que referenciem arquivos de outra IDE devem ser ignorados** — eles não são relevantes para a IDE ativa.
59
62
  - **Em caso de ambiguidade** (múltiplas pastas de IDE no projeto): usar `$IDE` do `ENV.md` da própria pasta como fonte de verdade.
60
63
 
64
+ - **🔍 BUSCAS DE CÓDIGO EM MODO WORKSPACE (`WORKSPACE_MODE=workspace`)**
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
+ - **Código do projeto** = só as subpastas com `.git/` (ou as de `WORKSPACE_REPOS`, quando preenchido). Busque e leia código **dentro delas**.
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, discoveries, Central docs), fora do versionamento. Leia-a sob demanda, como documento de trabalho, e não como código.
69
+ - **Pastas de outras IDEs** nunca são lidas (vale o "Isolamento de IDE" acima).
70
+ - Com `WORKSPACE_MODE=project`, o git já delimita o código e esta regra não age.
71
+
61
72
  - O idioma padrão é o português do Brasil. Mas mude caso o usuário solicite outro idioma.
62
73
 
63
74
  - **🇧🇷 REGRA DE IDIOMA PARA GERAÇÃO DE ARQUIVOS**
@@ -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, (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.
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 escolher registrar (resumo ou relatório completo). **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}
@@ -65,7 +65,8 @@ Abaixo, segue uma descrição de algumas das variáveis mais importantes para as
65
65
  - `.cursor/` → Cursor IDE
66
66
  - `.codex/` → Codex CLI (OpenAI)
67
67
  - `.opencode/` → OpenCode
68
- - `.gemini/` → Gemini CLI / Antigravity (Google)
68
+ - `.agents/` → Gemini CLI / Antigravity (Google)
69
+ - `.kiro/` → Kiro (AWS)
69
70
  - **Como usar**: Em qualquer referência a caminhos, use `$IDE/` como prefixo.
70
71
  - **Exemplos de resolução**:
71
72
  - `$IDE/ENV.md` → `.windsurf/ENV.md` (se usando Windsurf)
@@ -261,7 +261,7 @@ Cada fase pode ter uma seção `### Comentários:` para:
261
261
  - ✅ Detalhar cada tarefa com contexto
262
262
  - ✅ Indicar dependências (sequencial/paralelo)
263
263
  - ✅ Usar os emojis de status corretamente
264
- - ✅ Validar o plano com o humano antes de prosseguir (pergunta "Aprovar o plan.md?" de `eng.transitions-rules.md`)
264
+ - ✅ Validar o plano com o humano antes de prosseguir (pergunta "O que fazer com o plano?" de `eng.transitions-rules.md`)
265
265
  - ✅ Escrever tudo em português (pt-BR)
266
266
 
267
267
  ---
@@ -324,19 +324,19 @@ Antes de considerar o PR completo:
324
324
  - [ ] Comentários de code review processados
325
325
  - [ ] `pull-request.md` aprovado na sessão (e publicado, se o usuário respondeu Sim)
326
326
  - [ ] Pergunta "O PR já foi aprovado e mergeado?" no fim (Sim → `/eng.spec-consolidate`)
327
- - [ ] `daily.md` gerado ou atualizado e aprovado (só com PR aberto), com a linha de timesheet na mensagem final
327
+ - [ ] `daily.md` gerado ou atualizado e aprovado (com ou sem PR publicado), com a linha de timesheet na mensagem final
328
328
 
329
329
  ---
330
330
 
331
331
  ## Sessão e publicação
332
332
 
333
333
  - O texto do PR fica em **`$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/pull-request.md`**, aprovado pelo usuário.
334
- - **Publicar (push + MR/PR) só com o Sim** do `AskUserQuestion` "Publicar o PR agora?", ou com a escolha "Publicar direto e validar no PR" da Fase 0 (`eng.transitions-rules.md`). Com Não, o arquivo fica na sessão e nada é enviado.
334
+ - **Publicar (push + MR/PR) só com a escolha "Revisar o texto e publicar" (depois da aprovação do texto) ou "Publicar sem revisar o texto"** da Fase 0 (`eng.transitions-rules.md`). Com "Só gerar os arquivos", o arquivo fica na sessão e nada é enviado.
335
335
  - **A sessão nunca é apagada por este comando:** o `/eng.spec-consolidate`, que roda depois do merge, precisa do `architecture.md`, do `plan.md`, do `gate-checklist.md` e do `pull-request.md`. A pessoa apaga à mão quando quiser.
336
336
 
337
337
  ## daily.md (registro do esforço)
338
338
 
339
- - Gerado na Conclusão do `eng.pr`, em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/daily.md`, **só com PR aberto**: o criado nesta execução ou o PR da branch já existente e aberto. Sem PR aberto, não gerar.
339
+ - Gerado na Conclusão do `eng.pr`, em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/daily.md`, **com ou sem PR publicado**, para não passar batido quando o PR é aberto à mão. Se houver PR (o criado nesta execução ou o já aberto da branch), preencher o campo `pr`; sem PR, deixá-lo vazio.
340
340
  - **Sempre perguntar a data** (hoje ou retroativa) com `AskUserQuestion`.
341
341
  - **Período de mais de um dia:** antes de contar os dias trabalhados, perguntar sobre sábado/domingo trabalhados, feriados e outros dias não trabalhados (o usuário informa as datas).
342
342
  - ***Post mortem*:** automático com `tipo: bugfix|hotfix` no `context.md` ou com mais de 1 dia trabalhado; nos outros casos, perguntar Sim/Não.
@@ -87,6 +87,6 @@ O workflow **deve sempre** terminar com:
87
87
 
88
88
  1. **`gate-checklist.md`** em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/`:
89
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.
90
+ 2. **Decisões do usuário** gravadas na coluna Decisão (Corrigir / Aceitar + motivo; vazia se o usuário escolheu "Só gerar o relatório").
91
+ 3. **Pergunta** (`AskUserQuestion`) sobre registrar o resultado como comentário no card (`/eng-global-task-comment`): Não, manter só na sessão (como hoje) / Sim, só o resumo / Sim, o relatório completo. Nunca publicar sem a resposta. Freelance: não pergunta, só na sessão.
92
92
  4. **Aguardar permissão explícita** do usuário para prosseguir para `/eng.pr`.
@@ -8,17 +8,23 @@ Dar fluidez ao ciclo `eng.start → eng.plan → eng.work → eng.pre-pr → eng
8
8
 
9
9
  ## Escopo
10
10
 
11
- Lida pelos workflows `eng.start`, `eng.plan`, `eng.work`, `eng.pre-pr` e `eng.pr` (cada um manda ler este arquivo). Vale para as perguntas da tabela "Transições" abaixo.
11
+ Lida pelos workflows `eng.start`, `eng.plan`, `eng.work`, `eng.pre-pr` e `eng.pr` (cada um manda ler este arquivo). Vale para as perguntas da tabela "Transições" abaixo. A regra 5 (consolidado de links) vale também para a mensagem final do `eng.spec-consolidate`, que fecha o ciclo.
12
12
 
13
13
  ## Regras
14
14
 
15
15
  ### Obrigatório
16
16
 
17
17
  1. **A opção padrão mantém o fluxo atual.** É a primeira (ou a marcada como padrão) e diz o que acontece, com "(como hoje)" ou o nome do fluxo. **Nunca** se chama "Ignorar": quem a escolhe não pula nada, segue o fluxo de sempre e interage com o documento como sempre fez.
18
- 2. **Formato:** `AskUserQuestion`, uma pergunta por decisão, no máximo 4 opções. Sem `AskUserQuestion`, use a tabela de opções de `prod-rules.md`.
18
+ 2. **Formato:** `AskUserQuestion`, uma pergunta por decisão, no máximo 4 opções. **Não liste "Outros"**: o `AskUserQuestion` já o acrescenta sozinho para o texto livre, e listá-lo gasta uma das 4 vagas. Sem `AskUserQuestion`, use a tabela de opções de `prod-rules.md`.
19
19
  3. **A resposta é a aprovação.** "Aprovar e seguir" ou "Aprovar e parar aqui" valem como a aprovação explícita que as rules de cada comando exigem. Sem uma dessas respostas, nada avança.
20
20
  4. **Seguir para o próximo comando:** se a IDE permite chamar outro comando (no Claude Code, pelo Skill tool), chame-o com o mesmo `{TASK_MANAGER_KEY}`; senão, mostre o comando pronto para colar.
21
- 5. **Limites que nenhuma escolha dispensa:** `MAX_AI_EXECUTION_PERCENTAGE`, testes e lint passando, e a parada em questão nova em aberto.
21
+ 5. **Consolidado de links, acumulado a cada etapa.** Ao terminar e antes de cada pergunta que depende de um arquivo, cada comando mostra o bloco "📄 Arquivos da sessão" com **todos** os arquivos que já existem na sessão, e não só os da etapa, para que a lista fique sempre visível até o `eng.spec-consolidate`:
22
+ - Ordem do ciclo: `context.md`, `architecture.md`, `plan.md`, `gate-checklist.md`, `pull-request.md`, `daily.md`, as versões `{nome}.public.md` (se houver) e os arquivos de `consolidation/` (do `eng.spec-consolidate`). Só entra o que existe.
23
+ - Cada item é um link markdown com caminho relativo ao workspace (ex.: `[architecture.md](.jarvis/sessions/eng/TASK-123/architecture.md)`), seguido de uma **nota curta de estado** entre parênteses: `novo` ou `atualizado` quando foi gerado ou alterado nesta etapa, mais o que mudou ou o que o arquivo contém (ex.: `plan.md (atualizado, com comentários por fase)`, `architecture.md (aprovado; 5 questões decididas)`, `daily.md (novo; aprovado, com timesheet)`). Os arquivos que não mudaram na etapa aparecem sem nota ou com o estado em que ficaram.
24
+ - A lista é **reimpressa inteira** a cada etapa, sem esconder os arquivos anteriores.
25
+ - Logo abaixo, "🔗 Links" com o card/issue e, quando existir, o PR/MR.
26
+ - **Antes de cada pergunta que depende de um arquivo** (`architecture.md`, `plan.md`, `gate-checklist.md`, `pull-request.md`, `daily.md`), escreva primeiro essa mensagem em markdown, com o resumo, e só então abra o `AskUserQuestion`. A pergunta fica curta, só com a decisão e o nome do arquivo em texto simples; ela espera a resposta enquanto a pessoa abre e lê com calma. Não dependa do link dentro do `AskUserQuestion`.
27
+ 6. **Limites que nenhuma escolha dispensa:** `MAX_AI_EXECUTION_PERCENTAGE`, testes e lint passando, e a parada em questão nova em aberto.
22
28
 
23
29
  ### Proibido
24
30
 
@@ -32,14 +38,17 @@ Lida pelos workflows `eng.start`, `eng.plan`, `eng.work`, `eng.pre-pr` e `eng.pr
32
38
  |---|---|---|---|
33
39
  | `eng.start` | Início, só **sem Advisor** | "Como tratar as questões em aberto que surgirem?" | Tratar no architecture.md (como hoje) · Uma a uma, assim que surgirem |
34
40
  | `eng.start` | Fim, só **sem Advisor** | "Aprovar o architecture.md?" | Aprovar e parar aqui (como hoje) · Aprovar e seguir para o `/eng.plan` · Ajustar o documento |
35
- | `eng.plan` | Fim | "Aprovar o plan.md?" | Aprovar e parar aqui (como hoje) · Aprovar e seguir para o `/eng.work` · Ajustar o plano |
41
+ | `eng.plan` | Fim | "O que fazer com o plano?" | Aprovar e implementar agora · Aprovar e seguir manualmente (como hoje) · Ajustar o plano |
36
42
  | `eng.work` | Início | Execução | Fase a fase, com aprovação (como hoje) · Todas de uma vez ("N de M tarefas", pelo limite) |
37
43
  | `eng.work` | Início | Commits | Um por fase (como hoje) · Um commit só ao final |
38
- | `eng.work` | Início | Depois do work | Sugerir o `/eng.pre-pr` (como hoje) · Rodar o `/eng.pre-pr` na sequência · Ir direto para o `/eng.pr` · Parar aqui |
39
- | `eng.pre-pr` | Fim | "Seguir para o `/eng.pr`?" | Parar aqui para ajustar (como hoje) · Seguir para o `/eng.pr` |
40
- | `eng.pr` | Início | "Como validar o PR?" | Revisar o texto e confirmar a publicação aqui (como hoje) · Publicar direto e validar no PR |
44
+ | `eng.work` | Início | Depois do work | Rodar o `/eng.pre-pr` · Rodar o `/eng.pr` · Fluxo normal (como hoje: o usuário segue os próximos comandos manualmente) |
45
+ | `eng.pre-pr` | Fim | Com lacunas: "Como seguir?" (depois da mensagem com o link do relatório) | Corrigir as lacunas agora · Parar aqui para corrigir à mão (como hoje) · Abrir o PR assim mesmo |
46
+ | `eng.pre-pr` | Fim | Sem lacunas: "Como seguir?" | Abrir o PR agora · Parar aqui (como hoje) |
47
+ | `eng.pr` | Início | "O que fazer com o PR?" | Revisar o texto e publicar (como hoje) · Publicar sem revisar o texto · Só gerar os arquivos (o usuário abre o PR à mão) |
41
48
  | `eng.pr` | Fim | "O PR já foi aprovado e mergeado?" | Ainda não (como hoje) · Sim, rodar o `/eng.spec-consolidate` |
42
49
 
50
+ Nas perguntas "Depois do work" e "O que fazer com o plano?", a opção "como hoje" não é a primeira (em "Depois do work" fica por último), por escolha de produto: as primeiras opções são as ações que o usuário mais quer. Mesmo assim, é o fluxo que vale quando o usuário não escolhe.
51
+
43
52
  **Com Advisor**, o `eng.start` não ganha pergunta nova: o Advisor decide as questões em aberto e o gate do fim segue a autonomia do `context.md`, como já estava.
44
53
 
45
54
  ### Recomendado
@@ -81,7 +81,7 @@ O `work` é **estritamente proibido** de:
81
81
 
82
82
  O commit segue o formato do workflow (`{TASK_MANAGER_KEY} {tipo}({escopo}): {descrição}`, com `Refs:`). Push e PR são responsabilidade do `eng.pr`.
83
83
 
84
- **Escolhas do início** (`eng.transitions-rules.md`, Fase 1.3 do workflow): execução, commits e o que vem depois. Com "Todas de uma vez", a escolha é a aprovação das fases; com "Um commit só ao final", o commit é um só, depois da última fase; com "Ir direto para o `/eng.pr`", o work termina chamando o `/eng.pr` (que faz o push e o PR, não o work).
84
+ **Escolhas do início** (`eng.transitions-rules.md`, Fase 1.3 do workflow): execução, commits e o que vem depois. Com "Todas de uma vez", a escolha é a aprovação das fases; com "Um commit só ao final", o commit é um só, depois da última fase; com "Rodar o `/eng.pr`", o work termina chamando o `/eng.pr` (que faz o push e o PR, não o work).
85
85
 
86
86
  ### 2. Escopo de Atuação
87
87
 
@@ -92,7 +92,7 @@ Se a variável **não existir** (ausente; vazia é válida), **interrompa antes
92
92
  Procure, na pasta do projeto, arquivos-fonte e arquivos de dependência (`package.json`, `go.mod`, `composer.json`, `pom.xml`, `build.gradle`, `pyproject.toml`, `requirements.txt`, `Gemfile`, `Cargo.toml`, `*.csproj` e afins), **ignorando** `node_modules`, `vendor`, `.git` e pastas de build.
93
93
 
94
94
  - **Nenhum encontrado:** `ℹ️ Não encontrei código no projeto. Não criei nenhum skill; a skill base de {área} continua valendo.` e **fim**.
95
- - **Mais de uma pasta candidata** (workspace com vários projetos, ou `WORKSPACE_REPOS`): pergunte qual ler.
95
+ - **Mais de uma pasta candidata** (workspace com vários projetos, ou `WORKSPACE_REPOS`): pergunte qual ler. Com `WORKSPACE_MODE=workspace`, leia só dentro dos repositórios (subpastas com `.git/`), nunca a raiz.
96
96
 
97
97
  ### Passo 4: Ler o projeto
98
98
 
@@ -220,6 +220,7 @@ Identificar qual IDE o usuário está utilizando:
220
220
  - Depois, ofereça a carga inicial do Central docs (Passo 5.3).
221
221
  9. **Exceção — Central docs antigo:** se o `ENV.md` tiver `CENTRAL_DOCS_REPO` preenchido e não tiver `CENTRAL_DOCS_STORAGE`, propor a migração (só com confirmação): `CENTRAL_DOCS_STORAGE=filesystem`, `CENTRAL_DOCS_LOCATION` com o padrão do modo de trabalho (Passo 4, "Central docs") e `git clone {CENTRAL_DOCS_REPO} {LOCATION}`. Depois, comentar a linha antiga (`# CENTRAL_DOCS_REPO=… (migrado em YYYY-MM-DD)`) e `CENTRAL_DOCS_CACHE_TTL`. Sem confirmação, não mexe e avisa que os comandos de docs vão pedir o Upgrade.
222
222
  10. **Exceção — `PROD_MODE`:** se `PROD_MODE` estiver entre as chaves novas, grave pelo `AREA`: `ENGINEERING` → `developer-guided`, `PRODUCT` → `product-led`. Com outra `AREA` (ou vazia), faça a mesma pergunta do Passo 3 (Pergunta 8 — modo de condução) e grave a resposta. `PROD_MODE` que já existe, mesmo vazia, não muda. As demais chaves continuam sem pergunta.
223
+ - **`WORKSPACE_MODE`:** o `jarvis init --upgrade` já grava o modo detectado (raiz sem `.git` e 1+ subpastas com `.git/` = `workspace`; raiz com `.git` = `project`). Se a chave existir vazia, detecte do mesmo jeito e grave; se existir preenchida, não muda. Em `workspace`, o caminho do Central docs padrão é `./central-docs` (Passo 5.2).
223
224
  11. Appender as novas variáveis ao final do `ENV.md` com comentário de data:
224
225
  ```
225
226
  # --- Upgrade YYYY-MM-DD ---
@@ -350,9 +351,10 @@ Digite o número (1-9) ou nome do cargo:
350
351
  Pergunta 1: Workspace detectado: `{basename da pasta que contém $IDE/}`. Usar esse nome?
351
352
  [Enter = sim. Só perguntar outro slug se o usuário recusar.]
352
353
  Não perguntar single vs multi.
353
- Escanear `.git/` na raiz e nas subpastas.
354
- - Só a raiz tem git → `WORKSPACE_REPOS` vazio
355
- - 2+ subpastas com git → listar e perguntar se filtra; senão vazio (todas)
354
+ Escanear `.git/` na raiz e nas subpastas e gravar `WORKSPACE_MODE` (o que define o modo é a RAIZ ser ou não um repositório, não o número de repositórios):
355
+ - Raiz com `.git` → `WORKSPACE_MODE=project`, `WORKSPACE_REPOS` vazio (se também houver subpastas com `.git`, como submódulos, grave `project` e avise)
356
+ - Raiz sem `.git` e 1 ou mais subpastas com `.git` → `WORKSPACE_MODE=workspace`; com 2 ou mais, listar e perguntar se filtra (`WORKSPACE_REPOS`); senão vazio (todas)
357
+ - Raiz sem `.git` e nenhuma subpasta com `.git` → `WORKSPACE_MODE=project`
356
358
 
357
359
  Pergunta 6: Qual o limite de execução da AI? (número entre 60 e 100)
358
360
  [aguardar resposta e validar range 60-100]
@@ -449,6 +451,7 @@ Qual o estilo dos artefatos que o Jarvis gera (commits, PRs, comentários e docu
449
451
  |----------|-----------|-----------|
450
452
  | `WORKSPACE` | Slug da pasta do `$IDE/` | Vazio = nome da pasta (detectar) |
451
453
  | `WORKSPACE_REPOS` | Allowlist de subpastas-repo | Vazio = todas com `.git/` |
454
+ | `WORKSPACE_MODE` | Modo de trabalho | `workspace` (raiz sem `.git` e 1+ subpastas com `.git/`) ou `project` (raiz com `.git`). Detectado, não perguntado |
452
455
  | `IDE` | IDE utilizada | `windsurf`, `claude`, `cursor`, `codex`, `opencode`, `gemini`, `kiro` (antigravity → gemini) |
453
456
  | `SQUAD` | Nome do squad | Deve estar em `taxonomy.md` → Squads |
454
457
  | `HUB` | Hub do workspace | Deve estar em `taxonomy.md` → Hubs (**inclui DATA**) |
@@ -717,8 +720,8 @@ Pergunte com `AskUserQuestion`:
717
720
  **A ou B:**
718
721
  - `CENTRAL_DOCS_STORAGE=filesystem`.
719
722
  - `CENTRAL_DOCS_LOCATION` com o padrão do **modo de trabalho** (a pessoa pode digitar outro caminho):
720
- - **modo workspace** (2+ subpastas com `.git`): `./central-docs`, com `central-docs/` no `.gitignore` do workspace;
721
- - **projeto único** (só a raiz tem `.git`): `docs/jarvis/central-docs`, já coberto por `docs/jarvis/` no `.gitignore`.
723
+ - **`WORKSPACE_MODE=workspace`** (a raiz não é repositório e há 1+ subpastas com `.git`): `./central-docs`, com `central-docs/` no `.gitignore` do workspace;
724
+ - **`WORKSPACE_MODE=project`** (a raiz tem `.git`): `docs/jarvis/central-docs`, já coberto por `docs/jarvis/` no `.gitignore`.
722
725
  - **A:** `mkdir -p {LOCATION}` e criar `{LOCATION}/AGENTS.md` mínimo, explicando:
723
726
  - a estrutura `{SQUAD}/product/{produto}/feature-*.md` e `{SQUAD}/engineering/{produto}/delivery-*.md`;
724
727
  - que o `{SQUAD}/index.md` é gerado pelo `jarvis docs publish`.
@@ -762,6 +765,7 @@ O arquivo `$IDE/ENV.md` deve seguir a **estrutura e ordem** de `templates/ENV-te
762
765
  # --- Workspace e identidade ---
763
766
  WORKSPACE=
764
767
  WORKSPACE_REPOS=
768
+ WORKSPACE_MODE={workspace|project}
765
769
  USER={resolvido}
766
770
  MAX_AI_EXECUTION_PERCENTAGE={60-100}
767
771
  ENABLE_CDD=true
@@ -1437,7 +1441,7 @@ Bem-vindo! 🎉
1437
1441
  ### Regras Aplicáveis
1438
1442
 
1439
1443
  - **Idioma**: Todos os arquivos `.md` gerados devem ser em português do Brasil (pt-BR)
1440
- - **Detecção de IDE**: A variável `$IDE` é detectada automaticamente (`.windsurf/`, `.claude/`, `.cursor/`, `.codex/`, `.opencode/`, `.gemini/`)
1444
+ - **Detecção de IDE**: A variável `$IDE` é detectada automaticamente (`.windsurf/`, `.claude/`, `.cursor/`, `.codex/`, `.opencode/`, `.agents/`)
1441
1445
  - **Nunca inventar dados**: Se informação não estiver disponível, perguntar ao usuário
1442
1446
  - **Nunca expor credenciais**: Tokens e senhas nunca devem ser expostos no chat
1443
1447
  - **MAX_AI_EXECUTION_PERCENTAGE**:
@@ -96,7 +96,7 @@ Pergunte: **"Quer registrar alguma delas agora?"** Se sim, registre pelo 9.6 e s
96
96
  **Quais projetos analisar:**
97
97
 
98
98
  1. `WORKSPACE_REPOS` do `ENV.md`, quando preenchido
99
- 2. Vazio: a raiz do workspace e as **subpastas com `.git/`**
99
+ 2. Vazio: com `WORKSPACE_MODE=workspace`, só as **subpastas com `.git/`** (a raiz não é repositório e guarda `$IDE/`, `.jarvis/` e outros itens fora do git); com `project`, a raiz
100
100
  3. Monorepos sem `.git` por pacote: procure manifestos **até 2 níveis** de profundidade
101
101
 
102
102
  **Ignore sempre** `node_modules`, `vendor`, `.git` e pastas de build.
@@ -146,9 +146,9 @@ elif [ -d ".codex" ]; then
146
146
  elif [ -d ".opencode" ]; then
147
147
  echo "IDE: OpenCode"
148
148
  echo "Pasta: .opencode/"
149
- elif [ -d ".gemini" ]; then
149
+ elif [ -d ".agents" ]; then
150
150
  echo "IDE: Gemini CLI / Antigravity"
151
- echo "Pasta: .gemini/"
151
+ echo "Pasta: .agents/"
152
152
  fi
153
153
  ```
154
154
 
@@ -161,7 +161,7 @@ fi
161
161
  | Cursor | `.cursor/` | `~/.cursor/mcp.json` |
162
162
  | Codex (OpenAI) | `.codex/` | - |
163
163
  | OpenCode | `.opencode/` | - |
164
- | Gemini CLI / Antigravity | `.gemini/` | - |
164
+ | Gemini CLI / Antigravity | `.agents/` | - |
165
165
 
166
166
  Windsurf / Claude Code / Cursor / Codex / OpenCode / Gemini
167
167
 
@@ -11,20 +11,24 @@
11
11
  # Workspace = a pasta que contém $IDE/. Não é o nome de um repo.
12
12
  # Vazio: o CLI usa o nome dessa pasta. Preencha só se quiser outro slug.
13
13
  #
14
- # meu-app/ ← um git aqui
14
+ # meu-app/ ← a raiz é um repositório (WORKSPACE_MODE=project)
15
15
  # ├── .windsurf/ENV.md
16
16
  # ├── .jarvis/sessions/
17
17
  # └── .git/
18
18
  #
19
- # workspace-squad/ ← vários gits nas subpastas
20
- # ├── .windsurf/ENV.md
19
+ # workspace-squad/ ← a raiz NÃO é repositório; 1 ou mais subpastas com .git
20
+ # ├── .windsurf/ENV.md (WORKSPACE_MODE=workspace)
21
21
  # ├── .jarvis/sessions/
22
22
  # ├── repo-api-1/
23
23
  # └── repo-frontend/
24
24
  #
25
25
  # WORKSPACE_REPOS = allowlist opcional. Vazio = todas as subpastas com .git/.
26
+ # WORKSPACE_MODE = workspace | project (detectado pelo /jarvis-init e pelo upgrade).
27
+ # workspace: a raiz não tem .git e há 1+ subpastas com .git/ (não depende do número de repos).
28
+ # project: a raiz tem .git. O git já delimita o que é código.
26
29
  WORKSPACE=
27
30
  WORKSPACE_REPOS=
31
+ WORKSPACE_MODE=
28
32
  USER=
29
33
 
30
34
  # Limite de autonomia da IA neste workspace (60–100). 80 = a IA executa até 80%.
@@ -9,7 +9,7 @@ task_key: {TASK-123}
9
9
  # URL do card no task manager (padrão da eng.integrations-rules.md). Vazio no modo freelance.
10
10
  card_url: {URL}
11
11
 
12
- # Pull/Merge Request aberto: número e URL. O daily.md só existe com PR aberto.
12
+ # Pull/Merge Request aberto: número e URL. Vazio se o PR ainda não foi aberto (o daily.md é gerado mesmo assim).
13
13
  pr: {#n URL}
14
14
 
15
15
  # Branch de trabalho e branch base (Branch base: do architecture.md).
@@ -165,10 +165,10 @@ CONTEXT_PROFILE:
165
165
 
166
166
  ### Fase 4: Validação
167
167
 
168
- 1. **Apresentar** o plano ao humano
168
+ 1. **Apresentar** o plano ao humano, com o consolidado de links da sessão (regra 5 de `eng.transitions-rules.md`: `context.md`, `architecture.md` e o `plan.md` novo)
169
169
  2. **Discutir** ajustes necessários
170
170
  3. **Atualizar** `architecture.md` se houver mudanças arquiteturais
171
- 4. **Confirmar** antes de prosseguir, com a pergunta de transição (`eng.transitions-rules.md`): **"Aprovar o plan.md?"** → **Aprovar e parar aqui (como hoje)** / **Aprovar e seguir para o `/eng.work`** / **Ajustar o plano**. Com "seguir", chame o `/eng.work {TASK_MANAGER_KEY}` (ou mostre o comando)
171
+ 4. **Confirmar** antes de prosseguir, com a pergunta de transição (`eng.transitions-rules.md`): **"O que fazer com o plano?"** (depois da mensagem em markdown com o consolidado de links) → **Aprovar e implementar agora** (chame o `/eng.work {TASK_MANAGER_KEY}`, ou mostre o comando) / **Aprovar e seguir manualmente (como hoje)** (o comando termina e o usuário chama o `/eng.work` quando quiser) / **Ajustar o plano** (o usuário diz o que mudar; atualize o `plan.md` e mostre de novo). As duas aprovações valem como a aprovação explícita do plano
172
172
 
173
173
  ---
174
174
 
@@ -44,8 +44,8 @@ Este comando cria a **branch, commita as alterações e abre um Merge Request**.
44
44
  | Fase 1 › 1.4 Executar Testes Automatizados (Opcional) | `/eng-qa` + `QA_SPECIALIZATIONS` | Passo opcional, recomendado em mudanças significativas |
45
45
  | Skills recomendados | `/eng-global-docs-write` | Se houver necessidade de atualizar documentação junto do PR |
46
46
  | Agentes recomendados (opcional) | `eng.qa.test-planner` (agente) | Se houver dúvidas sobre cobertura de testes ou mudanças significativas |
47
- | Fase 4 › 4.4 Criar MR/PR via adapter | `jarvis vcs create-merge` (CLI do Jarvis) | Só se o usuário responder **Sim** na Fase 4.3: abre o MR/PR conforme `VERSION_CONTROL` ou o host do `origin` |
48
- | Fase 5 › 5.2 Link do MR | `/eng-global-task-comment` | Depois de o MR ser criado (só com o Sim da 4.3): um único comentário no card com o link do MR, seguindo o Passo 6 do skill `eng-global-pr` (freelance pula) |
47
+ | Fase 4 › 4.4 Criar MR/PR via adapter | `jarvis vcs create-merge` (CLI do Jarvis) | Só se a escolha da Fase 0 for publicar (4.3): abre o MR/PR conforme `VERSION_CONTROL` ou o host do `origin` |
48
+ | Fase 5 › 5.2 Link do MR | `/eng-global-task-comment` | Depois de o MR ser criado (só ao publicar, 4.3): um único comentário no card com o link do MR, seguindo o Passo 6 do skill `eng-global-pr` (freelance pula) |
49
49
 
50
50
  ---
51
51
 
@@ -67,11 +67,12 @@ Ler `TASK_MANAGER` do `$IDE/ENV.md`. Seguir `$IDE/rules/engineering/eng.integrat
67
67
 
68
68
  ---
69
69
 
70
- ## Fase 0: Como validar o PR (`eng.transitions-rules.md`)
70
+ ## Fase 0: O que fazer com o PR (`eng.transitions-rules.md`)
71
71
 
72
- Pergunte com `AskUserQuestion`: **"Como validar o PR?"**
73
- - **Revisar o texto e confirmar a publicação aqui (como hoje):** segue as Fases 4.2 e 4.3.
74
- - **Publicar direto e validar no PR:** gera o `pull-request.md` na sessão (4.1) e publica sem a revisão do texto (4.2) e sem a pergunta "Publicar o PR agora?" (4.3); você valida no próprio PR.
72
+ Pergunte com `AskUserQuestion`: **"O que fazer com o PR?"**
73
+ - **Revisar o texto e publicar (como hoje):** gera o `pull-request.md`, você aprova ou ajusta (4.2) e, com a aprovação, faz o push e abre o PR (4.4). A aprovação do texto é a confirmação da publicação.
74
+ - **Publicar sem revisar o texto:** gera o `pull-request.md` (4.1), faz o push e abre o PR (4.4) sem a revisão (4.2); você ajusta o texto direto no PR.
75
+ - **Só gerar os arquivos:** gera o `pull-request.md` (4.1), mostra para revisão (4.2) e não faz push nem abre o PR; você abre à mão. A Fase 7 gera o `daily.md` mesmo assim.
75
76
 
76
77
  ## Fase 1: Validação Pré-PR
77
78
 
@@ -163,7 +164,7 @@ Refs: {TASK_MANAGER_KEY}"
163
164
 
164
165
  ## Fase 3: Push
165
166
 
166
- > ⚠️ O push só acontece **depois do Sim** da Fase 4.3. Esta fase descreve o comando; ele roda dentro da publicação.
167
+ > ⚠️ O push só acontece **depois da escolha de publicar** (Fase 0 e 4.3). Esta fase descreve o comando; ele roda dentro da publicação.
167
168
 
168
169
  ### 3.0 Conferir marcas de IA (só com `ARTIFACT_STYLE=human-generated`)
169
170
 
@@ -232,14 +233,14 @@ Preencher com a tarefa. Link do card:
232
233
 
233
234
  ### 4.2 Revisão do texto
234
235
 
235
- Mostre o `pull-request.md` (título e resumo das seções) e pergunte com `AskUserQuestion`: `[Aprovar]` / `[Ajustar]`. Ajuste até a aprovação. (Pule com "Publicar direto e validar no PR" na Fase 0.)
236
+ Mostre o consolidado de links da sessão (regra 5 de `eng.transitions-rules.md`, com o `pull-request.md` novo), o título e o resumo das seções e pergunte com `AskUserQuestion` (depois da mensagem com o consolidado de links): `[Aprovar]` / `[Ajustar]`. Ajuste até a aprovação. (Pulada com "Publicar sem revisar o texto" na Fase 0.)
236
237
 
237
- ### 4.3 Publicar? (Sim / Não)
238
+ ### 4.3 Publicar ou não (sem pergunta nova)
238
239
 
239
- Pergunte com `AskUserQuestion` (**Sim / Não**): **"Publicar o PR agora?"** (Com "Publicar direto e validar no PR" na Fase 0, vale como Sim.)
240
+ A decisão já veio da Fase 0; não pergunte de novo. Aprovado o texto na 4.2, siga a escolha:
240
241
 
241
- - **Não:** nada é enviado. O `pull-request.md` fica na sessão para você publicar quando quiser (à mão ou rodando o `/eng.pr` de novo). Pule para a Fase 7 (sem `daily.md`, que só existe com PR aberto), com a mensagem "PR não publicado".
242
- - **Sim:** faça o push (Fase 3) e crie o MR/PR (4.4).
242
+ - **Só gerar os arquivos:** nada é enviado. O `pull-request.md` fica na sessão para você publicar quando quiser (à mão ou rodando o `/eng.pr` de novo). Pule para a Fase 7, que gera o `daily.md` mesmo assim (para não passar batido quando você abrir o PR à mão), com a mensagem "PR não publicado".
243
+ - **Revisar o texto e publicar** ou **Publicar sem revisar o texto:** faça o push (Fase 3) e crie o MR/PR (4.4).
243
244
 
244
245
  ### 4.4 Criar MR/PR via adapter
245
246
 
@@ -354,7 +355,7 @@ fi
354
355
 
355
356
  Regras em `$IDE/rules-on-demand/engineering/eng.pr-rules.md` (seção "daily.md"); template em `$IDE/templates/engineering/daily-template.md`. Arquivo: `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/daily.md`, **só na sessão, nunca publicado**.
356
357
 
357
- 1. **Há PR aberto?** Vale o criado na 4.4 ou o PR da branch que já existe e está aberto (CLI/adapter do vendor, ex.: `gh pr view --json state,number,url`). Sem PR aberto (Não na 4.3 e nenhum PR existente), **não gere** o `daily.md` e siga para a 7.3. Se não for possível confirmar, pergunte.
358
+ 1. **Gere sempre**, com ou sem PR publicado: quem abre o PR à mão ("Só gerar os arquivos" na Fase 0) também precisa do registro, e é aí que ele costuma passar batido. Se houver PR (o criado na 4.4 ou o PR já aberto da branch, via CLI/adapter do vendor, ex.: `gh pr view --json state,number,url`), preencha o campo `pr`; sem PR, deixe-o vazio e atualize quando o PR for aberto.
358
359
  2. **Data:** pergunte com `AskUserQuestion`: **"Registrar o esforço com qual data?"** → `Hoje ({AAAA-MM-DD})` | `Outra data` (o usuário digita `AAAA-MM-DD`).
359
360
  3. **Dias trabalhados** (só se o período entre a data do `.timestamp_start` e a data do registro tiver mais de um dia), uma pergunta por vez:
360
361
  - se o período tiver sábado ou domingo: **"Você trabalhou em {datas de sábado/domingo}?"** (Sim / Não; com várias datas, pode responder por data);
@@ -375,7 +376,7 @@ Regras em `$IDE/rules-on-demand/engineering/eng.pr-rules.md` (seção "daily.md"
375
376
  - **Descrição:** um parágrafo narrativo (contexto técnico, trabalho realizado, decisões), mais o *post mortem* quando couber (problema e causa raiz, investigação, solução/direcionamento), com detalhe suficiente para embasar questionamentos futuros.
376
377
  - **Timesheet:** **uma única linha** (`{TASK_KEY} — {resumo}`).
377
378
  - Sem e-mails, tokens nem valores de variáveis.
378
- 7. **Revisão conjunta:** mostre a descrição e a linha de timesheet **juntas** e pergunte com `AskUserQuestion`: `[Aprovar]` / `[Ajustar]`. Com Ajustar, aplique os ajustes pontuais **nas duas** e mostre de novo, até aprovar.
379
+ 7. **Revisão conjunta:** mostre a descrição e a linha de timesheet **juntas** e pergunte com `AskUserQuestion` (depois da mensagem com o consolidado de links, com o `daily.md` novo): `[Aprovar]` / `[Ajustar]`. Com Ajustar, aplique os ajustes pontuais **nas duas** e mostre de novo, até aprovar.
379
380
 
380
381
  ### 7.3 Mensagem Final
381
382
 
@@ -394,7 +395,13 @@ Regras em `$IDE/rules-on-demand/engineering/eng.pr-rules.md` (seção "daily.md"
394
395
 
395
396
  {LEAD_TIME_MSG}
396
397
 
397
- 📝 Daily: $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/daily.md
398
+ 📄 Arquivos da sessão (consolidado acumulado, regra 5 de `eng.transitions-rules.md`; só os que existem):
399
+ - [context.md]({caminho relativo}) ({nota de estado})
400
+ - [architecture.md]({caminho relativo}) ({nota de estado})
401
+ - [plan.md]({caminho relativo}) ({nota de estado})
402
+ - [gate-checklist.md]({caminho relativo}) ({nota de estado}) ← se o `eng.pre-pr` rodou
403
+ - [pull-request.md]({caminho relativo}) (novo; {publicado como PR #N | gerado, PR não publicado})
404
+ - [daily.md]({caminho relativo}) (novo; {aprovado, com timesheet})
398
405
  🕒 Timesheet: {LINHA_DE_TIMESHEET_APROVADA}
399
406
 
400
407
  📌 Próximos passos:
@@ -410,7 +417,11 @@ Regras em `$IDE/rules-on-demand/engineering/eng.pr-rules.md` (seção "daily.md"
410
417
  - Jira: {TASK_MANAGER_URL_BASE}/browse/{TASK_MANAGER_KEY}
411
418
  ```
412
419
 
413
- ### 7.4 PR mergeado? (`eng.transitions-rules.md`)
420
+ ### 7.4 Versões humanizadas (só com `ARTIFACT_STYLE=human-generated`)
421
+
422
+ Pergunte uma vez, com `AskUserQuestion` de várias perguntas em abas (`rules/artifact-style-rules.md`, regra 2), uma aba por documento da sessão que existir: `architecture.md`, `plan.md`, `gate-checklist.md` e `daily.md` (o `pull-request.md` não entra: já é público). Cada aba: **"Gerar a versão humanizada de {documento}?"** → **Não (como hoje)** / **Sim**. Com Sim, grave `{nome}.public.md` ao lado do original, seguindo o checklist da regra, e mostre o link. Com outro `ARTIFACT_STYLE`, pule esta etapa.
423
+
424
+ ### 7.5 PR mergeado? (`eng.transitions-rules.md`)
414
425
 
415
426
  Pergunte com `AskUserQuestion`: **"O PR já foi aprovado e mergeado?"**
416
427
  - **Ainda não (como hoje):** encerre com a mensagem acima.
@@ -434,7 +445,7 @@ Pergunte com `AskUserQuestion`: **"O PR já foi aprovado e mergeado?"**
434
445
  - ✅ Criar branch no padrão `{TASK_MANAGER_KEY}-{titulo}`
435
446
  - ✅ Preencher template do MR completamente
436
447
  - ✅ Mover card para "In Review"
437
- - ✅ Gerar o `pull-request.md` na sessão e só publicar com o **Sim** (Fase 4.3)
448
+ - ✅ Gerar o `pull-request.md` na sessão e só publicar com a escolha de publicar da Fase 0 (4.3)
438
449
  - ✅ Com PR aberto, registrar o esforço no `daily.md` (7.2), com revisão conjunta da descrição e do timesheet
439
450
  - ✅ **Nunca apagar a sessão:** o `/eng.spec-consolidate` precisa dela
440
451
 
@@ -52,7 +52,7 @@ Antes de abrir o PR/MR, este comando **revê a branch atrás de possíveis lacun
52
52
  | Gates › item 8 | `eng.ux-designer.agent` (agente) | Se a branch introduzir nova feature de UI ou alterar fluxo de usuário |
53
53
  | Gates › item 9 | `eng.docs-writer` (agente) | Sempre — apontar documentação do projeto desatualizada (sem editar) |
54
54
  | Gates › item 10 | Nenhuma — checklist inline | Se a branch tocar em auth, sessions, inputs de usuário, CORS, CSP, permissões ou adicionar endpoints públicos |
55
- | Publicação do relatório | `/eng-global-task-comment` | Só se o usuário responder **Sim** no fim: o `gate-checklist.md` com as decisões vira um comentário na issue/card (freelance pula) |
55
+ | Publicação do relatório | `/eng-global-task-comment` | Só se o usuário escolher um dos **Sim** no fim: o resumo ou o `gate-checklist.md` completo, com as decisões, vira um comentário na issue/card (freelance pula, sem perguntar) |
56
56
 
57
57
  ## Regras de Execução
58
58
 
@@ -91,7 +91,7 @@ Grave em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/gate-checklist.md`:
91
91
 
92
92
  | # | Lacuna | Onde | Por que importa | Sugestão | Severidade | Decisão |
93
93
  |---|---|---|---|---|---|---|
94
- | 1 | {o que falta ou está errado} | `{arquivo:linha}` | {impacto, em linguagem simples} | {como resolver} | 🔴 Bloqueador / 🟡 Importante / ⚪ Menor | {Ajustar \| Não ajustar: motivo} |
94
+ | 1 | {o que falta ou está errado} | `{arquivo:linha}` | {impacto, em linguagem simples} | {como resolver} | 🔴 Bloqueador / 🟡 Importante / ⚪ Menor | {Corrigir \| Aceitar: motivo} |
95
95
 
96
96
  (uma tabela por área; área sem lacuna: "Nenhuma lacuna encontrada.")
97
97
 
@@ -108,9 +108,21 @@ A coluna **Decisão** nasce vazia: quem preenche é o usuário.
108
108
 
109
109
  ## Fechamento
110
110
 
111
- 1. Mostre o semáforo, o resumo e a lista de lacunas por severidade, com o caminho do `gate-checklist.md`.
112
- 2. Peça as decisões: para cada lacuna 🔴 e 🟡, "Ajustar" ou "Não ajustar" (com o motivo). Use `AskUserQuestion` por lacuna quando houver poucas; com muitas, deixe a pessoa responder em texto ou editar o arquivo. Grave as decisões na coluna **Decisão**.
113
- 3. Pergunte com `AskUserQuestion` (**Sim / Não**, sempre, nunca publicar sem a resposta): **"Publicar o gate-checklist.md (com as decisões) como comentário na issue/card?"**
114
- - **Sim** (e `TASK_MANAGER` preenchido): `/eng-global-task-comment {TASK_MANAGER_KEY}` com o conteúdo do arquivo.
115
- - **Não**, ou modo freelance: fica só na sessão.
116
- 4. Próximo passo: ajustar o que foi marcado "Ajustar" (à mão ou com o `/eng.work`) e rodar o `/eng.pr`, que usa o PR Brief deste relatório. Pergunte com `AskUserQuestion` (`eng.transitions-rules.md`): **"Seguir para o `/eng.pr`?"** → **Parar aqui para ajustar (como hoje)** / **Seguir para o `/eng.pr`**. Com lacuna marcada "Ajustar", deixe isso claro na opção de seguir ("Seguir mesmo com {n} lacunas a ajustar"). Com "Seguir", chame o `/eng.pr {TASK_MANAGER_KEY}` (ou mostre o comando).
111
+ 1. Mostre o semáforo, o resumo e a lista de lacunas por severidade, com o consolidado de links da sessão (regra 5 de `eng.transitions-rules.md`: tudo o que já existe, com o `gate-checklist.md` novo).
112
+ 2. Peça as decisões com `AskUserQuestion`, depois da mensagem em markdown do passo 1 (com o link clicável): **"O que fazer com as {n} lacunas encontradas ({a} 🔴 bloqueadoras, {b} 🟡 importantes)? Relatório: gate-checklist.md."**
113
+ - **Corrigir todas antes do PR:** marca as {n} como "Corrigir"; você corrige à mão ou com o `/eng.work`.
114
+ - **Corrigir só as bloqueadoras 🔴:** marca as {a} 🔴 como "Corrigir"; as 🟡 ficam "Aceitar", com um motivo só, pedido uma vez.
115
+ - **Decidir uma a uma:** mostra cada lacuna 🔴 e 🟡 e você escolhe "Corrigir" ou "Aceitar" (com o motivo), com `AskUserQuestion` por lacuna.
116
+ - **Só gerar o relatório (vou analisar com calma):** não registra decisão agora; a coluna **Decisão** fica vazia, o `gate-checklist.md` fica na sessão para você analisar e o comando termina sem as perguntas 3 e 4. Rode o `/eng.pre-pr` de novo, ou preencha o arquivo à mão, quando decidir.
117
+
118
+ Grave as decisões na coluna **Decisão** como `Corrigir` ou `Aceitar: motivo`.
119
+ 3. **Modo freelance (`TASK_MANAGER` vazio):** não pergunte; o relatório fica só na sessão. **Com board**, pergunte com `AskUserQuestion` (nunca publique sem a resposta): **"Registrar o resultado do `/eng.pre-pr` como comentário no card {TASK_MANAGER_KEY}?"**
120
+ - **Não, manter só na sessão (como hoje):** nada é enviado ao card.
121
+ - **Sim, só o resumo:** `/eng-global-task-comment {TASK_MANAGER_KEY}` com o semáforo, o resumo e as lacunas 🔴 com a decisão de cada uma.
122
+ - **Sim, o relatório completo:** `/eng-global-task-comment {TASK_MANAGER_KEY}` com o conteúdo do `gate-checklist.md`.
123
+ 4. Próximo passo: corrigir o que foi marcado "Corrigir" (à mão ou com o `/eng.work`) e rodar o `/eng.pr`, que usa o PR Brief deste relatório. Antes, escreva uma mensagem em markdown com o consolidado de links da sessão (regra 5) e o resumo; depois pergunte com `AskUserQuestion` (`eng.transitions-rules.md`):
124
+ - **Com {n} lacunas marcadas "Corrigir"** — **"O `/eng.pre-pr` encontrou {n} lacunas a corrigir ({a} 🔴, {b} 🟡). Leia o gate-checklist.md com calma e responda quando decidir. Como seguir?"**
125
+ - **Corrigir as lacunas agora:** chame o `/eng.work {TASK_MANAGER_KEY}` para as {n} lacunas (ou mostre o comando).
126
+ - **Parar aqui para corrigir à mão (como hoje):** o comando termina.
127
+ - **Abrir o PR assim mesmo:** chame o `/eng.pr {TASK_MANAGER_KEY}`; as {n} pendências seguem registradas no PR Brief.
128
+ - **Sem lacunas a corrigir** — **"Relatório sem lacunas a corrigir (gate-checklist.md). Como seguir?"**: **Abrir o PR agora** (chame o `/eng.pr {TASK_MANAGER_KEY}`) / **Parar aqui (como hoje)**.
@@ -10,6 +10,8 @@ model_justification: Consolidar exige ler e cruzar muitas fontes (documentos, de
10
10
 
11
11
  # Consolidar no Central docs
12
12
 
13
+ > 🔀 **Consolidado de links**: na mensagem final (Passo 7), siga a regra 5 de `$IDE/rules-on-demand/engineering/eng.transitions-rules.md`: liste, como links clicáveis, todos os arquivos da sessão que já existem.
14
+
13
15
  Este comando registra no **Central docs** o que a entrega **de fato implementou**. Ele roda **depois do merge do PR** (o `/eng.pr` pergunta no fim se o PR já foi mergeado e oferece chamá-lo) e gera dois documentos completos e autossuficientes:
14
16
  - o **documento da funcionalidade** (`feature-{slug}.md`), com o estado atual, novo ou atualizado;
15
17
  - o **registro da entrega** (`delivery-{AAAA-MM-DD}-{task_key}.md`), com o PR, os commits e os autores.
@@ -117,6 +119,8 @@ Com `ARTIFACT_STYLE=human-generated`, a versão humanizada (`{nome}.public.md`)
117
119
  ```
118
120
  ✅ Consolidação {publicada | salva na sessão}
119
121
 
122
+ 📄 Arquivos da sessão (consolidado acumulado, regra 5 de `eng.transitions-rules.md`): links de `context.md`, `architecture.md`, `plan.md`, `gate-checklist.md`, `pull-request.md`, `daily.md` e dos arquivos de `consolidation/` (novos), só os que existem
123
+
120
124
  📄 Funcionalidade: {SQUAD}/product/{produto}/feature-{slug}.md
121
125
  🧾 Entrega: {SQUAD}/engineering/{produto}/delivery-{AAAA-MM-DD}-{task_key}.md
122
126
  🔗 PR/MR: {URL} · Card: {URL ou número}
@@ -288,6 +288,8 @@ Use ferramentas de busca para entender o código existente:
288
288
  - **Grep**: Buscar padrões e implementações similares
289
289
  - **Read**: Analisar arquivos críticos que serão impactados
290
290
 
291
+ Com `WORKSPACE_MODE=workspace`, busque só nos repositórios do workspace e siga a regra "Buscas de código em modo workspace" de `eng-rules.md` (ignora `$IDE/`, `.jarvis/`, `.vscode/`, `node_modules/` e o `CDD-MIND-MAP.md`; `docs/jarvis/` é lida como documento de trabalho).
292
+
291
293
  ### 3.2 Documentação Existente
292
294
 
293
295
  Verifique:
@@ -412,7 +414,7 @@ Apresente:
412
414
  1. Resumo do que foi documentado
413
415
  2. Principais decisões arquiteturais
414
416
  3. Riscos identificados
415
- 4. Link para o arquivo criado
417
+ 4. Consolidado de links da sessão (regra 5 de `eng.transitions-rules.md`): `context.md` (novo; tipo e autonomia) e `architecture.md` (novo; quantas questões em aberto) e o aquecimento consumido, se houver, cada um com a nota de estado, mais os links do card/issue
416
418
 
417
419
  ### 5.2 Iteração
418
420
 
@@ -422,7 +424,7 @@ Se o usuário tiver feedback:
422
424
  - Apresente novamente
423
425
  - Continue até aprovação explícita
424
426
 
425
- **Sem Advisor**, a aprovação é a pergunta de transição (`eng.transitions-rules.md`): **"Aprovar o architecture.md?"** → **Aprovar e parar aqui (como hoje)** / **Aprovar e seguir para o `/eng.plan`** / **Ajustar o documento**. Com "seguir", chame o `/eng.plan {TASK_MANAGER_KEY}` (ou mostre o comando).
427
+ **Sem Advisor**, a aprovação é a pergunta de transição (`eng.transitions-rules.md`): **"Aprovar o architecture.md?"** (depois da mensagem em markdown com o link clicável do arquivo) → **Aprovar e parar aqui (como hoje)** / **Aprovar e seguir para o `/eng.plan`** / **Ajustar o documento**. Com "seguir", chame o `/eng.plan {TASK_MANAGER_KEY}` (ou mostre o comando).
426
428
  **Com Advisor**, o gate segue a autonomia do `context.md` (CDD): `alta` → apresente o resumo e siga para o `eng.plan` sem aguardar; `média` ou `baixa` → aguarde a aprovação explícita. Sem `context.md`, use a tabela "Autonomia por POSITION" de `eng-rules.md`. Sem Advisor, nada muda.
427
429
 
428
430
  ### 5.3 Atualizar Board
@@ -178,7 +178,7 @@ Pergunte com `AskUserQuestion`, uma pergunta por decisão (padrão primeiro):
178
178
  |---|---|
179
179
  | **Execução das fases** | **Fase a fase, com aprovação (como hoje)** / **Todas de uma vez** (mostre "N de M tarefas", com N pelo limite `MAX_AI_EXECUTION_PERCENTAGE` abaixo) |
180
180
  | **Commits** | **Um por fase (como hoje)** / **Um commit só ao final** |
181
- | **Depois do work** | **Sugerir o `/eng.pre-pr` (como hoje)** / **Rodar o `/eng.pre-pr` na sequência** / **Ir direto para o `/eng.pr`** / **Parar aqui** |
181
+ | **Depois do work** | **Rodar o `/eng.pre-pr`** / **Rodar o `/eng.pr`** (sem o `/eng.pre-pr`) / **Fluxo normal (como hoje)** (só a mensagem final; o usuário segue os próximos comandos manualmente) |
182
182
 
183
183
  - Grave as escolhas no cabeçalho do `plan.md` (`Execução:`, `Commits:`, `Depois do work:`). Retomada com escolhas já gravadas: uma pergunta só, **"Manter as escolhas ({resumo})?"** (Manter / Mudar).
184
184
  - **Em qualquer escolha**, o limite de execução, um teste falhando e uma questão nova em aberto **param** a execução e voltam a perguntar.
@@ -503,7 +503,7 @@ Refs: TASK-123"
503
503
  🎉 TODAS AS FASES CONCLUÍDAS!
504
504
 
505
505
  📁 Sessão: $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/
506
- 📄 Plan atualizado: plan.md ✅
506
+ 📄 Arquivos da sessão (consolidado acumulado, regra 5 de `eng.transitions-rules.md`): links de `context.md`, `architecture.md` e `plan.md` (atualizado, com comentários por fase; quantas fases concluídas), cada um com a nota de estado, mais os links do card/issue
507
507
  🌿 Branch: {TASK_MANAGER_KEY}-{titulo} — {N} commits realizados
508
508
 
509
509
  📊 Resumo:
@@ -521,7 +521,7 @@ Refs: TASK-123"
521
521
  ⚠️ LEMBRETE: push e PR são responsabilidade do `eng.pr`.
522
522
  ```
523
523
 
524
- Depois da mensagem, siga a escolha **Depois do work**: sugerir o `/eng.pre-pr` (como hoje), chamar o `/eng.pre-pr {TASK_MANAGER_KEY}`, chamar o `/eng.pr {TASK_MANAGER_KEY}` ou parar (chamar = pelo Skill tool, ou mostrar o comando pronto na IDE que não permite).
524
+ Depois da mensagem, siga a escolha **Depois do work**: chamar o `/eng.pre-pr {TASK_MANAGER_KEY}`, chamar o `/eng.pr {TASK_MANAGER_KEY}`, fazer o que o usuário descreveu em texto livre (o "Outros" automático) ou, no **Fluxo normal (como hoje)**, só encerrar com a mensagem (chamar = pelo Skill tool, ou mostrar o comando pronto na IDE que não permite).
525
525
 
526
526
  ## Regras Importantes
527
527
 
@@ -533,7 +533,7 @@ Depois da mensagem, siga a escolha **Depois do work**: sugerir o `/eng.pre-pr` (
533
533
  - ❌ NÃO commite sem aprovação explícita do usuário na fase (a escolha "Todas de uma vez" da 1.3 é essa aprovação)
534
534
  - ❌ NÃO commite com testes falhando
535
535
  - ❌ NÃO mova cards no Jira
536
- - ❌ NÃO sugira "vamos fazer o PR agora" (salvo a escolha "Ir direto para o `/eng.pr`" da 1.3)
536
+ - ❌ NÃO sugira "vamos fazer o PR agora" (salvo a escolha "Rodar o `/eng.pr`" da 1.3)
537
537
 
538
538
  ### ✅ FAÇA SEMPRE
539
539
 
@@ -28,7 +28,7 @@ As rules já estão no contexto da sessão: **não as releia**. Perfil de comuni
28
28
  ## Passo 1 — Perfil (silencioso)
29
29
 
30
30
  ```bash
31
- grep -E "^(POSITION|AREA|HUB|SQUAD|WORKSPACE|WORKSPACE_REPOS|PROD_MODE|ENABLE_CDD|CENTRAL_DOCS_STORAGE|[A-Z]+_SPECIALIZATIONS)=" $IDE/ENV.md
31
+ grep -E "^(POSITION|AREA|HUB|SQUAD|WORKSPACE|WORKSPACE_REPOS|WORKSPACE_MODE|PROD_MODE|ENABLE_CDD|CENTRAL_DOCS_STORAGE|[A-Z]+_SPECIALIZATIONS)=" $IDE/ENV.md
32
32
  ```
33
33
 
34
34
  `$IDE/ENV.md` pode estar num ancestral do cwd. `WORKSPACE` vazio = nome da pasta que contém `$IDE/`. Não invente valores ausentes; não pergunte o que está no ENV.
@@ -37,7 +37,7 @@ grep -E "^(POSITION|AREA|HUB|SQUAD|WORKSPACE|WORKSPACE_REPOS|PROD_MODE|ENABLE_CD
37
37
 
38
38
  O mapa é o **contexto de workspace**: stack e papel de cada repositório. Fica na raiz do workspace (ao lado do `AGENTS.md`), fora do versionamento. Formato e instruções de preenchimento: `$IDE/templates/cdd-mind-map-template.md`.
39
39
 
40
- 1. **Repositórios do workspace:** os de `WORKSPACE_REPOS` ou, se vazia, as subpastas com `.git/`; só a raiz com `.git` = projeto único (uma linha).
40
+ 1. **Repositórios do workspace:** use o `WORKSPACE_MODE` do ENV. `workspace`: os de `WORKSPACE_REPOS` ou, se vazia, as subpastas com `.git/` (a raiz não é repositório, mesmo com uma subpasta só). `project`: a raiz, uma linha. Reconfira pelo critério (raiz com `.git` = `project`; raiz sem `.git` e 1+ subpastas com `.git/` = `workspace`) e, se o valor gravado divergir do detectado ou estiver ausente, avise e sugira `jarvis init --upgrade`, sem alterar o ENV. Nas buscas de código vale a regra "Buscas de código em modo workspace" de `eng-rules.md`.
41
41
  2. **Mapa não existe:** infira cada repositório pela tabela `$IDE/skills/jarvis-init/assets/sinais-de-stack.md` e pela estrutura (papel), mostre a tabela e pergunte com `AskUserQuestion`: **Confirmar** | **Corrigir** | **Incluir informação**. Repita até confirmar. Então:
42
42
  - grave `CDD-MIND-MAP.md` na raiz do workspace;
43
43
  - garanta a linha no `.gitignore`: `grep -qxF 'CDD-MIND-MAP.md' .gitignore 2>/dev/null || echo 'CDD-MIND-MAP.md' >> .gitignore`;