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.
- package/AGENTS.md +1 -1
- package/README.md +1 -1
- package/bin/commands/init.js +42 -2
- package/bin/lib/cli/program.js +5 -1
- package/bin/lib/config/constants.js +5 -0
- package/bin/lib/core/env-upgrade.js +14 -1
- package/bin/lib/core/stale-skills.js +63 -0
- package/bin/lib/core/workspace-mode.js +57 -0
- package/package.json +2 -2
- package/rules/artifact-style-rules.md +5 -3
- package/rules/engineering/eng-rules.md +12 -1
- package/rules/engineering/eng.integrations-rules.md +1 -1
- package/rules/product/prod-rules.md +2 -1
- package/rules-on-demand/engineering/eng.plan-rules.md +1 -1
- package/rules-on-demand/engineering/eng.pr-rules.md +3 -3
- package/rules-on-demand/engineering/eng.pre-pr-rules.md +2 -2
- package/rules-on-demand/engineering/eng.transitions-rules.md +16 -7
- package/rules-on-demand/engineering/eng.work-rules.md +1 -1
- package/skills/jarvis-create-specialization/SKILL.md +1 -1
- package/skills/jarvis-init/SKILL.md +10 -6
- package/skills/jarvis-init/assets/passo-adicionar-stacks.md +1 -1
- package/skills/jarvis-init/assets/setup-guide.md +3 -3
- package/templates/ENV-template.md +7 -3
- package/templates/engineering/daily-template.md +1 -1
- package/workflows/engineering/eng.plan.md +2 -2
- package/workflows/engineering/eng.pr.md +28 -17
- package/workflows/engineering/eng.pre-pr.md +20 -8
- package/workflows/engineering/eng.spec-consolidate.md +4 -0
- package/workflows/engineering/eng.start.md +4 -2
- package/workflows/engineering/eng.work.md +4 -4
- 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]
|
|
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
|
|
package/bin/commands/init.js
CHANGED
|
@@ -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
|
}
|
package/bin/lib/cli/program.js
CHANGED
|
@@ -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.
|
|
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`, `
|
|
23
|
-
-
|
|
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
|
|
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
|
-
- `.
|
|
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
|
|
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
|
-
- `.
|
|
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 "
|
|
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 (
|
|
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
|
|
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`, **
|
|
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 (
|
|
91
|
-
3. **Pergunta
|
|
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. **
|
|
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 | "
|
|
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 |
|
|
39
|
-
| `eng.pre-pr` | Fim | "
|
|
40
|
-
| `eng.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 "
|
|
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
|
-
-
|
|
355
|
-
-
|
|
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
|
-
-
|
|
721
|
-
-
|
|
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/`, `.
|
|
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:
|
|
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 ".
|
|
149
|
+
elif [ -d ".agents" ]; then
|
|
150
150
|
echo "IDE: Gemini CLI / Antigravity"
|
|
151
|
-
echo "Pasta: .
|
|
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 | `.
|
|
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
|
|
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/ ←
|
|
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.
|
|
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`): **"
|
|
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
|
|
48
|
-
| Fase 5 › 5.2 Link do MR | `/eng-global-task-comment` | Depois de o MR ser criado (só
|
|
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:
|
|
70
|
+
## Fase 0: O que fazer com o PR (`eng.transitions-rules.md`)
|
|
71
71
|
|
|
72
|
-
Pergunte com `AskUserQuestion`: **"
|
|
73
|
-
- **Revisar o texto e
|
|
74
|
-
- **Publicar
|
|
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
|
|
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`
|
|
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
|
|
238
|
+
### 4.3 Publicar ou não (sem pergunta nova)
|
|
238
239
|
|
|
239
|
-
|
|
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
|
-
- **
|
|
242
|
-
- **
|
|
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. **
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 | {
|
|
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
|
|
112
|
-
2. Peça as decisões
|
|
113
|
-
|
|
114
|
-
- **
|
|
115
|
-
- **
|
|
116
|
-
|
|
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.
|
|
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** | **
|
|
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
|
-
📄
|
|
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**:
|
|
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 "
|
|
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
|
|
package/workflows/warm-up.md
CHANGED
|
@@ -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
|
|
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`;
|